如何找出 I/O APIC 上的中断源?

How to figure out the interrupt source on I/O APIC?

我了解到I/OAPIC芯片有24个PIN,通常单片机系统会将PIN 0~23分别映射到IRQ 32~55。此外,我可以编辑相关的 RTE 来分配中断处理函数。

但是我如何找出每个 PIN 上的 I/O APIC 中断源?

我知道它与 ACPI 相关,但具体应该如何操作,它是否映射到某些 ACPI table?或者我应该使用 AML 来检查它??

非常感谢!!

一般步骤(对于现代 OS)是:

准备

a) 解析ACPI"APIC/MADT"table判断PIC芯片是否存在(PCAT_COMPAT标志),有多少个IO APIC,每个IO APIC有多少输入.如果 ACPI 不存在,您可能想尝试搜索 for/parsing older "MultiProcessor Spec." table 并提取相同的信息;但是,如果 ACPI 确实存在,则 "MultiProcessor Spec." table 可能旨在提供不包含真实信息的 "minimum stub"(因此您必须首先检查 ACPI,如果存在,则更喜欢使用 ACPI) ,并且支持不支持 ACPI 的系统可能不值得麻烦(特别是如果操作系统需要 64 位 CPU,等等)。

b) 解析 ACPI "FADT" 以确定是否可以(或不得)启用 MSI

c) 确定 OS 是单独使用 PIC、单独使用 IO APIC 还是 IO APIC 加 MSI。请注意,这可以(应该?)考虑操作系统自己的启动参数 and/or 配置(例如,如果存在兼容性问题,最终用户可以解决该问题)。

d) 如果PIC芯片存在;屏蔽 PIC 芯片中的所有 IRQ,然后重新配置 PIC 芯片(设置任何 "base vector number" 你想让它们使用 - 例如,也许主 PIC 是中断向量 32 到 39,从属是向量 40 到 47) .如果 IO APIC/s 存在,则屏蔽每个 IO APIC 中的所有 IRQ。注意:如果 PIC 芯片存在,它们都有一个无法屏蔽的 "spurious IRQ",所以如果你不想使用 PIC 芯片,重新配置 PIC 芯片仍然是个好主意,这样它们的虚假 IRQ(以及它们的中断处理程序)不会成为阻碍。

e) 使用 ACPI AML 解释器执行 _PIC 对象;通知 ACPI/AML 您将使用 IO APIC 或 PIC。请注意,"OS uses PIC" 是向后兼容的默认值,因此如果您不使用 IO APIC,则可以跳过此步骤。

f) 在每个CPU中配置本地APIC(此处不做介绍)

设备

在启动设备的设备驱动程序之前:

a) 找出设备的详细信息(例如使用 PCI 配置 space 中的 "class, subclass and programming interface" 字段来找出设备是什么)并检查您是否真的有它的设备驱动程序;并决定您是否希望设备使用 PCI IRQ 或 MSI。

b1) 如果设备将使用 PCI IRQ,并且 OS 正在使用 PIC 芯片(而不是 IO APIC);从设备的 PCI 配置 space 中获取 "Interrupt Line" 字段,并通过向其添加相应的 PIC 芯片的 "base interrupt vector" 来确定它将成为哪个中断向量。

b2) 如果设备将使用 PCI IRQ(而不是 MSI)并且 OS 使用 IO APIC 而不是 PIC;通过从设备的 PCI 配置 space 读取 "Interupt Pin" 字段来确定设备使用哪个 "interrupt pin at the PCI slot"。然后使用 ACPI AML 解释器执行 _PRT 对象并获取当前(不要忘记 PCI-E 支持 "hot-plug")PCI IRQ 路由 table。使用此 table(以及 PCI 设备的 "bus:device:function" 地址和它使用的 "interrupt pin" )来确定 PCI IRQ 连接的位置(例如,哪个全局中断,它确定哪个输入的哪个 IO APIC ).然后;如果您还没有(因为同一中断线由不同的设备共享)使用某种 "interrupt vector manager" 为 PCI IRQ 分配中断向量,并配置 IO APIC 输入以生成该中断向量。请注意(对于 IO APIC 和 MSI)"interrupt vector" 确定 "IRQ priority",因此对于高 speed/latency 敏感设备(例如网卡),您将需要暗示 "high IRQ priority" 的中断向量对于 slower/less 延迟敏感设备(例如 USB 控制器),您需要使用暗示 "lower IRQ priority".

的中断向量

b3) 如果设备将使用 MSI;确定设备需要多少个连续的中断向量;然后使用某种 "interrupt vector manager" 尝试分配设备需要的连续中断向量。请注意,可以为设备提供比它想要的更少的中断。

c) 不管它是如何发生的,您现在知道设备将使用哪个中断 vector/s。启动设备的 suitable 设备驱动程序,并告诉设备驱动程序其设备将使用哪些中断向量(以及哪些 MMIO 区域等)。

注意:分配中断向量的方法比"first come first served"更高级;并且可能没有技术原因说明您以后不能 re-evaluate/re-assign 中断向量作为某种动态优化方案(例如,重新分配中断向量,以便将它们提供给经常使用的 PCI 设备而不是 idle/unused PCI 设备)。