Operating system 如何确定I/O APIC上的中断源?

Operating system 如何确定I/O APIC上的中断源?,operating-system,acpi,apic,Operating System,Acpi,Apic,据我所知,I/O APIC芯片有24个引脚,通常单芯片系统将分别映射引脚0~23 IRQ 32~55。此外,我可以编辑相关的RTE来分配中断处理函数 但是,我如何计算每个管脚上的I/O APIC中断源呢 我知道它与ACPI有关,但在细节上我应该如何做,它是否映射到某个ACPI表上?或者我应该用反洗钱检查一下 非常感谢 一般步骤(对于现代操作系统)包括: 准备 a) 解析ACPI“APIC/MADT”表以确定是否存在PIC芯片(PCAT_COMPAT标志)、有多少IO APIC以及每个IO API

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

但是,我如何计算每个管脚上的I/O APIC中断源呢

我知道它与ACPI有关,但在细节上我应该如何做,它是否映射到某个ACPI表上?或者我应该用反洗钱检查一下

非常感谢

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

准备

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

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

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

d) 如果存在PIC芯片;屏蔽PIC芯片中的所有IRQ,然后重新配置PIC芯片(设置您希望它们使用的任何“基本向量号”——例如,主PIC为中断向量32至39,从PIC为向量40至47)。如果存在IO APIC,请屏蔽每个IO APIC中的所有IRQ。注意:如果PIC芯片存在,它们都有一个无法屏蔽的“伪IRQ”,因此如果您不想使用PIC芯片,那么重新配置PIC芯片仍然是一个好主意,这样它们的伪IRQ(以及它们的中断处理程序)就不会碍事

e) 使用ACPI AML解释器执行
\u 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解释器执行
\u 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设备)。

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

准备

a) 解析ACPI“APIC/MADT”表以确定是否存在PIC芯片(PCAT_COMPAT标志)、有多少IO APIC以及每个IO APIC有多少输入。如果ACPI不存在,您可能希望尝试搜索/解析较旧的“MultiProcessor Spec.”表并提取相同的信息;但是,如果ACPI确实存在,“多处理器规范”表可能被设计为提供一个“最小存根”,它不包含任何实际信息(因此您必须首先检查ACPI,如果存在,则首选使用ACPI),并且可能不值得