中断的分类

中断

又称外中断,由处理机外部事件引起。又根据能否屏蔽外中断可以细分为可屏蔽中断不可屏蔽中断。要屏蔽中断可以通过置0标志寄存器EFLAG的中断标志位(Interrupt Flag, IF)或者使用中断屏蔽寄存器IMR来实现。外中断一般是异步的。触发这种中断的指令在执行完毕后才进行中断响应。

俘获

又称内中断软中断,由处理机内部事件引起。在x86中也称为异常。内中断一般是同步的。这种中断不等当前指令执行完便进行中断响应。


Tip:按中断功能分类

  1. 输入输出中断 I/O传输结束或出错中断
  2. 外中断 时钟中断、操作员控制台中断、通信中断等
  3. 机器故障中断 电源故障、主存取指令错等
  4. 程序性中断 定点溢出、用户态下用核态指令、非法操作
  5. 访管中断 对操作系统提出某种需求时所发出的中断

中断响应结束后,IRET指令将PS和PC恢复。

中断描述符表(Interrupt Descriptor Table

x86下PC寄存器的实现为CS与IP两个寄存器做段地址偏移实现

IDT中的每个表项为一个中断处理程序的入口地址。

实模式下,IDT从内存的0x0地址开始用1KB的大小用于存放中断向量表。每个表项占4B,为2B的段地址与2B的偏移量(CS,IP)。一共256个中断向量。

保护模式下,IDT从IDTR指向的内存地址开始,每个表项占8B,CS与IP各需要4B的大小。

中断响应的完整过程

Figure1

每个中断处理程序的编号(中断号)即为右图中N的值,在实模式下使用此方法获取中断处理程序的入口地址。

中断响应的例子

Figure2

INT指令即为中断指令,后面给出的立即数即是中断向量表中中断处理函数的编号,也就是前一张图里的N。

IRET指令会将中断前压入栈的PSW和PC恢复,以继续执行操作。

系统调用

系统调用中断中SAVE_ALL宏对现场进行保护,使用RESTORE_ALL宏恢复现场,然后IRET指令完成恢复,弹出堆栈地址。

普通函数调用,传参自右往左传(用栈传递,即压栈)

系统调用使用寄存器进行系统调用传参,参数个数有限,不可多于4/5/6个,否则剩下的要用堆栈传参。