18

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

4

4 回答 4

7

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

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

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

于 2011-11-02T22:23:53.317 回答
6

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

于 2011-11-02T20:05:22.753 回答
2

您可能想看看第 10 章:Linux 设备驱动程序的中断处理第三版一书。

于 2011-11-02T20:21:28.767 回答
2

必须间接触发用户代码。

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

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

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

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

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

类似的问题:

在linux中的中断上下文中运行用户线程

在 linux 中是否可以从任何用户空间程序注册中断处理程序?

Linux Kernel:从内核空间调用用户空间的回调函数

Linux 中断与轮询

Linux用户空间PCI驱动

如何通知用户空间应用程序驱动程序已收到 linux 中的中断?

于 2017-12-12T15:22:03.367 回答