SCI - 系统控制中断向量是如何定义的?

How SCI - System Control Interrupt vector is defined?

根据 ACPI 规范,FADT(固定 ACPI 描述 Table)table 包含报告 SCI 的字段中断 号改为OS。该字段定义如下:

我将 FADT table 转储到 Intel x86 平台上,看到 SCI 中断与数字 9:

相关联

但是根据 Intel 手册,0-31 是 IA 架构定义中断的保留向量。具体来说,9 定义为:

所以,根据注释,9不是在I386处理器之后生成的。所以我想这就是为什么9可以被挽救用于SCI。这可以看作是 ACPI 规范的 x86 特定实现

我说得对吗?

加 1

我好像误解了什么。稍后更新。

整个 ACPI specifications every notification event that uses the interrupting mechanism gets associated with a Global System Interrupt (GSI).
GSI 在 6.1 ACPI 规范 link 之前1.[=19= 的 5.2.13 全局系统中断 部分进行了简要描述]

Global System Interrupts can be thought of as ACPI Plug and Play IRQ numbers.
They are used to virtualize interrupts in tables and in ASL methods that perform resource allocation of interrupts.

规范使用术语系统向量来表示 GSI 的编号。
例如,GSI 编号 9 的系统矢量编号为 9。
这确实令人困惑,因为术语 "vector" 可能会被误认为是英特尔手册中使用的 "interrupt vector" 中的术语 "vector"。

要了解 GSI,必须至少了解 IRQ。
x86 系统上的两个标准中断控制器是

  1. 8259A PIC [datasheet] [OSDev wiki]
    总是有两个 PIC,在标准 IO 地址,每个都有八个输入引脚(IR 0-7)。
    一个 PIC 为主并处理 IRQ 0-7。
    另一个是slave,处理IRQ 8-15,它的输出到master2.

  2. 的IR2
  3. IO APIC [datasheet] [OSDev wiki].
    不要混淆 IO APIC 和 LAPIC。

    可以有一个或多个 IO APIC,所有内存都映射到可变(但通常是固定的)地址,每个都有可变数量的输入引脚 INTINx。
    通常,其中一个 IO APIC 已连接并配置为模拟 PIC,INTIN0-15 映射到 IRQ0-15,但这不是必需的。

  4. 消息信号中断[OSDev forum thread]
    这不是中断控制器(因此它不计入计数)但值得一提。
    PIC是第一代控制器,IO APIC是第二代,MSI是第三代。
    它们被实现为对特定内存地址的写入,因此不需要控制器。
    在 x86 系统上,PCI(e) 设备配置为写入 LAPIC 专用区域3.

中断控制器与 LAPIC 一起被配置为将 IRQ 编号映射到向量编号。
PIC 的标准配置是

IRQ 0-7  -> INT 08h - 0fh  
IRQ 8-15 -> INT 70h - 77h  

请注意,将第一个 IRQ 映射到基址 08h 是 IBM 的一个错误(Intel 将前 32 个中断向量标记为保留)。

一旦知道 IRQ 号就很容易得到 INT 号,OS 通常可以很容易地为此目的制作一个 table 因为它是众所周知的(或者可以通过ACPI tables) 中断控制器如何连接到 CPU。

将 IRQ 关联到设备(称为中断路由的过程)非常复杂,因为它需要了解设备的连接方式,ACPI 规范使用 GSI 来简化这方面的工作。

最后,GSI(或者用 ACPI 术语来说,系统向量)必须映射到 IRQ,这在 PIC 模式下以一对一的方式完成,或者通过为每个 IO APIC 分配一个 GSI 基数(系统向量基数)——从而将所有 GSI 从基数分配到引脚数减一。


考虑到这一切,我们终于可以理解SCI_INT字段的描述了:

System vector the SCI interrupt is wired to in 8259 mode. On systems that do not contain the 8259, this field contains the Global System interrupt number of the SCI interrupt.

我认为文本不够精确,全局系统中断号只是系统向量的别名,因此整个文本减少了至 "System vector for the SCI interrupt"。

SCI是一个系统向量号,它具有GSI的性质,所以你找到的数字9是IRQ 94。 默认情况下,IRQ 9 是 INT 71h,但任何使用 ACPI 的 OS 肯定已经将 IRQ 重新映射到不同的基数,并且肯定避免了与处理器异常的任何冲突。

长话短说,数字 9 不是 中断向量,而是 系统向量(由 ACPI 定义)。

     GSI        <---->   IRQ     <---->           INT
System vector                                Interrupt vector

1撰写本文时最新的。
2 8259A 的设计考虑到了链接。
3 由所有 LAPIC 共享,但可以重新映射,特别是对于非 SMP 系统,以避免跨越 QPI link.
4 正如我们所知,在 APIC 模式下,GSI 9 可以由不处理 ISA IRQ 的 IO APIC 处理。