【问题标题】:Communication between Linux kernel and user space programLinux内核与用户空间程序之间的通信
【发布时间】:2011-12-30 01:31:57
【问题描述】:

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

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

我认为内核用户空间 IPC 或 Unix 套接字会很不错,但我没有找到 Google 提供的示例。

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

【问题讨论】:

  • 查看 netlink API。
  • @moshbear 很到位。 Netlink 非常适合这项任务。
  • chardev 听起来不错。为什么每次打开只能发出一个请求(2)?为什么不每次写入一个请求(2)并通过读取(2)返回结果?当您的模块正在发送数据时,用户进程将在 read(2) 中被阻止。你的问题在哪里?
  • 谢谢@moshbear,这似乎正是我需要的:)
  • @MackieMesser 是的,这会起作用,但我必须检查write(2) 调用是否写了完整的消息。如果用户程序使用fprintf()chardev 写入请求,那么内核模块可能会收到部分消息。通过使用套接字或IPC,我想我可以保证消息是完整的。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    最简单的是使用proc文件接口进行通信,尤其是消息和结果小于一页的情况下。

    一般顺序如下:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2011-05-25
      • 2013-02-23
      • 2011-03-02
      相关资源
      最近更新 更多