使用用户空间程序传递内核模块的最佳方法是什么?

jcf*_*cco 4 c linux producer-consumer linux-kernel

这个问题似乎很简单,但我想发送一个事件来通知我的用户空间程序模块缓冲区已准备好被读取.

例如,我的内核模块中有一个缓冲区,其数据将由用户空间程序使用.如果消耗了所有数据,则内核模块必须在新数据到达时通知我的程序.

这是生产者/消费者的典型问题.生产者是内核模块,消费者是用户空间程序.

今天,我向我的程序(事件)发送一个信号,并使用ioctl函数访问数据缓冲区.但我不知道这种方法是否足以解决这类问题.我害怕不必要地使用netlink或内存映射来解决这个问题.

Man*_*dhu 8

为了共享内核模块的状态信息,我建议使用任何一种可用的虚拟文件系统(例如:/proc/sys或者如果您正在调试debugfs)。

但是,如果您想在内核之间来回传输大量数据,那么您可以考虑使用netlink 套接字或使用mmap这可能是传输数据最快的机制,尽管您必须实现自己的通知机制来通知用户空间在数据准备好时进行编程,反之亦然(用于消费)。

有关Linux 下可用的所有可能选项,请参阅链接。


Tob*_*ert 7

阅读其他一些你想要的模块.

在Linux内核中有很多选项可供选择,包括:

  • 虚拟文件系统,例如/ proc,/ sys,configfs,relayfs(真的看看relayfs)
  • 网络链路
  • 阻止系统调用
  • poll()/ epoll()及相关

/ proc可能是最简单的开始,因为它已经存在并且有大量关于如何使用它的文档.创建一个映射到缓冲区的虚拟文件,然后让用户空间应用程序打开fd并使用select.简单而无处不在.有更多的现代和"更好"的方式 - 它们将不可避免地用/ proc + select()来描述,所以先学习它们会教你一些有用的东西.