How to map a page with userland program?
jhb at freebsd.org
Fri Sep 15 13:44:43 PDT 2006
On Friday 15 September 2006 13:50, LI Xin wrote:
> John Baldwin wrote:
> > On Friday 15 September 2006 11:21, LI Xin wrote:
> >> John Baldwin wrote:
> >>> On Friday 15 September 2006 10:26, LI Xin wrote:
> >>>> Dear folks,
> >>>> Is there a continent and MI way to map a kernel page into userland
> >>>> address space under the same virtual address? It seems that this can be
> >>>> implemented through some routines in MD part of pmap, but is it possible
> >>>> to use higher level VM routines to do the job?
> >>> Not to the same userland virtual address. Why do you need the same
> >>> virtual address anyway? If it's for pointers use offsets relative to
> >>> the start of the page instead.
> >> That would make it easier to implement some sort of VSYSCALL, which is
> >> in fact executed in userland. Or, is there any better way? :-)
> > If you want to stick code in the page, make the code PIC, the same as is done
> > for shared libraries. Alternatively, if you wanted to be very, very evil and
> > can have the page read-only once it is initialized, flip the user/supervisor
> > bit in the kernel PTE for that page such that it is treated as a user page
> > rather than a kernel page (even though it's in KVA), and then userland
> > processes can access that page via it's kernel VA. Making the code PIC would
> > probably be better though.
> I see... So, what if I want to make some data available to userland?
> Is flipping the user/supervisor bit the only way?
Well, it's a quicker hack than the much more complicated way. Otherwise,
you have to make sure everyone agrees on the same address. Hmm, I suppose
actually you could just use a simple dummy device driver that creates a
/dev/foo and mmap it using MMAP_FIXED with your chosen userland virtual
address. Then in your driver you just need to malloc a page and use
vtophys() to get a phys_addr to hand back in your d_mmap() routine.
More information about the freebsd-arch