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



我知道I/O APIC 芯片有 24 个引脚,通常单芯片系统会映射引脚 0~23 IRQ 32~55 分别。此外,我可以编辑相关的 RTE 来分配中断处理程序函数。

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

我知道它与 ACPI有关,但详细我应该怎么做,它是否映射到某个 ACPI 表上? 或者我应该使用 AML 来检查它??

谢谢!!

一般步骤(对于现代操作系统)是:

制备

a) 解析 ACPI"APIC/MADT"表以确定是否存在 PIC 芯片(PCAT_COMPAT标志)、有多少 IO APIC 以及每个 IO APIC 有多少输入。如果 ACPI 不存在,您可能需要尝试搜索/分析较旧的"多处理器规范"表并提取相同的信息;但是,如果 ACPI 确实存在,则"多处理器规范"表可能旨在提供不包含实际信息的"最小存根"(因此您必须首先检查 ACPI,如果存在,则首选使用 ACPI),并且可能不值得支持不支持 ACPI 的系统(特别是如果操作系统需要 64 位 CPU, 等)。

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

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

d) 如果存在事先知情同意芯片;屏蔽PIC芯片中的所有IRQ,然后重新配置PIC芯片(设置您希望它们使用的任何"基向量数" - 例如,可能使主PIC是中断向量32至39,从是向量40至47)。如果存在 IO APIC/s,请屏蔽每个 IO APIC 中的所有 IRQ。注意:如果PIC芯片存在,它们都有一个无法屏蔽的"杂散IRQ",所以如果你不想使用PIC芯片,重新配置PIC芯片仍然是一个好主意,这样它们的杂散IRQ(以及它们的中断处理程序)就不会妨碍。

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

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

设备

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

a) 找出设备的详细信息(例如,使用 PCI 配置空间中的"类、子类和编程接口"字段来确定设备是什么),并检查您是否真的有该设备驱动程序;并决定是希望设备使用 PCI IRQ 还是 MSI。

B1)如果设备将使用 PCI IRQ,并且操作系统使用的是 PIC 芯片(而不是 IO APIC);从设备的 PCI 配置空间中获取"中断线"字段,并通过向其添加相应 PIC 芯片的"基本中断向量"来确定它将是哪个中断向量。

b2)如果设备将使用PCI IRQ(而不是MSI),并且操作系统使用的是IO APIC而不是PIC;通过从设备的 PCI 配置空间读取"中断引脚"字段,确定设备使用的"PCI 插槽上的中断引脚"。然后使用 ACPI AML 解释器执行_PRT对象并获取当前(不要忘记 PCI-E 支持"热插拔")PCI IRQ 路由表。使用此表(以及PCI设备的"总线:设备:功能"地址及其使用的"中断引脚")来确定PCI IRQ的连接位置(例如,哪个全局中断,哪个确定哪个IO APIC的哪个输入)。然后;如果您还没有(因为同一中断线由不同的设备共享),请使用某种"中断向量管理器"为 PCI IRQ 分配中断向量,并配置 IO APIC 输入以生成该中断向量。请注意,(对于IO APIC和MSI)"中断向量"决定了"IRQ优先级",因此对于高速/延迟敏感设备(例如网卡),您需要暗示"高IRQ优先级"的中断向量,对于较慢/延迟较少的敏感设备(例如USB控制器),您需要使用暗示"较低IRQ优先级"的中断向量。

b3)如果设备将使用 MSI;确定设备需要多少个连续的中断向量;然后使用某种"中断向量管理器"来尝试分配设备所需的任意数量的连续中断向量。请注意,给设备的中断可能比它想要的少。

c) 无论它是如何发生的,您现在都知道设备将使用哪个中断向量。启动适合该设备的设备驱动程序,并告诉设备驱动程序其设备将使用哪些中断向量(以及哪些 MMIO 区域等)。

注意:有比"先到先得"更高级的方法来分配中断向量;并且可能没有技术原因为什么您以后不能重新评估/重新分配中断向量作为某种动态优化方案(例如,重新分配中断向量,以便将它们提供给经常使用的PCI设备而不是空闲/未使用的PCI设备)。

最新更新