如何从用户空间与Linux内核模块通信而不会乱丢/ dev新节点?

时间:2010-05-25 09:51:51

标签: linux linux-kernel linux-device-driver

从用户空间与内核模块通信的方法有哪些?通过通信,我的意思是在内核模块和用户空间进程之间发送信息和命令。

我目前知道两种方式:

  1. 在已发布的设备节点上打开/关闭/读取/写入/ ioctl。
  2. 读取/写入导出和挂钩/ proc文件。
  3. 更具体地说,有人可以建议与内核模块进行通信的最佳方式,该内核模块实际上并不驱动任何硬件,因此不应该使用仅存在于ioctl调用的存根节点乱丢/ dev吗?我主要需要检查其各种状态变量,并向其发送带有请求类型标记的数据块,并查看请求是否成功。

6 个答案:

答案 0 :(得分:8)

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

  

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

(来自Wikipedia

答案 1 :(得分:8)

Netlink sockets也是为满足这种要求而设计的......

另见

答案 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 MemoryIOCTL

答案 5 :(得分:0)

对于不如sysfs稳定的API,

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?