首页 > 解决方案 > 如何找出 I/O APIC 上的中断源?

问题描述

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

但是我怎样才能找出每个 PIN 上的 I/O APIC 中断源呢?

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

非常感谢你!!

标签: operating-systemacpiapic

解决方案


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

准备

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

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

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

d) 如果存在 PIC 芯片;屏蔽 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 设备的“bus:device:function”地址和它使用的“中断引脚”)来确定 PCI IRQ 连接的位置(例如,哪个全局中断,它确定哪个 IO APIC 的哪个输入)。然后; 如果您还没有(因为同一中断线由不同的设备共享)使用某种“中断向量管理器”为 PCI IRQ 分配中断向量,并配置 IO APIC 输入以生成该中断向量。请注意(对于 IO APIC 和 MSI)“中断向量”确定“IRQ 优先级”,因此对于高速/延迟敏感设备(例如网卡),您需要暗示“

b3) 如果设备将使用 MSI;确定设备需要多少个连续中断向量;然后使用某种“中断向量管理器”来尝试分配设备需要的尽可能多的连续中断向量。请注意,可以为设备提供比它想要的更少的中断。

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

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


推荐阅读