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

7
我目前正在编写一个Linux内核模块,但在实现与用户空间程序的通信时遇到了问题。
这个内核模块需要接收用户空间程序发出的任务,并在完成后向用户空间程序发送结果。在内核模块执行任务期间,应阻塞用户空间程序。
我认为使用内核-用户空间IPC或Unix套接字会很好,但我在Google上找不到相关示例。
目前,我采用了一个丑陋的解决方案,即导出chardev并让用户空间程序将请求写入设备文件中,并从其中读取结果。但我每次只能通过open()调用发出一个请求,这导致了新的问题。我真的需要一种IPC或类似socket的东西。谢谢!

7
了解netlink API。 - moshbear
@moshbear说得很对。Netlink非常适合这个任务。 - Brian Cain
“chardev” 听起来不错。为什么每次 open(2) 只能发出一个请求?为什么不能每次 write(2) 发出一个请求,并通过 read(2) 获取结果?用户进程在 read(2) 中将被阻塞,而您的模块正在发送数据。你的问题在哪里? - Mackie Messer
谢谢@moshbear,看起来正是我需要的 :) - Santa Zhang
@MackieMesser 是的,这个方法可以实现,但我需要检查 write(2) 调用是否已经写入了完整的消息。如果用户程序使用 fprintf()chardev 写入请求,则内核模块可能会接收到部分消息。通过使用套接字或 IPC,我认为我可以保证消息是完整的。 - Santa Zhang
@SantaZhang:嗯,无论如何,您都需要在内核中进行广泛的测试以获取完整/有效的消息。您可以为想要使用您的模块的人提供用户级库,从而防止使用fprintf()时出现错误。但是,如果您更喜欢netlink,那也没有问题! :-) - Mackie Messer
2个回答

6

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


6

有几种实现方法。

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

一般的顺序如下:

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

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

  • 如果模块理解命令,则写函数将成功返回,在返回之前,程序将初始化请求处理。如果处理是微不足道的,那么处理实际上可以在读取proc文件时进行。如果处理过程非常复杂,那么建议您阅读底半部分的相关知识1(您只需启动一个工作队列即可)。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接