Intel的中断是外部中断、异常和陷入的统称。
  • 外部中断来自硬件,是随机的。
  • 异常来自处理器内部,表示处理器执行指令的过程中检测到了某种错误条件。
  • 陷入来自程序,由INT n,INTO等指令产生。
外部中断可以被屏蔽,但线路和异常不能被屏蔽。屏蔽中断的方法是清除EFLAGS寄存器中的IF标志。
  • 处理中断的程序叫作中断处理程序。
  • 处理异常的程序称为异常处理程序。
  • 处理陷入的程序称作系统调用服务程序。
处理程序可以位于内和空间的任意位置,而且可以有不同的特权级。Intel处理器称处理程序入口为门。可用的门分为中断门、陷阱门和任务门。中断门和陷阱门是进入异常处理程序的门户,分别由中断门和陷阱门的描述符定义。选择符和偏移量合起来定义了一个处理程序的入口地址。中断门进入处理程序时IF标志被清掉,而陷阱门进入处理程序时IF标志保持不变。
Intel处理器给它的每个中断和异常都赋予了一个中断向量号,并定义了一个中断描述符表(IDT)用于建立中断向量号和门之间对应的关系。Intel处理器定义的中断向量号共256个,其中0~31被处理器保留。IDT可以驻留在线性地址空间的任何位置。Intel处理器专门提供了一个IDTR寄存器来记录IDT的基地址和界限信息。故障类异常是可以更正的。终止类异常是严重的错误,处理器无法保证程序能够继续正常执行。
Intel规定,通过中断门或者陷阱门只能向同级或者更高特权级的代码段转移控制,通常处理程序定义在内核代码段中(0特权级代码段)。
通过陷入指令也可以进入中断或者异常处理程序,要求进入前的特权级(CPL)必须小于或者等于门描述符的特权级(DPL)。用户程序通常无法通过INT n指令进入中断处理程序。
如果中断或异常发生时处理器在第0特权级上,则处理程序可以直接使用当前进程的系统堆栈,不用切换堆栈。如果发生在第3特权级上,则需要切换堆栈。
中断发生时,处理器会自动在栈顶压入一些参数,其中EFLAGS是中断或异常发生前的系统状态,SS:ESP是中断或者异常发生前用户堆栈的栈顶,CS:EIP是中断或者异常的返回地址。只有堆栈发生切换时才会在栈顶压入SS:ESP。
64位模式中,处理程序必须在64位代码段中,因而中断和陷阱门描述符被扩充到了16字节,其中偏移量被扩充到了64位;IDT找那个仅有新格式的门描述符;堆栈宽度变成了64位,而且当中断发生时,会无条件地压入栈指针(SS:RSP)当需要切换堆栈时SS被强制设置为NULL;新增了中断堆栈表(IST)机制,允许特定的中断或者异常指定专门的堆栈。
Scroll to Top