处理器中断处理是计算机体系架构中必须掌握的知识之一。在Intel的x86处理器下,中断可以分为外部中断、异常和陷入。外部中断来自硬件,是随机发生的,而异常则是处理器内部执行指令过程中检测到错误条件的结果。陷入则是由程序产生的,通常是由INT n、INTO等指令触发的。
在x86处理器中,中断处理程序负责处理中断,异常处理程序负责处理异常,而系统调用服务程序则负责处理陷入。这些处理程序可以位于内存空间的任何位置,并且可以有不同的特权级。Intel处理器使用中断门、陷阱门和任务门来定义处理程序的入口地址。其中,中断门和陷阱门是进入异常处理程序的门户。选择符和偏移量合起来定义了一个处理程序的入口地址。中断门进入处理程序时IF标志被清掉,而陷阱门进入处理程序时IF标志保持不变。
Intel处理器为每个中断和异常定义了一个中断向量号,并通过中断描述符表(IDT)建立中断向量号和门之间的对应关系。IDT可以驻留在线性地址空间的任何位置。Intel处理器专门提供了一个IDTR寄存器来记录IDT的基地址和界限信息。Intel处理器定义了256个中断向量号,其中0~31被处理器保留。
处理器中的异常可以分为故障类异常和终止类异常。故障类异常可以被更正,而终止类异常则是无法被处理器自行解决的严重错误。为了保证安全性,通过中断门或陷阱门只能向同级或更高特权级的代码段转移控制。通常情况下,处理程序定义在内核代码段中(0特权级代码段)。
在中断发生时,处理器会自动在栈顶压入一些参数,其中EFLAGS是中断或异常发生前的系统状态,SS:ESP是中断或者异常发生前用户堆栈的栈顶,CS:EIP是中断或者异常的返回地址。64位模式中,处理程序必须在64位代码段中,因而中断和陷阱门描述符被扩充到了16字节,其中偏移量被扩充到了64位;IDT找那个仅有新格式的门描述符;堆栈宽度变成了64位,而且当中断发生时,会无条件地压入栈指针(SS:RSP)当需要切换堆栈时SS被强制设置为NULL;新增了中断堆栈表(IST)机制,允许特定的中断或者异常指定专门的堆栈。