Linux如何为PCIe设备分配IRQ编号?非驱动开发者的技术疑问
Linux PCIe设备IRQ编号为啥在驱动probe/open前就确定了?
嘿,我来给你理清楚这个逻辑~虽然你不是驱动开发者,但从ixgbe网卡驱动的例子入手,其实能很好理解Linux的PCIe IRQ分配机制:
首先要明确:Linux对PCIe设备的IRQ编号分配,是在系统启动的PCI总线枚举阶段就完成的,远远早于驱动的probe或者open函数执行。
具体来说:
- 系统启动时,PCI总线枚举器会遍历所有PCI/PCIe设备,读取设备配置空间里的中断相关信息(比如传统INTx的中断引脚,或者MSI/MSI-X的能力结构);
- 内核的中断子系统会根据这些硬件信息,为设备分配好对应的内核虚拟IRQ编号(如果是MSI/MSI-X的话就是中断向量),并把这些信息存在设备对应的
struct pci_dev结构体里。
回到你提到的ixgbe驱动例子:
驱动里的adapter结构体是和设备的struct pci_dev绑定在一起的,所以在调用ixgbe_request_irq(adapter)之前,驱动已经可以从关联的pci_dev里拿到预先分配好的IRQ编号了。这个函数的作用只是向内核申请使用这个已经分配好的IRQ,而不是去动态分配新的IRQ——这就是为啥你会看到IRQ在probe/open之前就已经确定了。
再补充两个细节:
- 对于传统的INTx中断,内核会把硬件的物理中断号映射到内核统一管理的虚拟IRQ编号;
- 对于现代的MSI/MSI-X中断,内核会直接为设备分配专属的虚拟中断向量,这些向量会被存在设备的PCI配置信息中,驱动只需要读取并注册中断处理函数就行。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

