问题
What are the ways to communicate with a kernel module from user space? By communication i mean sending information and commands between the kernel module and a user space process.
I currently know of two way:
- open/close/read/write/ioctl on published device node.
- read/write on exported and hooked /proc file.
More specifically, can someone advice the best way to communicate with a kernel module that does not actually drives any hardware and therefore should not be littering /dev with stub nodes that exists solely for ioctl calls? I mostly need to check its various status variables and send it a block of data with a request type tag and see if the request succeeded.
回答1:
Netlink sockets are designed for that kind of requirements, too...
Also see
- man 7 netlink
- libnl - Netlink library
- The libnl Archives
回答2:
There's also the /sys filesystem (sysfs):
Sysfs exports information about devices and drivers from the kernel device model to userspace, and is also used for configuration.
(from Wikipedia)
回答3:
You could also read/write from /dev device nodes.
IMHO, /dev is already littered with stuff and adding your own nodes there isn't a big issue. Don't forget that you can have lots of ioctl codes for a single device node, and the ioctl paramters are passed by reference so can be as big as you like.
回答4:
Third one is add a new syscall, but the two you have written are the preferred ones, I think. I've found this document that might help, but I still think this option is unadvised: http://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_add_systemcall.html
Another acceptable option might be sharing memory.
回答5:
You could also use Shared Memory and IOCTL
回答6:
debugfs is another good possibility for APIs that are less stable than sysfs, but the API is basically the same. Here is a minimal runnable example.
configfs is another one. It allows easy dynamic creation of kernel objects from userspace through the filesystem: https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt
In any case, you will have to dirty some namespace... a filesystem entry in case of sysfs and debugfs. Just choose your poison.
Also, udev
rules make /dev
very similar to sysfs and debugfs: How to create a device in /dev automatically upon loading of the kernel module for a device driver?
来源:https://stackoverflow.com/questions/2903572/how-to-communicate-with-a-linux-kernel-module-from-user-space-without-littering