smw*_*dia 6 x86 interrupt interrupt-handling
我正在学习英特尔架构.到目前为止,我遇到了几种类型的中断:
任何人都可以从下面的方面帮助比较他们在简单单词中的本质区别?
一些相关的主题:
Mar*_*oom 18
开始时,x86 CPU有两个引脚可用于通知中断的输入:INTR(中断请求)和NMI(不可屏蔽中断)
虽然图片描绘了一个8086芯片,但这些引脚一直存在,直到Pentium时代引入所谓的LAPIC(下面有更多内容).
置位时INTR导致CPU从总线读取中断向量(或中断号),中断当前程序并开始执行与刚读取的中断向量相关的中断处理程序.
清除IF(中断标志)(E)FLAGS将屏蔽中断,防止CPU中断当前程序.
作为资料提示,在INTR和器件之间通常有一个名为8259A的芯片,也称为PIC(可编程中断控制器).
断言时NMI导致CPU中断当前程序并开始执行中断向量2的中断处理程序.简单地说,断言NMI产生中断2.
清除IF不会屏蔽NMI,可以屏蔽任何信号但是硬件中的NMI引脚:设置端口70h的MSb 就可以了.
NMI背后的想法是将中断分为两类:一类由公共中断组成,设备在系统正常运行时使用的中断以及操作系统可能想要屏蔽; 中断造成的另一个类别更严重,操作系统不想掩盖(暂时状态除外).
所述NMI产生中断2,因此NMI使用IVT(中断向量表,在实模式下使用)或IDT(中断描述符表,在保护模式和相关的使用).
在DOS时间,中断2处理程序由BIOS设置,此供应商特定处理程序读取一组专有硬件寄存器,检测到错误(如内存ECC错误,由于突然拔出的总线错误),并尝试恢复(如重置或内存清理).
这个机制在当时是有意义的,因为操作系统与BIOS一起工作,能够在cli不影响NMI的情况下执行,这是一个很大的简化.
随着保护模式的出现,用于实模式的BIOS中断2处理程序变得无用.
一些内核使用 NMI来实现内核看门狗定时器,因为即使在a之后也会生成NMI中断cli.
英特尔认识到,使用中断来控制固件不再是解决方案,因为可以将新的执行模式添加到CPU中,因此需要更透明的解决方案.
因此他们创建了SMM(系统管理模式).
与正常中断相反,SMM是CPU的特殊模式,引用了英特尔手册2的第34章:
当通过系统管理中断(SMI)调用SMM时,处理器保存处理器的当前状态(处理器的上下文),然后切换到由新地址空间定义的单独操作环境.系统管理软件执行程序(SMI处理程序)在该环境中开始执行,SMI处理程序的关键代码和数据驻留在该地址空间内的物理内存区域(SMRAM)中.在SMM中,处理器执行SMI处理程序代码以执行诸如关闭未使用的磁盘驱动器或监视器,执行专有代码或将整个系统置于挂起状态等操作.当SMI处理程序完成其操作时,它执行resume(RSM)指令.
进入SMM一个SMI(系统管理中断)必须产生
进入SMM的唯一方法是通过处理器上的SMI#引脚或通过APIC总线接收的SMI消息发信号通知SMI.
虽然我在SMI代表中断断言SMI#不会产生如上所示意义上的中断.
当保护模式变得流行时,SMI被引入386的更高版本.
它已被用于透明地转换硬件接口,例如,可以对英特尔芯片组进行编程,以便在访问端口60h-64h时生成SMI,以便为USB设备提供传统支持.
这些是用于处理鼠标和键盘的标准PS2端口; SMM代码透明地读取端口60h-64h的值,并适当地将这些访问转换为USB访问.
随着奔腾的出现,英特尔推出了LAPIC(本地高级可编程中断控制器),INTR和NMI消失了,取而代之的是LINT0和LINT1(本地中断).
LINT0和LINT1是可编程引脚,来自英特尔手册2的第10章:
复位时,LINT0配置为INTR,LINT1配置为NMI,以实现向后兼容.
路由中断并赋予它们优先级的复杂性已经转移到CPU外部的硬件上.
每个设备或平台都使用定制布线,例如,PCI设备的引脚用于交叉中断以最大限度地减少污染.所述的来临IOAPIC与其分层布局和[MSI]的S(https://en.wikipedia.org/wiki/Message_Signaled_Interrupts)在中断的处理增加了更多的功能层.
同时,人们认识到,通过使用SMI将操作系统排除在管理决策之外并不是一个好主意:
操作系统可以禁用或限制处理器或设备,可以报告,记录,关闭.
在没有来自固件的标准化信息支持的情况下处理硬件的复杂性以及使OS成为管理过程的一部分的需要在ACPI规范中达到了顶点.
ACPI 不依赖于OS不可见模式(如SMM),而是定义可解释的字节码(AML).
操作系统负责执行,固件开发人员负责编写.
ACPI设计人员决定使用正常的中断SCI(系统控制中断)来请求操作系统注意,这个中断可以以任何方式发出信号,但必须由操作系统处理,而不是由固件处理.
引用ACPI规范:
设备可以向SCI发出信号,通知操作系统电源状态的变化.例如,设备可以触发中断以通知OS电池已达到低功率水平
SCI是正常中断,其向量(读取:数字)在ACPI表/结构之一中报告.
可以通过编程芯片组来配置SCI矢量,上次读取某些数据表/表时使用的常用值是9.
在SCI上,OS通常确定此类中断的来源并执行适当的操作,通常这涉及在该过程中执行一些AML代码.
软件可以通过两种方式"生成"硬件中断,具体取决于"生成"的含义:
该软件可以"刺激"硬件.
例如,可以将定时器编程为立即过期以触发其中断.
这可以与上面提到的任何中断源一起使用,NMI/SMI有点棘手:LINT0需要进行适当的编程.
该软件可以执行中断处理程序.这可以通过所有中断源完成,但SMI,SMI只能在硬件事件中输入,因为SMM代码所在的内存不在SMM中时映射.
请注意,OS通常期望在特定硬件状态下生成硬件中断,如果没有找到原因,则通常将中断归类为杂散,并非所有OS /处理程序都能很好地处理伪中断.
第3版英特尔手册的第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
Run Code Online (Sandbox Code Playgroud)
因此,考虑到SCI只是正常的中断,顺序是
正常中断/ SCI <NMI <SMI
请注意,在"相同"时间发生多个中断时使用此顺序.
服务于NMI或在SMI中时,可以启用和提供正常/ SCI中断.