【问题标题】:Linux (or other *nix): Attaching an interrupt to userspaceLinux(或其他 *nix):将中断附加到用户空间
【发布时间】:2015-12-06 06:17:44
【问题描述】:

我正在尝试确保在发生特定硬件中断后尽快执行唯一的用户进程。

我知道这样做的一种机制是编写一个小型内核模块,该模块在读取处理程序中休眠时导出设备。该模块还注册了一个 irq 处理程序,它除了唤醒进程之外什么都不做。然后从用户的角度,读取该设备块,直到相关中断发生。

(1) 在具有主线内核的现代 CPU 上,您能否可靠地预期内核看到中断与用户进程重新获得控制之间的亚毫秒延迟?

(2) 在主线内核上是否有任何更低延迟的机制?

【问题讨论】:

  • 您的方法似乎没问题。我不确定亚毫秒级的延迟,但它可能可以通过“轻”内核达到(你总是可以在你的机器上测试它)。但是可靠性是实时系统的属性。非 RT 操作系统不提供任何有关响应时间的保证。
  • 亚毫秒级可能很难实现,但无论如何您都需要 RT 补丁 rt.wiki.kernel.org/index.php/Main_Page
  • 抱歉,编辑澄清我试图了解如何在非面向实时的内核上尽可能降低这种延迟。是否有任何其他技巧或者这是可以做到的最好的?

标签: linux-kernel linux-device-driver freebsd openbsd


【解决方案1】:

PREEMPT_RT patch 应用到内核并编译它,通过make menuconfig 配置完全可抢占性。

这将允许您拥有线程中断(即,作为内核线程执行的中断处理程序)。然后,您可以为您的特定中断处理程序(使用ps aux 检查其 PID)和您的特定进程分配最高优先级(即 RT prio > 50),并为其他任何事情分配较低的优先级。

【讨论】:

  • 谢谢!我听说过 PREEMPT_RT。如果可以保证此设备只有一个 irq 处理程序,那么 PREEMPT_RT 补丁的其他功能是否有帮助?
  • 是的,如果您应用 PREEMPT_RT 并在内核配置中选择完全抢占性,那么在运行时您会为每个 IRQ 获得一个单独的线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2012-02-02
  • 2012-08-09
  • 2020-06-01
  • 2016-07-31
相关资源
最近更新 更多