保护模式下的异常和中断如下:
向量号 |
助记符 |
说明 |
类型 |
错误号 |
产生源 |
0 |
#DE |
除出错 |
故障 |
无 |
DIV或IDIV指令 |
1 |
#DB |
调试 |
故障/陷阱 |
无 |
任何代码或数据引用,或是INT 1指令 |
2 |
-- |
NMI中断 |
中断 |
无 |
非屏蔽外部中断 |
3 |
#BP |
断点 |
陷阱 |
无 |
INT 3指令 |
4 |
#OF |
溢出 |
陷阱 |
无 |
INTO指令 |
5 |
#BR |
边界范围超出 |
故障 |
无 |
BOUND指令 |
6 |
#UD |
无效操作码(未定义操作码) |
故障 |
无 |
UD2指令或保留的操作码。(Pentium Pro中加入的新指令) |
7 |
#NM |
设备不存在(无数学协处理器) |
故障 |
无 |
浮点或WAIT/FWAIT指令 |
8 |
#DF |
双重错误 |
异常终止 |
有(0) |
任何可产生异常、NMI或INTR的指令 |
9 |
-- |
协处理器段超越(保留) |
故障 |
无 |
浮点指令(386以后的CPU不产生该异常) |
10 |
#TS |
无效的任务状态段TSS |
故障 |
有 |
任务交换或访问TSS |
11 |
#NP |
段不存在 |
故障 |
有 |
加载段寄存器或访问系统段 |
12 |
#SS |
堆栈段错误 |
故障 |
有 |
堆栈操作和SS寄存器加载 |
13 |
#GP |
一般保护错误 |
故障 |
有 |
任何内存引用和其他保护检查 |
14 |
#PF |
页面错误 |
故障 |
有 |
任何内存引用 |
15 |
-- |
(Intel保留,请勿使用) |
|
无 |
|
16 |
#MF |
x87 FPU浮点错误(数学错误) |
故障 |
无 |
x87 FPU浮点或WAIT/FWAIT指令 |
17 |
#AC |
对起检查 |
故障 |
有(0) |
对内存中任何数据的引用 |
18 |
#MC |
机器检查 |
异常终止 |
无 |
错误码(若有)和产生源与CPU类型有关(奔腾处理器引进) |
19 |
#XF |
SIMD浮点异常 |
故障 |
无 |
SSE和SSE2浮点指令(PIII处理器引进) |
20-31 |
-- |
(Intel保留,请勿使用) |
|
|
|
32-255 |
-- |
用户定义(非保留)中断 |
中断 |
|
外部中断或者INT n指令 |
处理器从两种地方接受中断:
外部(硬件产生)的中断
根据异常被报告的方式和异常的指令是否能够被重新执行,异常可以细分成故障(Fault)、陷阱(Trap)和中止(Abort)。
Fault:可以被纠正的异常,一旦被纠正,程序就可以正确运行。处理器会首先处理最高级别的中断和异常,低优先级的异常将会被丢弃,低优先级的中断将会被保持等待。当中断处理程序回到任务的时候,被丢弃的异常会重新发生。
异常或者中断的优先级如下:
向量号 |
助记符 |
说明 |
类型 |
错误号 |
产生源 |
0 |
#DE |
除出错 |
故障 |
无 |
DIV或IDIV指令 |
1 |
#DB |
调试 |
故障/陷阱 |
无 |
任何代码或数据引用,或是INT 1指令 |
2 |
-- |
NMI中断 |
中断 |
无 |
非屏蔽外部中断 |
3 |
#BP |
断点 |
陷阱 |
无 |
INT 3指令 |
4 |
#OF |
溢出 |
陷阱 |
无 |
INTO指令 |
5 |
#BR |
边界范围超出 |
故障 |
无 |
BOUND指令 |
6 |
#UD |
无效操作码(未定义操作码) |
故障 |
无 |
UD2指令或保留的操作码。(Pentium Pro中加入的新指令) |
7 |
#NM |
设备不存在(无数学协处理器) |
故障 |
无 |
浮点或WAIT/FWAIT指令 |
8 |
#DF |
双重错误 |
异常终止 |
有(0) |
任何可产生异常、NMI或INTR的指令 |
9 |
-- |
协处理器段超越(保留) |
故障 |
无 |
浮点指令(386以后的CPU不产生该异常) |
10 |
#TS |
无效的任务状态段TSS |
故障 |
有 |
任务交换或访问TSS |
11 |
#NP |
段不存在 |
故障 |
有 |
加载段寄存器或访问系统段 |
12 |
#SS |
堆栈段错误 |
故障 |
有 |
堆栈操作和SS寄存器加载 |
13 |
#GP |
一般保护错误 |
故障 |
有 |
任何内存引用和其他保护检查 |
14 |
#PF |
页面错误 |
故障 |
有 |
任何内存引用 |
15 |
-- |
(Intel保留,请勿使用) |
|
无 |
|
16 |
#MF |
x87 FPU浮点错误(数学错误) |
故障 |
无 |
x87 FPU浮点或WAIT/FWAIT指令 |
17 |
#AC |
对起检查 |
故障 |
有(0) |
对内存中任何数据的引用 |
18 |
#MC |
机器检查 |
异常终止 |
无 |
错误码(若有)和产生源与CPU类型有关(奔腾处理器引进) |
19 |
#XF |
SIMD浮点异常 |
故障 |
无 |
SSE和SSE2浮点指令(PIII处理器引进) |
20-31 |
-- |
(Intel保留,请勿使用) |
|
|
|
32-255 |
-- |
用户定义(非保留)中断 |
中断 |
|
外部中断或者INT n指令 |
IDT表可以处在线性地址空间的任何地方,使用IDTR来定位。IDTR是一个32b的寄存器,含有32位基地址和16b限长。IDT表基地址应该8b对齐,从而加快访问速度。
处理方法类似于call指令调用程序过程和任务的方法。中断或者异常处理过程如下图所示。
A、处理器从当前执行任务的TSS段得到中断或者异常处理过程使用的堆栈的段选择符和栈指针。然后将被中断任务的栈选择符和栈指针压入新栈内部,如下图所示。
异常或者中断处理过程的特权级保护机制和通过调用门调用普通过程类似(也就是说,中断或者异常处理过程不会发生优先级提升?)。CPU不会将控制转移到比CPL更低的代码段的中断处理过程,但是也有不同:
@@@中断或者异常向量没有RPL,所以也不会有相应检查。当通过IDT表中任务门来访问终端或者异常的处理过程时,就会导致任务切换。使用单独的任务来处理异常和中断具有如下好处
@@@被中断任务的完整上下文会被自动保存中断处理任务切机理如下图所示:
保护模式及其编程——中断和异常处理,布布扣,bubuko.com
原文:http://blog.csdn.net/trochiluses/article/details/19973581