Linux内核与用户空间程序之间的通信

我目前正在编写Linux内核模块,并且在实现与用户空间程序的通信时遇到问题。

此内核模块需要接收用户空间程序发出的任务,并在完成后将结果发送回用户空间程序。 在内核模块执行其工作时,应阻止用户空间程序。

我认为内核用户空间IPC或Unix套接字会很好,但我没有找到谷歌的例子。

目前我丑陋的解决方案是导出chardev并让用户空间程序将请求写入设备文件,并从中读取结果。 但我只能在每次open()调用时发出一个请求,这会导致新问题。 我真的需要一个IPC或类似套接字的东西。 谢谢!

有几种方法可以实现这一点。

最简单的方法是使用proc文件接口进行通信,尤其是当消息和结果的大小小于一页时。

一般顺序如下:

  • 实现proc_open(),proc_read()和proc_write(); proc_close();
  • 打开和关闭可以实现锁定,这样只有一个用户空间程序实例可以实际访问模块请求引擎。

  • 任务请求通过写入proc文件发送,

  • 如果模块理解命令,则write函数将成功返回,在返回程序之前将初始化请求处理,如果读取proc文件很简单,则实际上可以进行处理。 如果处理非常复杂,那么我建议你阅读下半部分1 (你可以简单地开始一个工作队列)。

  • 读取或者触发“您希望模块执行的处理”。 或等待BH完成处理,以防你这样做。 您可以使用自旋锁或互斥锁来控制流量。

  • 内核处理在完成时返回结果。

使用netlink套接字提供用户空间程序和内核模块之间的全双工通信,而不是使用普通套接字,proc fs和实现新的系统调用。