x86架构学习之中断
前言
读本文前,你需要了解x86的操作模式、寻址方式、特权级相关知识,具体参考这篇文章
中断与异常
打断cpu当前任务的事件都叫中断,根据是否可屏蔽分为:
- 可屏蔽中断,即可通过软件配置相关寄存器(通常是PIC中的某个寄存器)来开启和关闭。
- 不可屏蔽中断,即中断不可关闭,一般用在一些非常紧急或灾难性的事件上。
根据中断的来源,我们将中断分为外部中断和内部异常
外部中断
简称中断,后文如果没特别说明,中断都指外部中断,由外部IO事件触发,由于时钟源来自CPU外部,与CPU时钟不同源,因此是异步事件。
外部中断,一般是由CPU的外部引脚电信号触发,这些引脚留给硬件厂商去定义中断,例如主板厂商可以将USB中断挂载70号中断引脚上,MCU厂商可以将片上外设(SPI、I2C等)的中断挂载在指定中断线上。
内部异常
由CPU内部事件触发,触发时钟源与CPU时钟同源,因此是同步事件。
- 处理器探测异常
- 故障,可修复,修复后可正常运行,如0除数、计算结果溢出、缺页等。故障发生时,入栈作为故障处理函数返回地址的,是故障指令所在的地址,而不是下一条指令的地址(这是一般中断和异常的行为),以便修复故障后,指令能够再次被执行,如缺页。
- 陷阱,通过软件插入断点指令触发。
- 异常终止,应用级灾难,只能终止当前任务。
- 编程异常,即通过软件插入中断或异常(INT n)指令来触发,由于需要显示的中断指令,因此,被称为软中断,利用软中断,可以模拟任意外部中断信号,在操作系统,软中断多用于系统调用。
- 机器检测异常,硬件上检测到错误时,会触发的异常,这个异常属于纯硬件故障,不同的版本的x86架构实现不同,因此不存在兼容性。(可以理解为硬件bug检测机制,硬件的设计不可能完美)
中断号
x86的中断号总共有256个,其中前32个(0~31)中断号已经被CPU硬件预定义或保留,软件无法修改,这32个中断号也是异常,后224个中断号可由硬件厂商自由配置使用。
| 中断号 | 异常类型 | 简称 | 描述 | 触发源 |
|---|---|---|---|---|
| 0 | 故障 | #DE | Divide | 错误使用 DIV and IDIV 指令 |
| 1 | 陷阱 | #DB | Debug | 任意代码和数据访问都有可能 |
| 2 | 故障 | NMI Interrupt | 不可屏蔽中断 | |
| 3 | 陷阱 | #BP | Breakpoint | INT3 指令. |
| 4 | 陷阱 | #OF | Overflow | INTO 指令. |
| 5 | 故障 | #BR | BOUND Range Exceeded | BOUND 指令. |
| 6 | 故障 | #UD | Invalid Opcode (Undefined Opcode) | 执行无效指令 |
| 7 | 故障 | #NM | Device Not Available (No Math Coprocessor) | Floating-point or WAIT/FWAIT 指令 |
| 8 | 故障 | 异常终止 | #DF | Double Fault |
| 9 | 故障 | 异常终止 | #MF | CoProcessor Segment Overrun (reserved) |
| 10 | 故障 | #TS | Invalid TSS | 硬件任务切换时,TSS段无效 |
| 11 | 故障 | #NP | Segment Not Present | 访问不存在的段 |
| 12 | 故障 | #SS | Stack Segment Fault | 非法栈操作,ss寄存器加载无效值 |
| 13 | 故障 | #GP | General Protection | 各 |
1065





被折叠的 条评论
为什么被折叠?



