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

  • 我的内核模块从外部GPIO引脚更改接收中断(上半部分)。

  • 收到中断后,内核模块应唤醒或以某种方式调用将开始处理的用户空间中的函数/线程。时间很有限。

  • 无需发送数据,仅发送信号即可。

  • CPU是多核的,用户空间应用将对一个核具有亲和力。

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

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


尚方宝剑之说
浏览 251回答 2
2回答

炎炎设计

当进程忙于等待该内存位置更改时,中断处理程序可以直接写入该进程提供的映射内存范围。这甚至可以在上半部分执行,并应为您提供尽可能短的延迟。确保提供的内存位置已锁定到物理内存中,因为在isr期间无法对其进行分页。在数据包套接字和PACKET_MMAP中可以找到类似的方法,其中内核和用户空间之间的通信是通过共享内存空间进行的(请参阅内核文档)。如果您不关心通过OS进行的资源管理(因为只有一个应用程序在等待外部输入),则还可以选择直接从用户空间(使用iopl / inb / outb和朋友)访问硬件。

慕沐林林

进程等待内核唤醒的标准方法是使用poll()系统调用,以及设备驱动程序的中断处理程序唤醒所有等待内核的线程。您的4个项目符号中列出的最长延迟操作正在唤醒应用程序线程,因此,如果您需要更短的延迟,则需要唤醒线程,但要等待事件。我使用的最低延迟机制是让中断在应用程序过程中写一个字,并让线程读取该字并在值更改时继续执行。实际上,是用户空间和内核空间之间的自旋锁。当您可以将CPU内核专用于自旋锁时,或者当您期望等待时间很短时,请使用此机制。您可以使用ioctl()将用户空间指针传递给驱动程序,以便它知道要更新哪个单词。
打开App,查看更多内容
随时随地看视频慕课网APP