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

时间:2011-11-16 02:33:12

标签: c sockets linux-kernel ipc kernel-module

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

最简单的方法是使用proc文件接口进行通信,特别是如果消息和结果的大小不到一页。

一般序列如下:

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

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

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

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

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

答案 1 :(得分:3)

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