api for sharing memory from kernel to userspace?
Andrew Gallatin
gallatin at cs.duke.edu
Thu May 20 05:54:59 PDT 2004
Bruce M Simpson writes:
> On Wed, May 19, 2004 at 03:29:09PM -0700, Steve Watt wrote:
> > >On Wed, May 19, 2004 at 05:29:07AM -0700, Alfred Perlstein wrote:
> > >+> I need to share about 100megs of memory between kernel and userspace.
> > >+>
> > >+> The memory can not be paged and should appear contig in the process's
> > >+> address space. Any suggestions?
> > >+>
> >
> > The way we accomplished this in some other operating system was to
> > create a shared memory segment with an implementation-reserved
> > name, and then have the application shm_open the name and mmap it in.
> >
> > Shouldn't be hard with a device driver.
>
> This sounds like the way to go.
>
> The way I achieved this with a PCMCIA memory card was to kmem_alloc_nofault()
> a range and then pmap_map() it, then handle mmap() as per the regular
> character device case.
Why not simply use malloc(9) to allocate the memory and then mmap() it
out via a normal character driver's mmap() routine?
> Do bear in mind that 100 megs is quite large in relative terms, so it's
> possible that kmem_alloc_nofault() would fail.
Speaking of this, is there any method that a driver can use to
allocate unmapped physical memory in the kernel? For a variety of
reasons, I need to allocate this memory in the kernel and mmap() it
out. It can not be paged out, and there can be a lot of it. I'm
currently using malloc(9), but I run into kmem size limits, and pmap
4MB page bugs on x86. I was thinking about just using
vm_page_alloc(..,VM_ALLOC_NOOBJ) and mmap'ing out the memory. Would
that work? Or could it still be paged?
Drew
More information about the freebsd-hackers
mailing list