2011-11-02 94 views

回答

4

还有,但处理仍然应该在kernelspace中完成。 OTOH,如果您只需要注意中断,则不需要内核部分。

5

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

请注意,进程唤醒延迟是几微秒,所以如果您的实现需要非常低的延迟,那么用户空间可能是一个拖动。

如果我要实现一个用户空间的驱动程序,我会减少内核ISR只是一个“禁用& ACK &唤醒userpace”操作,处理唤醒返回过程中中断,然后重新启用中断(当然,通过从用户空间进程写入映射的PCI内存)。

+0

当我们做用户空间的驱动程序,是否有意义,以清除内核或用户空间中断?我认为应该清楚处理完成后(所以在用户空间),对吗? – ransh

1

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

内核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?

相关问题