在 Linux 中,在用户空间代码中而不是在内核空间中处理设备中断的选项有哪些?
4 回答
经验表明,几乎可以为任何 PCI 适配器编写良好且稳定的用户空间驱动程序。它只需要内核中的一些复杂性和一个小的代理层。UIO 是朝这个方向迈出的一步,但是如果您想正确处理用户空间中的中断,那么 UIO 可能还不够,例如,如果设备不支持 UIO 所依赖的 PCI 规范的中断禁用位。
请注意,进程唤醒延迟只有几微秒,因此如果您的实现需要非常低的延迟,那么用户空间可能会拖累它。
如果我要实现用户空间驱动程序,我会将内核 ISR 简化为“禁用&确认&唤醒用户空间”操作,在唤醒进程中处理中断,然后重新启用中断(当然,通过从用户空间进程写入映射的 PCI 内存)。
有UIO,但仍应在内核空间中进行处理。OTOH,如果您只需要注意中断,则不需要内核部分。
您可能想看看第 10 章:Linux 设备驱动程序的中断处理,第三版一书。
必须间接触发用户代码。
内核 ISR 通过写文件/设置寄存器/信号来指示中断。用户空间应用程序对此进行轮询并继续使用适当的代码。边缘情况:比预期更多或更少的中断(超时/每个时间间隔的中断太多)
Linux 文件抽象用于连接内核和用户空间。这是由字符设备和ioctl()
调用执行的。为此,有些人可能更喜欢 sysfs 条目。
这看起来很奇怪,因为事件触发的设备通知(中断)与“时间触发”轮询挂钩,但它实际上是异步阻塞(读取/选择)。无论如何,根据性能会出现一些问题。
所以中断不能在内核之外直接处理。例如,共享内存可以在用户空间中,并且可以映射一些 I/O 权限设置地址,因此 UI/O 可以工作,但不能用于直接中断处理。
我在 vfio 主题( http://lxr.free-electrons.com/source/Documentation/vfio.txt) 中只发现了一份“少数派报告” : https ://stackoverflow.com/a/21197797/5349798
类似的问题: