首页 > 解决方案 > x86 如何为 Linux 中的 PCI 设备分配中断号?

问题描述

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

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

标签: linux-kernelx86interruptbiosapic

解决方案


有点儿。

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

对于旧方案,这些设备具有固定的 IRQ(不可配置)
分配了优先级,以便重要/频繁的任务可以中断不太重要/频繁的任务。
如今,这些设备已被模拟,如果需要,可以重新分配它们的 IRQ(在相同情况下,这取决于芯片组/superio/嵌入式控制器),但这可能会导致一些兼容性问题。
因此,每台模拟传统设备(例如 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 分配给最“重要”的设备。
然而,如上所述,一旦操作系统从 8259A 模式切换,这些优先级就不再重要了。


推荐阅读