Subject: Re: mmap() from kernel to user
To: None <tech-kern@netbsd.org>
From: Kamal R. Prasad <kamalp@kprasad.org>
List: tech-kern
Date: 11/22/2004 21:46:45
From: mouse [at] Rodents.Montreal.QC.CA (der Mouse)
Newsgroups: netbsd.tech.kern
Organization: TAC News Gateway
Date: Nov 22 2004 12:51:07
References: 1
>>> I don't understand what you want to do? Do you simply want the
>>> device mmap()-ed? Why don't you do it the normal way?
>> No -I do not want the device mmap()'ed by any means. The USB device
>> generates an image that could be as large as 1024x1024 bytes. After
>> doing a usbd_bulk_transfer(sc->sc_bulkin_pipe..), I want to give the
>> userspace a reference to the image/data thus obtained.
>If by "reference" you mean "a block of what looks to userland like
>memory", this sounds like exactly the sort of thing mmap was designed
>for. Why don't you want to use it? (I'm not saying you should. But
>your answer to this question should help me determine where my
>conceptualization of your problem disagrees with yours, and thus help
>find more useful comments for you.)
Yes -I do want to use mmap(). Since driver and userland library are in
different address spaces, I do not know how to give userland ref to the
block of memory. The only way I am aware of is to give the filename of
the mmap()'ed file i.e. not using anon_map, but that would mean using
the filesystem -which I want to avoid.
>>> For most USB devices I would think that mmap() is a bad idea.
>>> Remember that with mmap() you can read at random places in the data,
>>> so if your device doesn't support this you would be forced to buffer
>>> all data in the kernel.
>> If the userspace has a handle, it can seek to the begining of the
>> file and read from there.
>This makes it sound as though you want to present the data as a file
The original driver in WinCE uses memory mapped files. It presumes that
there will be C:\ drive and it will be used on windows CE -none of
which is going to be true. The embedded controller will come without a
hard disk -and we won't be buying winCE licenses.
Im tryig to port the driver, and was trying to skip using the filesystem.
>(rather than, say, a memory segment).
How would I do that i.e. hand userspace a memory segment?
>Again, why? (Similar remarks apply.)
Just herd-mentality I guess. The hw vendor thinks copyout() is not good
enough and he needs to pass a ref. to the block -and I was trying to
adhere to it within my constraints.
>If you have no writable mass storage media available, your only choices
>are to either buffer the whole thing in memory (in which case you might
>as well present it to userland with mmap(), though a file-style
How? I know I can do it with shared memory because there is a shmid, but
not aware of being able to do it with anon_map. BTW -any way I can use
shared memory across user/kernel land?
>interface would be fairly easy to do) or read it from the device on
>demand (in which case presenting it as a file does make more sense;
>this is just the sort of thing device drivers are good at: presenting
>devices as if they were files).
The driver in WinCE has an IOCTL_GET_FILEName which the userland will
use to access the data.
>> Yes -I am using copyout() to hand read() the reqd data. There is an
>> ioctl() that supports getting hold of the mmap()'ed filename, its
>> size etc.. in the driver being ported.
>You keep referring to things like this, as if there is some mmapped
>file involved somewhere, but it's completely unclear to me where. You
>write of "the mmap()'ed filename", but it's not clear _what_ mmapped
>file's name you're talking about. So far, you've talked about a USB
>device and a driver for it; I don't see any mmapped files anywhere in
>the vicinity yet.
I was referring to the ioctl in WinCE for which I want to provide
similar functionality.
> a
>>> The speed of the USB 1.1 bus is low compared to the speed of a
>>> copyout() on any modern platform.
>> The platform is going to be an Intel Xscale processor on an embedded
>> controller. There won't be a harddisk and most likely it will be the
>> cheapest such controller available in the market. If that isn't a
>> problem for using copyout(), that is great.
>I'd expect it won't be a problem; I certainly wouldn't worry about it
>unless copyout() proves to be too slow. If you did present it with a
>read()-style interface, you'd have to do copyout() or its moral
>equivalent at *some* point to get the data from kernel to userland.
Yeah -but the WinCE driver provides more than one way of reading the
data i.e. a read() which does involve a copyout() and an ioctl() which
doesn't. I have access to the userland library src code which interfaces
with the driver -so worst case, I will bypass the ioctl() and use read()
only.
thanks & regards
-kamal
/~\ The ASCII der Mouse
\ / Ribbon Campaign
X Against HTML mouse [at] rodents.montreal.qc.ca
/ \ Email! 7D C8 61 52 5D E7 2D 39 4E F1 31 3E E8 B3 27 4B