Skip to content

Latest commit

 

History

History
106 lines (85 loc) · 4.35 KB

031 异常.md

File metadata and controls

106 lines (85 loc) · 4.35 KB

异常

  • 故障
  • 陷阱
  • 终止

故障 Fault

这种错误是可以被修复的一种类型,属于最轻的一种异常;

陷阱 Trap

此异常通常用于调试

终止 Abort

是最严重的异常类型,一旦出现由于 错误无法修复,程序将无法继续运行;

异常列表

编号 名称 类型 助记符 错误码
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) 保留 - -

说明:

  1. 当进行除以零的操作时产生
  2. 当进行程序单步跟踪调试时,设置了标志寄存器 eflags 的 T 标志时产生这个中断
  3. 由不可屏蔽中断 NMI 产生
  4. 由断点指令 int3 产生,与 debug 处理相同
  5. eflags 的溢出标志 OF 引起
  6. 寻址到有效地址以外时引起
  7. CPU 执行时发现一个无效的指令操作码
  8. 设备不存在,指协处理器,在两种情况下会产生该中断:
    1. CPU 遇到一个转意指令并且 EM 置位时,在这种情况下处理程序应该模拟导致异常的指令
    2. MP 和 TS 都在置位状态时,CPU 遇到 WAIT 或一个转移指令。在这种情况下,处理程序在必要时应该更新协处理器的状态
  9. 双故障出错
  10. 协处理器段超出,只有 386 会产生此异常
  11. CPU 切换时发觉 TSS 无效
  12. 描述符所指的段不存在
  13. 堆栈段不存在或寻址堆栈段越界
  14. 没有符合保护机制(特权级)的操作引起
  15. 页不在内存或不存在
  16. 保留
  17. 协处理器发出的出错信号引起
  18. 对齐检测只在 CPL 3 执行,于 486 引入
  19. 与模型相关,于奔腾处理器引入
  20. 与浮点操作相关,于奔腾 3 引入
  21. 只在可以设置 EPT - violation 的处理器上产生
  22. ret, iret 等指令可能会产生该异常

调试器

  • 不能影响程序执行
  • 可以在断点的地方停下来

GP(0x0D) 异常错误码

索引 长度 名称 描述
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

参考文献