Interrupt GSI
本文将会介绍interrupt中的GSI(Global System Interrupt)概念。
内容源于:Interrupt in Linux。
IRQ 是 PIC 时代的产物,由于 ISA 设备通常是连接到固定的 PIC 管脚,所以说一个设备的 IRQ 实际是指它连接的 PIC 管脚号。IRQ 暗示着中断优先级,例如 IRQ0 比 IRQ3 有着更高的优先级。当前进到 APIC 时代后,或许是出于习惯,人们仍习惯用 IRQ 表示一个设备的中断号,但对于 16 以下的 IRQ,它们可能不再与 IOAPIC 的管脚对应,例如 PIT 此时接的是 2 号管脚。
Pin 是管脚号,通常它表示 IOAPIC 的管脚(前面说了,PIC 时代我们用 IRQ)。Pin 的最大值受 IOAPIC 管脚数限制,目前取值范围是[0,23]。
GSI 是 ACPI 引入的概念,全称是 Global System Interrupt。它为系统中每个中断源指定一个唯一的中断号。下图展示了 GSI 的思想:
上图中有 3 个 IOAPIC:IOAPIC0~2。IOAPIC0 有 24 个管脚,其 GSI base 为 0,每个管脚的GSI=GSI base + pin,故 IOAPIC0的GSI范围为[0~23]。IOAPIC1有16 个管脚,GSI base为 24,GSI 范围为[24,39],依次类推。ACPI 要求 ISA 的 16 个 IRQ 应该被 identify map 到GSI 的[0,15]。
IRQ 和 GSI 在 APIC 系统中常常被混用,实际上对 15 以上的 IRQ,它和 GSI 相等。我们在谈到 IRQ 时,一定要注意它所处的语境。
ISA 中断接 PIC 的 0~15 脚,通常需要 identify mapping 到 GSI 空间。具体的说,ISA 中断应该按接 PIC 的顺序接 0 号 IOAPIC 的 0~15 脚。若平台实现有差异,某个 ISA 中断没有被 identify mapping 的时候,需要一个 ISO 结构来描述。
PIT 接 PIC 的 0 号脚,即 IRQ0。当接 IOAPIC 时,它通常接在 2 号管脚上,即 INTN2。此时需要一个 ISO 来描述此差异,source 字段为 0,GSI 字段为 2(0 号 IOAPIC 的 GSI base为 0)。