我将在 Linux 中编写一个基于 PCIe 的串行 I/O 卡驱动程序。
据我所知,通过配置空间,它提供了中断线,并且通过IRQF_SHARED
标志我们能够与相应的IRQ
线共享中断处理程序。
但我的困惑是我怎么知道哪条线路是共享的或不共享的?
我将在 Linux 中编写一个基于 PCIe 的串行 I/O 卡驱动程序。
据我所知,通过配置空间,它提供了中断线,并且通过IRQF_SHARED
标志我们能够与相应的IRQ
线共享中断处理程序。
但我的困惑是我怎么知道哪条线路是共享的或不共享的?
对于设备驱动程序,没有有用的方法(尤其是没有可移植的方法)来确定中断线是否实际上是共享的,并且这可以通过加载/卸载其他驱动程序随时改变。PCI 驱动程序必须始终假定它们的中断可能是共享的。
注意:PCI Express 设备应该支持永远不会共享的 MSI(消息信号中断)。如果可能,您的驱动程序应启用 MSI。但是,不能保证系统支持它们。
内核辅助探测
Linux 内核提供了一个低级工具来探测中断号。它仅适用于非共享中断,但大多数能够在共享中断模式下工作的硬件无论如何都提供了更好的方法来查找配置的中断号。该设施由两个函数组成,声明于<linux/interrupt.h>
(也描述了探测机制):
unsigned long probe_irq_on(void);
此函数返回未分配中断的位掩码。驱动程序必须保留返回的位掩码,并将其传递给probe_irq_off
以后。在此调用之后,驱动程序应安排其设备产生至少一个中断。
int probe_irq_off(unsigned long);
设备请求中断后,驱动程序调用此函数,将先前返回的位掩码作为其参数传递probe_irq_on
。probe_irq_off
返回在“probe_on”之后发出的中断号。如果没有发生中断,则返回 0(因此,无法探测 IRQ 0,但任何自定义设备都不能在任何受支持的架构上使用它)。如果发生多个中断(模糊检测),则probe_irq_off
返回负值。
程序员应该注意在调用 之后启用设备上的中断并
probe_irq_on
在调用之前禁用它们probe_irq_off
。此外,您必须记住在probe_irq_off
.
运行cat /proc/interrupt
。在输出的最右边一列中,您应该在其中一条中断线上看到您的设备。如果它是共享的,您也会看到分配给该中断的其他设备。