内核与用户空间通信具有低延迟

时间:2018-05-07 09:09:49

标签: c linux unix linux-kernel kernel-module

  • 我的内核模块从外部GPIO引脚更改接收中断(上半部分)。
  • 收到中断后,内核模块应该唤醒或以某种方式调用将开始处理的用户空间中的函数/线程。时间非常有限。
  • 无需发送数据,只需发送信号。
  • CPU是多核的,用户空间应用程序将与一个核心具有亲和力。

有很多方法可以进行内核 - 用户空间通信。 哪一个具有最低延迟?即ISR和唤醒功能之间的时间)。

旁注:是的,我可以对它们进行基准测试,我问这个问题的原因是因为我可能不知道所有可能的解决方案

2 个答案:

答案 0 :(得分:3)

中断处理程序可以直接写入进程提供的映射内存范围,而进程正忙 - 等待更改内存位置。这甚至可以在上半部分执行,并且应该为您提供尽可能低的延迟。确保提供的内存位置锁定在物理内存中,因为在isr期间无法将其分页。

可以在数据包套接字和PACKET_MMAP中找到类似的方法,其中内核和用户空间之间的通信通过共享内存空间进行(参见Kernel Documentation)。

如果您不关心通过操作系统进行资源管理(因为您只有一个应用程序在等待外部输入),您也可以选择直接从用户空间访问硬件(使用iopl / inb / outb和朋友)。

答案 1 :(得分:0)

进程等待内核唤醒它的标准方法是使用poll()系统调用,并使用设备驱动程序的中断处理程序唤醒等待它的任何线程。

4个项目符号中列出的最长延迟操作是唤醒应用程序线程,因此如果您需要更短的延迟,则需要线程处于唤醒但等待事件。

我使用的最低延迟机制是让中断在应用程序进程中写一个字,并让一个线程读取该字并在值改变时继续。实际上,用户空间和内核空间之间的自旋锁定。如果可以将CPU内核专用于自旋锁,或者您希望等待时间非常短,请使用此机制。

您可以使用ioctl()将用户空间指针传递给驱动程序,以便它知道要更新的单词。