从用户空间与内核模块通信的方法有哪些?通过通信,我的意思是在内核模块和用户空间进程之间发送信息和命令。
我目前知道两种方式:
更具体地说,有人可以建议与内核模块进行通信的最佳方式,该内核模块实际上并不驱动任何硬件,因此不应该使用仅存在于ioctl调用的存根节点乱丢/ dev吗?我主要需要检查其各种状态变量,并向其发送带有请求类型标记的数据块,并查看请求是否成功。
答案 0 :(得分:8)
答案 1 :(得分:8)
答案 2 :(得分:3)
您也可以从/ dev设备节点读取/写入。
恕我直言,/ dev已经充斥着各种东西并添加自己的节点并不是什么大问题。不要忘记,您可以为单个设备节点提供大量ioctl代码,并且ioctl参数通过引用传递,因此可以根据您的喜好大小。答案 3 :(得分:2)
第三个是添加一个新的系统调用,但我认为你写的两个是首选的系统调用。我发现此文档可能有所帮助,但我仍然认为此选项未经修改:http://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_add_systemcall.html
另一个可接受的选择可能是共享内存。
答案 4 :(得分:0)
您还可以使用Shared Memory和IOCTL
答案 5 :(得分:0)
debugfs 是另一种很好的可能性,但API基本相同。这是minimal runnable example。
configfs 是另一个。它允许通过文件系统从用户空间轻松动态创建内核对象:https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt
在任何情况下,您都必须弄脏某些命名空间...在sysfs和debugfs的情况下,文件系统条目。只要选择你的毒药。
此外,udev
规则使/dev
与sysfs和debugfs非常相似:How to create a device in /dev automatically upon loading of the kernel module for a device driver?