How to communicate with a Linux kernel module from user space without littering /dev with new nodes?

杀马特。学长 韩版系。学妹 提交于 2019-11-29 01:36:18

问题


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:

  1. open/close/read/write/ioctl on published device node.
  2. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!