x86如何为Linux中的PCI设备分配中断号?

How does x86 assigns interrupt number for PCI device in Linux?

我的理解是 BIOS 或 EFI 在启动期间检测硬件并确定中断号,然后在内核启动后将其传递给 Linux 和 运行。根据我的研究,中断号越低,其优先级越高。

我的问题是 BIOS/EFI 如何决定哪个硬件应该比另一个硬件具有更高的优先级?它是可配置的还是由 BIOS/EFI 硬编码的?

有点。

使用传统的 8259A PIC 芯片时,其中一种优先级模式基于 IRQ 编号 - 较低的 IRQ 具有更高的优先级。
然而,对于 IO APIC 和 MSI(X) 技术,IRQ 优先级在 LAPIC 中处理,并且可以通过 OS.

配置

对于遗留方案,these devices have fixed IRQs (not configurable)
分配了优先级,以便 important/frequent 个任务可以中断更少的 important/frequent 个任务。
如今,如果需要,可以模拟这些设备并重新分配它们的 IRQ(在同样的情况下,它取决于 chipset/superio/embedded 控制器),但这可能会导致一些兼容性问题。
因此,每个模拟传统设备(例如 HDD)的设备通常都分配有其传统 IRQ 号。

另一个主题是用于非遗留设备(例如 NIC)的 PCI 中断(PCIe 弃用了 INTx# 行以支持 MSI)。
那些是真正的可编程 IRQ,每个 PCI-to-PCI 桥将其四个 PIRQA-PIRQD 输入引脚重新映射到其四个 INTA#-INTD# 输出引脚(以纠结的方式连接到桥的父 PIRQA-PIRQD 引脚)时尚)。
Host-to-PCI-bridge INTA#-INTD#(概念上)连接到 8259A 和 IO-APIC。
该映射可使用一些芯片组寄存器进行配置(例如,请参阅英特尔系列 200 PCH 数据表第 2 卷第 29 章)。

因此固件至少可以自由地重新映射非遗留设备的 PCI 中断。我认为使用的算法只是将较低的空闲IRQ分配给最多"important"个设备。
然而,如上所述,一旦 OS 脱离 8259A 模式,这些优先级就不再重要了。