关于x86:各种中断之间的差异:SCI,SMI,NMI和常规中断

Differences among various interrupts: SCI, SMI, NMI, and normal Interrupt

我正在学习英特尔架构。到目前为止,我已经遇到了几种类型的中断:

  • SCI:系统控制中断,硬件用来通知OS ACPI事件的系统中断。 SCI是一个活动的,低电平,可共享的电平中断。
  • SMI:系统管理中断,由旧系统上的中断事件生成的OS透明中断。
  • NMI:不可屏蔽的中断
  • 正常中断:通过IDT处理,向量0?255。

从以下几个方面,任何人都可以帮助用简单的词语来比较它们的本质区别吗?

  • 如何使用它们?
  • 它们是如何产生的?
  • 我们可以用软件生成它们吗?
  • 它们是如何处理的?

加1

  • 所有这些中断类型之间的优先级是多少?

加2

一些相关的线程:

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

触发处理器的SMI的不同方法


最初,x86 CPU有两个可用于通知中断传入的引脚:INTR(中断请求)和NMI(不可屏蔽中断)

INTR and NMI pins are on the lower left edge of the chip

虽然该图描绘了8086芯片,但这些引脚一直缠住,直到奔腾时代引入了称为LAPIC的芯片(下文有更多介绍)。

INTR置为有效时,导致CPU从总线读取中断向量(或中断号),中断当前程序并开始执行与刚刚读取的中断向量相关的中断处理程序。
清除(E)FLAGS中的IF(中断标志)将屏蔽这些中断,从而防止CPU中断当前程序。

作为说明,在INTR和设备之间通常有一个称为8259A的芯片,也称为PIC(可编程中断控制器)。

NMI置为有效时,导致CPU中断当前程序并开始执行中断向量2的中断处理程序。简单来说,置为NMI会生成中断2。
清除IF不会掩盖NMI,但是可以掩盖硬件中去往NMI引脚的任何信号:设置端口70h的MSb可以解决问题。

NMI背后的想法是将中断分为两类:一类是由普通中断组成,一种是在系统正常运行时设备使用的中断,另一类是OS可能希望屏蔽的中断。中断造成的另一种情况则更为严重,即操作系统不希望屏蔽(过渡状态除外)。

NMI生成中断2,因此NMI使用IVT(在实模式下使用的中断向量表)或IDT(在保护模式下使用的中断描述符表及相关表)。

在DOS时代,BIOS设置了中断2处理程序,该特定于供应商的处理程序读取一组专有的硬件寄存器,检测到该错误(例如内存ECC错误,由于突然拔出而导致的总线错误),以及尝试恢复(例如重置或内存清理)。

当时这种机制很有意义,因为OS与BIOS协同工作,能够在不影响NMI的情况下执行cli极大地简化了。

随着保护模式的出现,用于实模式的BIOS中断2处理程序变得无用。
一些内核使用NMI来实现内核监视程序计时器,因为即使在cli

之后,也会生成NMI中断。

英特尔意识到使用中断来控制固件已不再是一种解决方案,因为可以将新的执行模式添加到CPU中,因此需要一种更加透明的解决方案。
因此,他们创建了SMM(系统管理模式)。

与正常中断相反,SMM是CPU的一种特殊模式,引用了Intel手册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的更高版本中引入的,恰好是在保护模式流行时。
它已用于透明地转换硬件接口,例如,可以对Intel芯片组进行编程,以在访问端口60h-64h时生成SMI,从而为USB设备提供传统支持。
这些是用于处理鼠标和键盘的标准PS2端口。 SMM代码透明地读取端口60h-64h的值,并将这些访问适当转换为USB访问。

随着奔腾的问世,英特尔推出了LAPIC(本地高级可编程中断控制器),INTR和NMI消失了,取而代之的是LINT0和LINT1(本地中断)。
LINT0和LINT1是可编程引脚,来自Intel手册2第10章:

Configurable LINT0 and LINT1 pins

在复位时,为了向后兼容,LINT0被配置为INTR,LINT1被配置为NMI。

路由中断并为其赋予优先级的复杂性已经转移到CPU外部的硬件上。
每个设备或平台都使用自定义布线,例如,PCI设备的交叉插针用于中断,以最大程度地减少污染。
IOAPIC的分层布局和[MSI] s(https://en.wikipedia.org/wiki/Message_Signaled_Interrupts)的出现在中断处理中增加了更多的功能层。

同时,人们认识到通过使用SMI将OS置于管理决策之外并不是一个好主意:
操作系统可以禁用或限制处理器或设备,可以报告,记录,关闭。

在没有固件的标准化信息支持的情况下处理硬件的复杂性以及将OS纳入管理程序的一部分的要求达到了ACPI规范的要求。

ACPI定义了可解释的字节码(AML),而不是依赖于SMM等操作系统的不可见模式。
操作系统负责执行,固件开发人员负责编写。

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是正常中断,其向量(读取:数字)在ACPI表/结构之一中报告。
可以通过对芯片组进行编程来配置SCI向量,这是我上次读取某些数据表/表格时使用的通用值是9。

在SCI上,操作系统通常确定此类中断的源并执行适当的操作,通常这涉及在过程中执行一些AML代码。

可以通过两种方式通过软件"生成"硬件中断,具体取决于"生成"的含义:

  • 该软件可以"刺激"硬件。
    例如,可以将计时器编程为立即到期以触发其中断。
    可以将其与上述任何中断源一起使用,NMI / SMI有点棘手:需要对LINT0进行适当的编程。

  • 该软件可以执行中断处理程序。
    可以使用所有中断源来完成此操作,但是SMI,SMI仅在发生硬件事件时才能输入,因为不在SMM中时未映射SMM代码所驻留的内存。

请注意,操作系统通常希望在特定硬件状态下生成硬件中断,如果找不到原因,则通常将中断归类为伪中断,并非所有OS /处理程序都能很好地处理伪中断。

优先事项

第三本英特尔手册的第6.9章报告了中断优先级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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只是一个正常的中断,其顺序为

正常中断/ SCI

请注意,在"相同"时间发生多个中断时,将使用此顺序。
在服务NMI或在SMI中时,可以启用和服务正常/ SCI中断。