根据ACPI规范, FADT (固定ACPI描述表)表包含一个向OS报告 SCI中断编号的字段。该字段定义如下:
我将FADT表转储到Intel x86平台上,并看到SCI中断与号码9
相关联:
但根据英特尔手册,0-31
是IA架构定义的中断的保留向量。具体而言,9
定义为:
因此,根据说明,在I386处理器之后不会生成9
。所以我猜这就是为什么9可以 抢救 用于SCI。这可以被视为ACPI规范的 x86特定实现。
我是对的吗?
似乎我在这里误解了一些东西。稍后会更新。
答案 0 :(得分:5)
在整个ACPI specifications中,使用中断机制的每个通知事件都与Global System Interrupt (GSI)相关联。
GSI在前面 1 链接的6.1 ACPI规范的 5.2.13全局系统中断部分中进行了简要描述。
全局系统中断可以被视为ACPI即插即用IRQ号码 他们习惯了 虚拟化表和ASL方法中的中断,这些方法执行中断的资源分配。
规范使用术语系统向量来表示GSI的编号 例如,GSI编号9具有系统矢量编号9 这无疑令人困惑,因为术语“向量”可能被误认为是英特尔手册中使用的“中断向量”中的“向量”一词。
要了解GSI,必须具有最低限度的理解或IRQ x86系统上的两个标准中断控制器是
8259A PIC [datasheet] [OSDev wiki]
标准IO地址总是有两个PIC,每个PIC有8个输入引脚(IR 0-7)
一个PIC是主站并处理IRQ 0-7
另一个是从机并处理IRQ 8-15,其输出转到主机 2 的IR2。
IO APIC [datasheet] [OSDev wiki] 。
不要将IO APIC与LAPIC混淆。
可以有一个或多个IO APIC,所有内存都映射到可变(但通常是固定的)地址,每个地址都有可变数量的输入引脚INTINx。
通常,IO APIC中的一个连线并配置为模拟PIC,INTIN0-15映射到IRQ0-15,但这不是必需的。
消息信号中断 [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
请注意,映射基准08h的第一个IRQ是IBM的错误(英特尔将前32个中断向量标记为保留)。
一旦知道了IRQ编号就很容易获得INT编号,操作系统通常可以很容易地为此目的制作一个表,因为它是众所周知的(或者可以用ACPI表知道)中断控制器是如何连接的到CPU。
将IRQ与设备关联(称为中断路由的过程)非常复杂,因为它需要了解设备的连接方式,ACPI规范使用GSI来简化这一方面。
最后,GSI(或ACPI字,系统向量)必须映射到IRQ,这在PIC模式下或通过分配GSI基础以一对一的方式完成(系统向量库)到每个IO APIC - 从而将所有GSI从基数分配给引脚数减1。
考虑到这一切,我们终于可以理解SCI_INT
字段的描述:
SCI中断在8259模式下连接的系统向量。上 系统不包含8259,此字段包含 全局系统中断SCI中断号。
我认为文本不精确,全局系统中断号只是系统向量的另一个名称,因此整个文本缩减为“SCI中断的系统向量” ”。
SCI,作为系统向量编号,它具有GSI的性质,因此您找到的数字9是IRQ 9 4 。 默认情况下,IRQ 9是INT 71h,但任何使用ACPI的操作系统肯定已将IRQ重新映射到不同的基础,并且确实避免了与处理器异常的任何冲突。
长话短说,数字9不是中断向量,而是系统向量(由ACPI定义)。
GSI <----> IRQ <----> INT
System vector Interrupt vector
1 写作时的最新消息
按照它配置的 2 ,8259A的设计考虑了链接
3 在所有LAPIC中共享,但可以重新映射,特别是对于非SMP系统,以避免跨越QPI链接。
4 我们知道,并非严格意义上说,在APIC模式下,GSI 9可以由不处理ISA IRQ的IO APIC处理。