从用户空间与内核模块通信的方法是什么?通信是指在内核模块和用户空间进程之间发送信息和命令。
我目前知道两种方式:
- 在已发布的设备节点上打开/关闭/读取/写入/ioctl。
- 读取/写入导出和挂钩的 /proc 文件。
更具体地说,有人可以建议与实际上不驱动任何硬件的内核模块进行通信的最佳方式,因此不应该将 /dev 与仅存在于 ioctl 调用的存根节点一起乱扔垃圾?我主要需要检查它的各种状态变量,并向它发送一个带有请求类型标签的数据块,看看请求是否成功。
从用户空间与内核模块通信的方法是什么?通信是指在内核模块和用户空间进程之间发送信息和命令。
我目前知道两种方式:
更具体地说,有人可以建议与实际上不驱动任何硬件的内核模块进行通信的最佳方式,因此不应该将 /dev 与仅存在于 ioctl 调用的存根节点一起乱扔垃圾?我主要需要检查它的各种状态变量,并向它发送一个带有请求类型标签的数据块,看看请求是否成功。
您还可以从 /dev 设备节点读取/写入。
恕我直言,/dev 已经有很多东西了,添加你自己的节点没有什么大问题。不要忘记单个设备节点可以有很多 ioctl 代码,并且 ioctl 参数是通过引用传递的,因此可以任意大。
第三个是添加一个新的系统调用,但我认为您编写的两个是首选的。我发现这个文档可能会有所帮助,但我仍然认为这个选项是不建议的:http ://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_add_systemcall.html
另一个可接受的选择可能是共享内存。
对于不如 sysfs 稳定的 API,debugfs是另一个不错的选择,但 API 基本相同。这是一个最小的可运行示例。
configfs是另一个。它允许通过文件系统从用户空间轻松动态创建内核对象:https ://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt
在任何情况下,您都必须弄脏一些命名空间......在 sysfs 和 debugfs 的情况下是文件系统条目。只需选择你的毒药。
此外,udev
规则/dev
与 sysfs 和 debugfs 非常相似:如何在为设备驱动程序加载内核模块时自动在 /dev 中创建设备?