11

从用户空间与内核模块通信的方法是什么?通信是指在内核模块和用户空间进程之间发送信息和命令。

我目前知道两种方式:

  1. 在已发布的设备节点上打开/关闭/读取/写入/ioctl。
  2. 读取/写入导出和挂钩的 /proc 文件。

更具体地说,有人可以建议与实际上不驱动任何硬件的内核模块进行通信的最佳方式,因此不应该将 /dev 与仅存在于 ioctl 调用的存根节点一起乱扔垃圾?我主要需要检查它的各种状态变量,并向它发送一个带有请求类型标签的数据块,看看请求是否成功。

4

6 回答 6

9

还有 /sys 文件系统(sysfs):

Sysfs 将有关设备和驱动程序的信息从内核设备模型导出到用户空间,也用于配置。

(来自维基百科

于 2010-05-25T10:12:33.410 回答
9

Netlink 套接字也是为这种要求而设计的......

另见

于 2010-05-27T09:33:10.797 回答
3

您还可以从 /dev 设备节点读取/写入。

恕我直言,/dev 已经有很多东西了,添加你自己的节点没有什么大问题。不要忘记单个设备节点可以有很多 ioctl 代码,并且 ioctl 参数是通过引用传递的,因此可以任意大。

于 2010-05-25T09:56:58.077 回答
2

第三个是添加一个新的系统调用,但我认为您编写的两个是首选的。我发现这个文档可能会有所帮助,但我仍然认为这个选项是不建议的:http ://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_add_systemcall.html

另一个可接受的选择可能是共享内存。

于 2010-05-25T09:56:49.317 回答
0

您还可以使用共享内存IOCTL

于 2016-12-08T06:50:01.560 回答
0

对于不如 sysfs 稳定的 API,debugfs是另一个不错的选择,但 API 基本相同。这是一个最小的可运行示例

configfs是另一个。它允许通过文件系统从用户空间轻松动态创建内核对象:https ://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt

在任何情况下,您都必须弄脏一些命名空间......在 sysfs 和 debugfs 的情况下是文件系统条目。只需选择你的毒药。

此外,udev规则/dev与 sysfs 和 debugfs 非常相似:如何在为设备驱动程序加载内核模块时自动在 /dev 中创建设备?

于 2017-07-23T19:49:05.690 回答