Subject: Re: Querying an userland program from the kernel
To: Bill Studenmund <wrstuden@netbsd.org>
From: Stephan Uphoff <ups@tree.com>
List: tech-kern
Date: 01/26/2004 15:56:46
Hi,
Bill Studenmund wrote:
> When I was at NASA working on the HSM, we used our own device driver
> (which you need for ioctl to work), and just left userland in read(2).
> Nices things about read() as opposed to ioctl() are: 1) you can use
> select(2)/kevent(2),
}:-) (evil grin)
What exactly prevents (mis-)using select(2)/kevent(2) to detect when the
ioctl would not block ...
> and 2) you can easily handle variable-sized RPC
> requests. Yes, you have to provide the syscall the same size userland
> buffer in each case, but read(2) will only transfer what's there, whereas
> ioctl(2) will always transfer a fixed amount of data. If you are doing RPC
> that may be as large as 8k but often is much smaller, this size difference
> may matter.
There is no real reason to put all the data in the main ioctl structure.
( Unless you are programming Solaris Streams Drivers ...)
Just put pointers to user space buffer in the main structure and
copyin/copyout the bytes that you want.
You can copy bytes to/from user space in the same ioctl - something
that would require two system calls with read/write.
I have to admit that reading/writing using a device driver or socket (as
mentioned
by "der Mouse") is a lot more aesthetic.
But an ioctl gives you (almost?) the power of a system call.
Hey .. anyone mentioned shared user-mapped kernel memory yet }:-)
Stephan