linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* How do I share large portions of memory with "user land" ?
@ 2003-12-04 19:31 Tristan Van Berkom
  0 siblings, 0 replies; only message in thread
From: Tristan Van Berkom @ 2003-12-04 19:31 UTC (permalink / raw)
  To: linux-kernel

Hello all,
	This is one of those "How do I ..." questions
about writing a kernel module/driver.

My question is already well phrased and andswered in an
email archived from a few years ago:
	http://www.ussg.iu.edu/hypermail/linux/kernel/0005.2/0505.html

Andi > The traditional linux way is to implement mmap for
Andi > your character device, vmalloc the memory in kernel
Andi > and supply it to the user process via mmap.

That means (I'm not mistaken) that first you use vmalloc
to allocate a contiguous virtual memory region and suply a
`nopage' method (via mmap) which returns the physical page
coresponding to user's _and_ the module's virtual address
plane; that means that after mucking about with page tables
a while; you have two virtual contiguous memory regions
(one user/one kernel) that both access the same physical
scattered pages. ... ( ?? hmmm ??)

Andi > 2.3 and some patched 2.2 kernels also offer a way to do this
Andi > directly (usion kiovecs and map_user_kiobuf()). This is not in
Andi > standard 2.2 kernel though.

This approach basicly save's me from the `nopage' aspect
of the afore mentioned method; but I dont have a contiguous
memory region in kernel space; only in user land.

Linus > Basically, the way kio buffers work is that
Linus > they are 100% based on only physical pages. There are no virtual
Linus > issues at all in the IO, and that's exactly how I want it. There
Linus > is no reason to confuse virtual addresses into this, because the
Linus > thing should be usable even in the complete absense of virtual
Linus > mappings (ie the kernel can do direct IO purely based on pages -
Linus > think sendfile() etc).

After reading that (above quoted from...):
  (http://www.ussg.iu.edu/hypermail/linux/kernel/0010.2/0338.html)
I can understand why.

So If I have a collection of physical pages in a kio buffer
is there a way to create a contigous virtual memory region out
of that ?

ie: unsigned long kmap_kiovec(int nr, struct kiobuf *iovec[]);

Must it be done by modifying the page tables by hand ?
(If so; is "linux" interrested in such an api as kmap_kiovec
or is it total nonsence ?)

Is there a preferred way to do this
   (mmap -> nopage vs. map_user_kiobuf()) ?

Best regards,
                 -Tristan


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-12-04 19:29 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-12-04 19:31 How do I share large portions of memory with "user land" ? Tristan Van Berkom

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).