gpt4 book ai didi

x86 - 各种中断的区别 : SCI, SMI、NMI、普通中断

转载 作者:行者123 更新时间:2023-12-04 09:34:33 31 4
gpt4 key购买 nike

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

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

  • 谁能帮忙从以下几个方面用通俗的话比较一下他们的本质区别?
  • 它们打算如何使用?
  • 它们是如何产生的?
  • 可以用软件生成吗?
  • 它们是如何处理的?

  • 添加 1
  • 所有这些中断类型之间的优先级是什么?

  • 添加 2

    一些相关的线程:

    How SCI - System Cotnrol Interrupt vector is defined?

    Different ways to to trigger a SMI for a processor

    最佳答案

    一开始,x86 CPU 有 two pins 可用于通知中断的传入:INTR(中断请求)和 NMI(不可屏蔽中断)

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

    虽然图片描绘的是 8086 芯片,但这些引脚一直存在,直到在奔腾时代引入所谓的 LAPIC(更多内容见下文)。

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

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

    NMI 置位时会导致 CPU 中断当前程序并开始执行中断向量 2 的中断处理程序。 简单地说,置位 NMI 会生成中断 2。
    清除 IF 不会屏蔽 NMI,但可以在硬件中屏蔽任何进入 NMI 引脚的信号:设置端口 70h 的 MSb would do the trick

    NMI 背后的想法是将中断分为两类:一类由普通中断组成,一类是由设备在系统正常运行下使用的中断,并且操作系统可能想要屏蔽;由中断造成的另一个类别更严重,操作系统不想屏蔽(过渡状态除外)。

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

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

    这种机制在当时是有意义的,因为操作系统与 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 的更高版本中引入的,就在保护模式变得流行的时候。
    它已被用于透明地转换硬件接口(interface),例如,可以对 Intel 芯片组进行编程以在访问端口 60h-64h 时生成 SMI,以便为 USB 设备提供传统支持。
    这些是处理鼠标和键盘的标准 PS2 端口; SMM 代码透明地读取端口 60h-64h 的值,并将这些访问适本地转换为 USB 访问。

    随着Pentium的出现,Intel推出了LAPIC(Local Advanced Programmable Interrupt Controller),INTR和NMI都没有了,取而代之的是LINT0和LINT1(Local Interrupt)。
    LINT0 和 LINT1 是可编程引脚,来自 Intel 手册 2 的第 10 章:

    Configurable LINT0 and LINT1 pins

    复位时,LINT0 被配置为 INTR,LINT1 被配置为 NMI,以实现向后兼容。

    路由中断并赋予它们优先级的复杂性已转移到 CPU 外部的硬件上。
    每个设备或平台都使用自定义接线,例如 PCI devices had their pins for interrupts crossed,以最大程度地减少污染。
    IOAPIC with its hierarchical layout 和 [MSI]s( https://en.wikipedia.org/wiki/Message_Signaled_Interrupts)的出现在中断处理中增加了更多的功能层。

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

    在没有来自固件的标准化信息支持的情况下处理硬件的复杂性以及将操作系统作为管理程序的一部分的需要最终形成了 ACPI 规范。

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

    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 中时不会被映射。

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

    优先事项

    第三个英特尔手册的第 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 只是一个正常的中断,排序是

    正常中断/SCI < NMI < SMI

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

    关于x86 - 各种中断的区别 : SCI, SMI、NMI、普通中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40583848/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com