x86-5-中断和异常

前面讲过了实模式下的中断:

8086-6-中断 - Sna1lGo - 博客园 (cnblogs.com)

其实大致内容是差不多的,只是到了保护模式下稍有不同。

在保护模式下的中断:

img

其实所谓的异常就是内部硬件中断,两者是一致的。

 

保护模式中的异常:

异常就是内部硬件中断。它们是处理器内部产生的中断,表明CPU在执行指令的过程中遇到了错误的状况。当处理器执行不能正常执行的指令时,将会引发这种类型的中断,比如说除0。

根据异常情况的性质和严重性,异常可以分为以下三种,并分别实施 不同的处理。

●故障(Faults)。故障通常是可以纠正的,比如,当处理器访问内存时,发现那个段或者页不在内存中(P=0),此时, 可以在异常处理程序中来修复(分配内存,或者执行磁盘的换入换出 操作),返回时,程序可以重新启动并不失连续性。

●陷阱(Traps)。陷阱中断通常在执行了截获陷阱条件的指令之后 立即产生。陷阱通常用于调试目的,比如单步 中断指令int3 和溢出检测指令into。陷阱中断允许程序或者任务在从中断处理过程返回之后继续进行而不失连续性。因此,当此异常发生时,在转入异常处理程序之前,处理器在栈中压入陷阱截获指令的下一条指令 的地址。

●终止(Aborts)。终止标志着最严重的错误,在这种错误发生时,程序或者任务都不可能重新启动。所以再继续执行引起此异常的程序或任务已相当困难,操作系统通常只能把该任务从系统中抹去。

保护模式中的中断:

在保护模式下,处理器对中断的管理是相似的,但并非使用传统的 中断向量表来保存中断处理过程的地址,而是中断描述符表(Interrupt Descriptor Table,IDT)。

和实模式下的中断向量表(IVT)不同,保护模式下的IDT 不要求必须位于内存的最低端,而是采用了一个IDTR寄存器来记录中断描述符表的地址。

idtr结构体:

 

 

 

 

kd> r idtr
idtr=80b93000
//不知道为什么在WinDbg中看不到idtr和gdtr的后十六位字段

在这个表里,保存的是和中断处理过程有关的段描述符,包括中断门、陷阱门和任务门(调用门也可以)。

 

 

 

 

中断描述符表IDT 可位于内存中的任何地方,只要IDTR 指向了它。为了利用高速缓存使处 理器的工作性能最大化,建议IDT 的基地址是8字节对齐的(地址的数值 能够被8 整除。处理器复位时,IDTR 的基地址部分为0,界限部分的 值为0xFFFF。16位的表界限值意味着IDT 和GDT、LDT 一样,表的大小可以是64KB,但因为处理器只能识别256 种中断,所以只使用2KB,其他空余的位置应当将描述符的P 位清零。