- 故障
- 陷阱
- 终止
这种错误是可以被修复的一种类型,属于最轻的一种异常;
此异常通常用于调试
是最严重的异常类型,一旦出现由于 错误无法修复,程序将无法继续运行;
编号 | 名称 | 类型 | 助记符 | 错误码 |
---|---|---|---|---|
0 (0x0) | 除零错误 | 故障 | #DE | 无 |
1 (0x1) | 调试 | 故障/陷阱 | #DB | 无 |
2 (0x2) | 不可屏蔽中断 | 中断 | - | 无 |
3 (0x3) | 断点 | 陷阱 | #BP | 无 |
4 (0x4) | 溢出 | 陷阱 | #OF | 无 |
5 (0x5) | 越界 | 故障 | #BR | 无 |
6 (0x6) | 指令无效 | 故障 | #UD | 无 |
7 (0x7) | 设备不可用 | 故障 | #NM | 无 |
8 (0x8) | 双重错误 | 终止 | #DF | 有 (Zero) |
9 (0x9) | 协处理器段超限 | 故障 | - | 无 |
10 (0xA) | 无效任务状态段 | 故障 | #TS | 有 |
11 (0xB) | 段无效 | 故障 | #NP | 有 |
12 (0xC) | 栈段错误 | 故障 | #SS | 有 |
13 (0xD) | 一般性保护异常 | 故障 | #GP | 有 |
14 (0xE) | 缺页错误 | 故障 | #PF | 有 |
15 (0xF) | 保留 | - | - | 无 |
16 (0x10) | 浮点异常 | 故障 | #MF | 无 |
17 (0x11) | 对齐检测 | 故障 | #AC | 有 |
18 (0x12) | 机器检测 | 终止 | #MC | 无 |
19 (0x13) | SIMD 浮点异常 | 故障 | #XM/#XF | 无 |
20 (0x14) | 虚拟化异常 | 故障 | #VE | 无 |
21 (0x15) | 控制保护异常 | 故障 | #CP | 有 |
22-31 (0x16-0x1f) | 保留 | - | - | 无 |
说明:
- 当进行除以零的操作时产生
- 当进行程序单步跟踪调试时,设置了标志寄存器 eflags 的 T 标志时产生这个中断
- 由不可屏蔽中断 NMI 产生
- 由断点指令 int3 产生,与 debug 处理相同
- eflags 的溢出标志 OF 引起
- 寻址到有效地址以外时引起
- CPU 执行时发现一个无效的指令操作码
- 设备不存在,指协处理器,在两种情况下会产生该中断:
- CPU 遇到一个转意指令并且 EM 置位时,在这种情况下处理程序应该模拟导致异常的指令
- MP 和 TS 都在置位状态时,CPU 遇到 WAIT 或一个转移指令。在这种情况下,处理程序在必要时应该更新协处理器的状态
- 双故障出错
- 协处理器段超出,只有 386 会产生此异常
- CPU 切换时发觉 TSS 无效
- 描述符所指的段不存在
- 堆栈段不存在或寻址堆栈段越界
- 没有符合保护机制(特权级)的操作引起
- 页不在内存或不存在
- 保留
- 协处理器发出的出错信号引起
- 对齐检测只在 CPL 3 执行,于 486 引入
- 与模型相关,于奔腾处理器引入
- 与浮点操作相关,于奔腾 3 引入
- 只在可以设置 EPT - violation 的处理器上产生
- ret, iret 等指令可能会产生该异常
- 不能影响程序执行
- 可以在断点的地方停下来
索引 | 长度 | 名称 | 描述 |
---|---|---|---|
E | 1 | 外部(External) | 异常由外部触发 |
TBL | 2 | IDT/GDT/LDT Table | 见下列表 |
INDEX | 13 | 选择子索引 |
TBL:
- 00 GDT
- 01 IDT
- 10 LDT
- 11 IDT
0x402;
0b_0100_0000_0010
0b_10000000_01_0
- https://wiki.osdev.org/Exceptions
- Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 3 (System Programming Guide), Chapter 6 (Interrupt and exception handling)
- https://en.wikipedia.org/wiki/Second_Level_Address_Translation