我不是驱动程序员,我不清楚 linux 如何为 pcie 设备分配 irq 号。
从 NIC 驱动程序示例中,Linux 似乎在执行“probe”或“open”函数之前就已经知道应该使用哪个 irq 号。
错误 = ixgbe_request_irq(适配器);
ixgbe 可以通过 'adapter' 变量的数据获取 irq 编号,这意味着 irq 值已经在适配器结构中,它不是生成的编号,它是一个已经存在的值。
如果从pci/pcie配置空间读取,是不是很容易和其他设备冲突?
如果它是由内核生成/排列的,“适配器”变量中的 irq 号如何?(或者它是由 BIOS 分配的?)
对于 MSI 的中断,它似乎是由内核生成的??
--
据我了解,应该从 PCIe 配置空间中的中断线路寄存器(偏移 3Ch)中读取 irq 编号,我猜这就是为什么 kerenl 已经知道应该使用哪个 irq 编号,并且应该由 BIOS 更新中断线路寄存器(我的猜测)在启动期间,但仍然有一个虚拟 IRQ(当 lspci 没有 -b 时),并且似乎 MSI 有另一个 irq(?),它们是公共资源,如要安排的内存吗?
对于 legacy 中断,irq 值是从配置空间读取的,但是 irq 值主要由 BIOS 分配。
这部分的更多信息:http: //tldp.org/HOWTO/Plug-and-Play-HOWTO-7.html
对于 MSI/MSI-X 中断,它是通过分配来完成的。
例如:pci_alloc_irq_vectors() https://www.kernel.org/doc/Documentation/PCI/MSI-HOWTO.txt
这在很大程度上取决于我们正在谈论的机器......在当今的 PC 上,设备在配置时会即时分配 IRQ 编号。
要深入研究这个主题,请看一下“Linux 设备驱动程序”(是的,它已经过时了,但它所说的大部分内容仍然适用)。
对于 MSI-X,请参阅 acpi_pci_irq_check_entry() 中的注释。