Linux内核与用户空间程序之间的通信
我目前正在编写Linux内核模块,并且在实现与用户空间程序的通信时遇到问题。
此内核模块需要接收用户空间程序发出的任务,并在完成后将结果发送回用户空间程序。 在内核模块执行其工作时,应阻止用户空间程序。
我认为内核用户空间IPC或Unix套接字会很好,但我没有找到谷歌的例子。
目前我丑陋的解决方案是导出chardev
并让用户空间程序将请求写入设备文件,并从中读取结果。 但我只能在每次open()
调用时发出一个请求,这会导致新问题。 我真的需要一个IPC或类似套接字的东西。 谢谢!
有几种方法可以实现这一点。
最简单的方法是使用proc文件接口进行通信,尤其是当消息和结果的大小小于一页时。
一般顺序如下:
- 实现proc_open(),proc_read()和proc_write(); proc_close();
-
打开和关闭可以实现锁定,这样只有一个用户空间程序实例可以实际访问模块请求引擎。
-
任务请求通过写入proc文件发送,
-
如果模块理解命令,则write函数将成功返回,在返回程序之前将初始化请求处理,如果读取proc文件很简单,则实际上可以进行处理。 如果处理非常复杂,那么我建议你阅读下半部分1 (你可以简单地开始一个工作队列)。
-
读取或者触发“您希望模块执行的处理”。 或等待BH完成处理,以防你这样做。 您可以使用自旋锁或互斥锁来控制流量。
-
内核处理在完成时返回结果。
使用netlink套接字提供用户空间程序和内核模块之间的全双工通信,而不是使用普通套接字,proc fs和实现新的系统调用。