使用用户空间程序与内核模块进行通信的最佳方式是什么?

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

例如,我的内核模块中有一个缓冲区,其数据将被用户空间程序占用。 如果所有数据都被使用了,那么当新数据到达时,内核模块必须通知我的程序。

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

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

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

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

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

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

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

然而,如果你想传输大量的数据到内核,那么你可以看看使用netlink套接字或使用mmap这可能是最快的机制来传输数据,尽管你将不得不实现自己的通知机制来通知用户空间程序,当数据准备好时,反之亦然(用于消费)。

请参阅此链接了解Linux下可用的所有可用选项。