Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 20 May 2004 08:54:33 -0400 (EDT)
From:      Andrew Gallatin <gallatin@cs.duke.edu>
To:        Bruce M Simpson <bms@spc.org>
Cc:        hackers@freebsd.org
Subject:   Re: api for sharing memory from kernel to userspace?
Message-ID:  <16556.43657.379465.516798@grasshopper.cs.duke.edu>
In-Reply-To: <20040520101721.GB30196@empiric.dek.spc.org>
References:  <20040519122907.GO81341@elvis.mu.org> <200405192229.i4JMT95J087312@wattres.Watt.COM> <20040520101721.GB30196@empiric.dek.spc.org>

next in thread | previous in thread | raw e-mail | index | archive | help

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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?16556.43657.379465.516798>