用户空间中的Linux中断处理

时间:2011-11-02 19:31:45

标签: linux linux-kernel interrupt-handling

在Linux中,有哪些选项可以处理用户空间代码中的设备中断而不是内核空间?

4 个答案:

答案 0 :(得分:7)

经验告诉我们可以为几乎任何PCI适配器编写良好且稳定的用户空间驱动程序。它只需要一些复杂性和内核中的小代理层。 UIO是朝着这个方向迈出的一步,但是如果你想正确处理用户空间中的中断,那么UIO可能还不够,例如,如果设备不支持UIO所依赖的PCI规范的中断禁用位。

请注意,进程唤醒延迟只有几微秒,因此如果您的实现需要非常低的延迟,那么用户空间可能会拖累它。

如果我要实现用户空间驱动程序,我会将内核ISR简化为“禁用& ack&唤醒 - 用户空间”操作,在唤醒过程中处理中断,然后重新启动启用中断(当然,通过从用户空间进程写入映射的PCI内存)。

答案 1 :(得分:5)

UIO,但处理仍应在内核空间中完成。 OTOH,如果您只需要注意中断,则不需要内核部分。

答案 2 :(得分:2)

答案 3 :(得分:2)

必须间接触发用户名代码。

内核ISR通过写入文件/设置寄存器/信令来指示中断。用户空间应用程序轮询这个并继续使用适当的代码。 边缘情况:比预期更多或更少的中断(每个时间间隔超时/中断太多)

Linux文件抽象用于连接内核和用户空间。这是由字符设备和ioctl()调用执行的。有些人可能更喜欢sysfs条目。

这可能看起来很奇怪,因为事件触发的设备通知(中断)与“时间触发”轮询挂钩,但它实际上是异步阻塞(读/选)。无论如何,根据表现产生了一些问题。

因此无法在内核之外直接处理中断。 例如。共享内存可以在用户空间中,并且可以映射一些I / O权限设置地址,因此U-I / O可以工作,但不能用于直接中断处理。

我在主题vfio(http://lxr.free-electrons.com/source/Documentation/vfio.txt)中只发现了一个“少数群体报告”: https://stackoverflow.com/a/21197797/5349798

类似的问题:

Running user thread in context of an interrupt in linux

Is it possible in linux to register a interrupt handler from any user-space program?

Linux Kernel: invoke call back function in user space from kernel space

Linux Interrupt vs. Polling

Linux user space PCI driver

How do I inform a user space application that the driver has received an interrupt in linux?