X86保护模式编程总结(6)

中断和异常
中断:
可屏蔽中断,在CPU的INTR引脚接收的中断请求,IF=1时才允许发生可屏蔽中断
不可屏蔽中断,在CPU的NMI输入脚上接收到,CPU无法关闭不可屏蔽中断.
异常:
CPU检测的异常被分为3种:
故障,是在已被检测到异常的指令之前的指令边界上报告的异常.故障在恢复到允许指令重新启动状态时由机器报告.用于故障处理程序的返回地址指向故障的指令,而不是指会故障指令之后的指令.
自陷,自陷是在已被检测到异常指令之后紧接着的指令边界上报告的异常.
中止,中止并不总是报告引起的异常的指令位置,并且不允许引起异常的程序重新启动.中止被用来报告几种错误,例如硬件错误和在系统表中有不一致的或非法值.
由编程引发的异常.INTO,INT3,BOUND指令触发.常称为软件中断.CPU象异常一样处理它

异常和中断表
向量号说明(实)异常源
0(Y,故障)除法错DIV和IDIV指令
1调试程序调用任何
2NMI中断不可屏蔽中断
3(N,自陷)断点INT指令
4(N,自陷)溢出
5(Y,故障)BOUND范围超出(数组范围超出)BOUND指令
6(Y,故障)无效操作码保留的操作码
7(Y,故障)设备不可用ESC或WAIT指令
8(Y,中止)双故障中断表限大小,在处理故障时发生另一个故障
9(intel保留,不要用)
10(Y,故障)无效任务状态段JMP.CALL,RET
11(Y,故障)段不存在改变段的任何指令
12(Y,故障)堆栈异常堆栈操作超越地址限值
13(Y,故障/自陷)一般保护
14(Y,故障)页面故障引起存储器的任何指令
15(intel保留,不要用)
16(Y,故障)浮点错ESC或WAIT
17(Y,故障)对齐检查任何数据引用
18机器检查异常
19-31(intel保留,不要用)
32-255(N,自陷)可屏蔽中断(软中断)

EFLAGS寄存器的RF标志用来防止对一个指令断点故障多次服务,在每一条指令顺利完成时,RF均被CPU清零,除了IRET,JMP,CALL,INT这些引起任务切换的指令之后.在第一次试图执行指令时RF为零,而若试图在一个指令断点或任务其它故障之后重新启动指令,RF置1.

同时发生多个异常和中断时的优先级
(高) 类说明
1在上一指令自陷
--断点
--调试自陷异常(TF=1,TSS中T=1,或数据/IO断点)
2外部中断
--NMI中断
--可屏蔽中断
3取下一指令时的故障
--代码断点故障
--代码段超越
--预取时的页故障
4下一指令译码时的故障
--非法操作码
--指令长度>15字节
--协处理器不可用
5执行指令时的故障
--一般检测
--FP错误(来自前面的FP指令)
--溢出中断
--BOUND超出范围
--无效TSS
--段不存在
--堆栈异常
--一般保护异常
--数据页故障
--对齐检查

中断门和自陷门的区别:
主要区别是它们对IF标志(EFLAGS中)的影响.使用中断门的中断清零IF,这样防止了其它中断干扰当前中断处理程序.其后面的IRET指令把IF恢复为保持在堆栈上的EFLAGS寄存的内容.而通过自陷门的中断不改变IF.

中断过程中堆栈的变化(异常和中断之后的堆栈祯):
[无特权级改变[无特权级改变[特权级改变[特权级改变
无出错代码]有出错代码]无出错代码]有出错代码]
原EFLAGS原EFLAGS不用(来自TSS的ESP)不用(来自TSS的ESP)
原CS原CS原SS原SS
原EIP原EIP原ESP原ESP
出错代码原CS原EFLAGS
原EIP原CS
原EIP
出错代码

出错代码:
格式: 31-16 15-3 210
保留 选择符的 TI IDT EXT
变址值

注:出错和选择符相似
1,如果程序的外部事件引起异常,则EXT=1
2,如果出错代码的变址值部分引用IDT中的门描述符,则IDT=1
3,如果IDT=0,则TI位指明出错代码引用GDT还是LDT (TI=0?GDT:LDT)
4,3-15位对应选择符的高位.

异常条件:
下面每项描述将异常分为故障,自陷和中止
故障 --- 保存CS和EIP的内容并指向产生故障的指令
自陷 --- 保持在自陷发生时存储的CS和EIP的内容,指向产生自陷的指令之后将被执行的令.如果在转移指令时检测到自陷,则保持的CS和EIP是转移的目标.而不是转移指令
中止 --- 中止是既不知道引起异常的指令位置,又不允许重新启动引起异常的程序的那种异常.中止被用来报告严重的错误.

你可能感兴趣的:(编程,ext,FP)