malloc pages map to user space

Eric Saint-Etienne eric.saintetienne at gmail.com
Wed Mar 21 23:28:29 UTC 2012


Hi,

>From within the freeBSD kernel, not all malloc are made equal:
	* malloc() smaller than KMEM_ZMAX (set to one page size) end up in
UMA SLABs, themselves laid out in powers of 2 (from 16 bytes, 32... to
4096 bytes)
	* bigger malloc() are done through uma_large_malloc() which uses the
kmem wired space

In my driver, I need to map some malloc-ed memory, obtained from
another module, into userspace.

The problem: on the smaller mallocs, as well as on some bigeer ones
(8k seems fine, 64k fails): vm_map_lookup() fails finding the
underlying vm object.

Do somebody know how (or better, have a piece of code!) to retrieve
the vm_object associated with malloc-ed memory? (small and big ones)

As far as I can see in the vm code, there isn't any object associated
with the slabs (the smaller mallocs), it seems that a huge chunk of
virtual space is used "as is", so I presume the virtual addresses
where the SLABs are have some remarkable property, with respect to
physical addresses, that could allow creating an object from scratch?

The usual answer is: use mmap(). It seems mmap() is the solution to
everything. But what I dislike with mmap() is the following cost *for
each page*:
	1/ a page fault
	2/ a call to a pager function that will do the "on demand" mapping.

Thank you.
Eric


More information about the freebsd-hackers mailing list