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

时间:2014-01-07 15:32:07

标签: c linux linux-kernel producer-consumer

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

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

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

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

5 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:3)

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

但是,如果您想要在内核之间传输大量数据,那么您可以查看使用 netlink套接字或使用 debugfs 可能是传输数据的最快机制,尽管您必须实现自己的通知机制,以便在数据准备就绪时通知用户空间程序,反之亦然(消费)。

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

答案 2 :(得分:1)

从用户空间到内核空间的通信有几种众所周知的方法。

以上列出的所有方法都使用通用方法从用户空间调用remote procedure call(RPC)到内核空间。

如果你能理解这个http://articles.manugarg.com/systemcallinlinux2_6.html,那么你就可以在 linux 内核中开发你自己的框架,用于用户空间到内核空间的通信。

答案 3 :(得分:0)

您可以在用户空间中定义一个变量并将其映射到内核。 数据准备好后,内核将设置该变量。 在用户空间中,应用程序可以轮询变量。设置后,可以执行ioctl来从内核读取数据。 缺点是您必须在每个定义的时间轮询用户空间中的变量,但是这样做的好处是可以避免使用锁定机制。

答案 4 :(得分:0)

您可以使用 Poll 或在用户空间中选择系统调用并在内核空间中使用 poll fops 来实现这一点。它将被来自用户空间的轮询系统调用阻止。当数据准备好时,从内核空间向用户空间发送通知/事件。接收到这个事件,进程可以读取数据。