各种中断的区别:SCI、SMI、NMI、普通中断
Differences among various interrupts: SCI, SMI, NMI, and normal Interrupt
我正在学习英特尔架构。目前为止遇到过几种类型的中断:
- SCI:System Control Interrupt,硬件用来通知OS ACPI 事件的系统中断。 SCI 是一个有效的、低的、可共享的、电平中断。
- SMI:系统管理中断,一种OS-由遗留系统上的中断事件生成的透明中断。
- NMI:不可屏蔽中断
- 普通中断:通过向量0~255的IDT处理。
有谁能帮忙从以下几个方面比较一下他们的通俗易懂的本质区别吗?
- 它们的用途是什么?
- 它们是如何生成的?
- 我们可以用软件生成它们吗?
- 它们是如何处理的?
加 1
- 所有这些中断类型之间的优先级是什么?
加 2
一些相关话题:
Different ways to to trigger a SMI for a processor
一开始,x86 CPU 有 two pins 可用于通知中断的到来: INTR (中断请求)和NMI(不可屏蔽中断)
虽然图片描绘的是 8086 芯片,但这些引脚一直存在,直到在奔腾时代引入所谓的 LAPIC(详见下文)。
INTR 置位时导致 CPU 从总线读取中断向量(或中断号),中断当前程序并开始执行相关的中断处理程序使用刚刚读取的中断向量。
清除 (E)FLAGS
中的 IF
(中断标志)将 屏蔽中断 ,防止 CPU 中断当前程序。
作为参考,在 INTR 和设备之间通常有一个名为 8259A 的芯片,也称为 PIC(可编程中断控制器)。
NMI 断言时导致 CPU 中断当前程序并开始执行中断向量 2 的中断处理程序。简单地说,断言 NMI 产生中断 2.
清除 IF
不会屏蔽 NMI,但可以在硬件中屏蔽任何进入 NMI 引脚的信号:设置端口 70h 的 MSb would do the trick.
NMIs 背后的想法是将中断分为两类:一类是普通中断,即设备在系统正常运行时使用的中断,以及OS 可能想要掩盖; OS 不想掩盖的另一个由中断造成的类别要严重得多(暂时状态除外)。
NMI产生中断2,所以NMI使用IVT(中断向量Table,用于实模式)或IDT(中断描述符Table,用于保护模式及相关)。
在 DOS 天中断 2 处理程序由 BIOS 设置,这个供应商特定的处理程序读取一组专有的硬件寄存器,检测到错误(如内存 ECC 错误,由于突然拔出而导致的总线错误),并尝试恢复(如重置或 memory scrubbing)。
这个机制在当时是有意义的,因为 OS 与 BIOS 一起工作,能够在不影响 NMI 的情况下执行 cli
是极大的简化。
随着保护模式的出现,为实模式设计的 BIOS 中断 2 处理程序变得毫无用处。
一些内核使用 NMI 来实现内核看门狗定时器,因为 NMI 即使在 cli
.[=26= 之后也会产生中断]
英特尔认识到使用中断来控制固件不再是解决方案,因为可以向 CPU 添加新的执行模式,需要更透明的解决方案。
所以他们创造了SMM(系统管理模式)。
与普通中断相反,SMM 是 CPU 的一种特殊模式,引用英特尔手册 2 第 34 章:
When SMM is invoked through a system management interrupt (SMI), the processor saves the current state of the
processor (the processor’s context), then switches to a separate operating environment defined by a new address
space. The system management software executive (SMI handler) starts execution in that environment, and the
critical code and data of the SMI handler reside in a physical memory region (SMRAM) within that address space.
While in SMM, the processor executes SMI handler code to perform operations such as powering down unused disk
drives or monitors, executing proprietary code, or placing the whole system in a suspended state. When the SMI
handler has completed its operations, it executes a resume (RSM) instruction.
要进入SMM,必须生成SMI(系统管理中断)
The only way to enter SMM is by signaling an SMI through the SMI# pin on the processor or through an SMI message received through the APIC bus.
而SMI中的I代表中断断言 SMI# 不会产生上述意义上的中断。
SMI 是在保护模式流行的时候随 386 的更高版本引入的。
它已被用于透明地转换硬件接口,例如,英特尔芯片组可以编程为在访问端口 60h-64h 时生成 SMI,以便为 USB 设备提供传统支持。
这些是处理鼠标和键盘的标准 PS2 端口; SMM 代码透明地读取端口 60h-64h 的值,并将这些访问适当地转换为 USB 访问。
随着Pentium的出现,Intel推出了LAPIC(Local Advanced Programmable Interrupt Controller),INTR和NMI都没有了,替换为 LINT0 和 LINT1(本地中断)。
LINT0 和 LINT1 是 可编程引脚 ,来自英特尔手册 2 第 10 章:
重置时 LINT0 配置为 INTR 并且 LINT1 配置为 NMI 用于向后兼容。
路由中断和赋予它们优先级的复杂性已转移到 CPU 外部硬件。
每个设备或平台都使用自定义布线,例如 PCI devices had their pins for interrupts crossed 以最大程度地减少污染。
IOAPIC with its hierarchical layout and of the [MSI]s(https://en.wikipedia.org/wiki/Message_Signaled_Interrupts) 的出现在中断处理中增加了更多的功能层。
同时,人们认识到使用 SMI 将 OS 排除在管理决策之外并不是一个好主意:
OS 可以禁用或限制处理器或设备,可以报告、记录、关闭。
在没有来自固件的标准化信息支持的情况下处理硬件的复杂性以及使管理程序的 OS 部分达到 ACPI 规范的需要。
ACPI 没有依赖 OS 像 SMM 这样的不可见模式,而是定义了一个可解释的字节码(AML) .
OS负责执行,固件开发者负责编写。
ACPI 设计者决定使用一个普通的中断,SCI(系统控制中断),以请求 OS 的注意,这个中断可以发出信号以任何方式,但必须由 OS 而不是固件处理。
引用 ACPI 规范:
The device can signal an SCI
to inform the OS of changes in power status. For example, a device can trigger an interrupt to inform
the OS that the battery has reached low power level
SCI是一个普通中断,它的vector(read: number)在其中一个ACPI table/structure.
中被报告
SCI向量可以通过对芯片组进行编程来配置,我上次阅读一些datasheet/table时使用的常用值是9。
在 SCI 之后,OS 通常会确定此类中断的来源并执行适当的操作,通常这涉及在进程中执行一些 AML 代码。
硬件中断可以通过两种方式由软件"generated",具体取决于"generated"的含义:
软件可以"stimulate"硬件
例如,可以将定时器编程为立即到期以触发其中断。
这可以与上述任何中断源一起使用,NMI/SMI 有点棘手:LINT0 需要适当编程。
软件可以执行中断处理程序。
这可以用所有的中断源来完成,但是 SMI,SMI 只能在硬件事件时作为内存进入 SMM 代码驻留不在 SMM 中时未映射。
注意,OS通常期望在特定的硬件状态下产生硬件中断,如果找不到原因通常将中断归类为spurious,并非所有 OS/handler 都能很好地处理虚假中断。
优先事项
第 3 版 Intel 手册的第 6.9 章报告了中断优先级
1 (Highest) Hardware Reset and Machine Checks
- RESET
- Machine Check
2 Trap on Task Switch
- T flag in TSS is set
3 External Hardware Interventions
- FLUSH
- STOPCLK
- SMI
- INIT
4 Traps on the Previous Instruction
- Breakpoints
- Debug Trap Exceptions (TF flag set or data/I-O breakpoint)
5 Nonmaskable Interrupts (NMI)
6 Maskable Hardware Interrupts
7 Code Breakpoint Fault
8 Faults from Fetching Next Instruction
- Code-Segment Limit Violation
- Code Page Fault
9 Faults from Decoding the Next Instruction
- Instruction length > 15 bytes
- Invalid Opcode
- Coprocessor Not Available
10 (Lowest) Faults on Executing an Instruction
- Overflow
- Bound error
- Invalid TSS
- Segment Not Present
- Stack fault
- General Protection
- Data Page Fault
- Alignment Check
- x87 FPU Floating-point exception
- SIMD floating-point exception
- Virtualization exception
因此,考虑到 SCI 只是一个普通中断,排序是
正常 interrupt/SCI < NMI < SMI
注意在"same"次发生多个中断时使用此顺序
在服务 NMI 或 SMI 时,可以启用和服务正常/SCI 中断。
我正在学习英特尔架构。目前为止遇到过几种类型的中断:
- SCI:System Control Interrupt,硬件用来通知OS ACPI 事件的系统中断。 SCI 是一个有效的、低的、可共享的、电平中断。
- SMI:系统管理中断,一种OS-由遗留系统上的中断事件生成的透明中断。
- NMI:不可屏蔽中断
- 普通中断:通过向量0~255的IDT处理。
有谁能帮忙从以下几个方面比较一下他们的通俗易懂的本质区别吗?
- 它们的用途是什么?
- 它们是如何生成的?
- 我们可以用软件生成它们吗?
- 它们是如何处理的?
加 1
- 所有这些中断类型之间的优先级是什么?
加 2
一些相关话题:
Different ways to to trigger a SMI for a processor
一开始,x86 CPU 有 two pins 可用于通知中断的到来: INTR (中断请求)和NMI(不可屏蔽中断)
虽然图片描绘的是 8086 芯片,但这些引脚一直存在,直到在奔腾时代引入所谓的 LAPIC(详见下文)。
INTR 置位时导致 CPU 从总线读取中断向量(或中断号),中断当前程序并开始执行相关的中断处理程序使用刚刚读取的中断向量。
清除 (E)FLAGS
中的 IF
(中断标志)将 屏蔽中断 ,防止 CPU 中断当前程序。
作为参考,在 INTR 和设备之间通常有一个名为 8259A 的芯片,也称为 PIC(可编程中断控制器)。
NMI 断言时导致 CPU 中断当前程序并开始执行中断向量 2 的中断处理程序。简单地说,断言 NMI 产生中断 2.
清除 IF
不会屏蔽 NMI,但可以在硬件中屏蔽任何进入 NMI 引脚的信号:设置端口 70h 的 MSb would do the trick.
NMIs 背后的想法是将中断分为两类:一类是普通中断,即设备在系统正常运行时使用的中断,以及OS 可能想要掩盖; OS 不想掩盖的另一个由中断造成的类别要严重得多(暂时状态除外)。
NMI产生中断2,所以NMI使用IVT(中断向量Table,用于实模式)或IDT(中断描述符Table,用于保护模式及相关)。
在 DOS 天中断 2 处理程序由 BIOS 设置,这个供应商特定的处理程序读取一组专有的硬件寄存器,检测到错误(如内存 ECC 错误,由于突然拔出而导致的总线错误),并尝试恢复(如重置或 memory scrubbing)。
这个机制在当时是有意义的,因为 OS 与 BIOS 一起工作,能够在不影响 NMI 的情况下执行 cli
是极大的简化。
随着保护模式的出现,为实模式设计的 BIOS 中断 2 处理程序变得毫无用处。
一些内核使用 NMI 来实现内核看门狗定时器,因为 NMI 即使在 cli
.[=26= 之后也会产生中断]
英特尔认识到使用中断来控制固件不再是解决方案,因为可以向 CPU 添加新的执行模式,需要更透明的解决方案。
所以他们创造了SMM(系统管理模式)。
与普通中断相反,SMM 是 CPU 的一种特殊模式,引用英特尔手册 2 第 34 章:
When SMM is invoked through a system management interrupt (SMI), the processor saves the current state of the processor (the processor’s context), then switches to a separate operating environment defined by a new address space. The system management software executive (SMI handler) starts execution in that environment, and the critical code and data of the SMI handler reside in a physical memory region (SMRAM) within that address space. While in SMM, the processor executes SMI handler code to perform operations such as powering down unused disk drives or monitors, executing proprietary code, or placing the whole system in a suspended state. When the SMI handler has completed its operations, it executes a resume (RSM) instruction.
要进入SMM,必须生成SMI(系统管理中断)
The only way to enter SMM is by signaling an SMI through the SMI# pin on the processor or through an SMI message received through the APIC bus.
而SMI中的I代表中断断言 SMI# 不会产生上述意义上的中断。
SMI 是在保护模式流行的时候随 386 的更高版本引入的。
它已被用于透明地转换硬件接口,例如,英特尔芯片组可以编程为在访问端口 60h-64h 时生成 SMI,以便为 USB 设备提供传统支持。
这些是处理鼠标和键盘的标准 PS2 端口; SMM 代码透明地读取端口 60h-64h 的值,并将这些访问适当地转换为 USB 访问。
随着Pentium的出现,Intel推出了LAPIC(Local Advanced Programmable Interrupt Controller),INTR和NMI都没有了,替换为 LINT0 和 LINT1(本地中断)。
LINT0 和 LINT1 是 可编程引脚 ,来自英特尔手册 2 第 10 章:
重置时 LINT0 配置为 INTR 并且 LINT1 配置为 NMI 用于向后兼容。
路由中断和赋予它们优先级的复杂性已转移到 CPU 外部硬件。
每个设备或平台都使用自定义布线,例如 PCI devices had their pins for interrupts crossed 以最大程度地减少污染。
IOAPIC with its hierarchical layout and of the [MSI]s(https://en.wikipedia.org/wiki/Message_Signaled_Interrupts) 的出现在中断处理中增加了更多的功能层。
同时,人们认识到使用 SMI 将 OS 排除在管理决策之外并不是一个好主意:
OS 可以禁用或限制处理器或设备,可以报告、记录、关闭。
在没有来自固件的标准化信息支持的情况下处理硬件的复杂性以及使管理程序的 OS 部分达到 ACPI 规范的需要。
ACPI 没有依赖 OS 像 SMM 这样的不可见模式,而是定义了一个可解释的字节码(AML) .
OS负责执行,固件开发者负责编写。
ACPI 设计者决定使用一个普通的中断,SCI(系统控制中断),以请求 OS 的注意,这个中断可以发出信号以任何方式,但必须由 OS 而不是固件处理。
引用 ACPI 规范:
The device can signal an SCI to inform the OS of changes in power status. For example, a device can trigger an interrupt to inform the OS that the battery has reached low power level
SCI是一个普通中断,它的vector(read: number)在其中一个ACPI table/structure.
中被报告
SCI向量可以通过对芯片组进行编程来配置,我上次阅读一些datasheet/table时使用的常用值是9。
在 SCI 之后,OS 通常会确定此类中断的来源并执行适当的操作,通常这涉及在进程中执行一些 AML 代码。
硬件中断可以通过两种方式由软件"generated",具体取决于"generated"的含义:
软件可以"stimulate"硬件
例如,可以将定时器编程为立即到期以触发其中断。
这可以与上述任何中断源一起使用,NMI/SMI 有点棘手:LINT0 需要适当编程。软件可以执行中断处理程序。 这可以用所有的中断源来完成,但是 SMI,SMI 只能在硬件事件时作为内存进入 SMM 代码驻留不在 SMM 中时未映射。
注意,OS通常期望在特定的硬件状态下产生硬件中断,如果找不到原因通常将中断归类为spurious,并非所有 OS/handler 都能很好地处理虚假中断。
优先事项
第 3 版 Intel 手册的第 6.9 章报告了中断优先级
1 (Highest) Hardware Reset and Machine Checks
- RESET
- Machine Check
2 Trap on Task Switch
- T flag in TSS is set
3 External Hardware Interventions
- FLUSH
- STOPCLK
- SMI
- INIT
4 Traps on the Previous Instruction
- Breakpoints
- Debug Trap Exceptions (TF flag set or data/I-O breakpoint)
5 Nonmaskable Interrupts (NMI)
6 Maskable Hardware Interrupts
7 Code Breakpoint Fault
8 Faults from Fetching Next Instruction
- Code-Segment Limit Violation
- Code Page Fault
9 Faults from Decoding the Next Instruction
- Instruction length > 15 bytes
- Invalid Opcode
- Coprocessor Not Available
10 (Lowest) Faults on Executing an Instruction
- Overflow
- Bound error
- Invalid TSS
- Segment Not Present
- Stack fault
- General Protection
- Data Page Fault
- Alignment Check
- x87 FPU Floating-point exception
- SIMD floating-point exception
- Virtualization exception
因此,考虑到 SCI 只是一个普通中断,排序是
正常 interrupt/SCI < NMI < SMI
注意在"same"次发生多个中断时使用此顺序
在服务 NMI 或 SMI 时,可以启用和服务正常/SCI 中断。