为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

尚方宝剑之说 2021-04-09 17:18:18
我的内核模块从外部GPIO引脚更改接收中断(上半部分)。收到中断后,内核模块应唤醒或以某种方式调用将开始处理的用户空间中的函数/线程。时间很有限。无需发送数据,仅发送信号即可。CPU是多核的,用户空间应用将对一个核具有亲和力。进行内核-用户空间通信的方法有很多。哪一个延迟最短?(即,ISR与唤醒功能之间的时间)。(旁注:是的,我可以对它们进行基准测试,我问这个问题的原因是因为我可能不知道所有可能的解决方案)
查看完整描述

2 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

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

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

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


查看完整回答
反对 回复 2021-04-16
?
慕沐林林

TA贡献2016条经验 获得超9个赞

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

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

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

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


查看完整回答
反对 回复 2021-04-16
  • 2 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信