中断的分类
中断
又称外中断,由处理机外部事件引起。又根据能否屏蔽外中断可以细分为可屏蔽中断与不可屏蔽中断。要屏蔽中断可以通过置0标志寄存器EFLAG的中断标志位(Interrupt Flag, IF)或者使用中断屏蔽寄存器IMR来实现。外中断一般是异步的。触发这种中断的指令在执行完毕后才进行中断响应。
俘获
又称内中断、软中断,由处理机内部事件引起。在x86中也称为异常。内中断一般是同步的。这种中断不等当前指令执行完便进行中断响应。
Tip:按中断功能分类
- 输入输出中断 I/O传输结束或出错中断
- 外中断 时钟中断、操作员控制台中断、通信中断等
- 机器故障中断 电源故障、主存取指令错等
- 程序性中断 定点溢出、用户态下用核态指令、非法操作
- 访管中断 对操作系统提出某种需求时所发出的中断
中断响应结束后,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的大小。
中断响应的完整过程
每个中断处理程序的编号(中断号)即为右图中N的值,在实模式下使用此方法获取中断处理程序的入口地址。
中断响应的例子
INT指令即为中断指令,后面给出的立即数即是中断向量表中中断处理函数的编号,也就是前一张图里的N。
IRET指令会将中断前压入栈的PSW和PC恢复,以继续执行操作。
系统调用
系统调用中断中SAVE_ALL宏对现场进行保护,使用RESTORE_ALL宏恢复现场,然后IRET指令完成恢复,弹出堆栈地址。
普通函数调用,传参自右往左传(用栈传递,即压栈)
系统调用使用寄存器进行系统调用传参,参数个数有限,不可多于4/5/6个,否则剩下的要用堆栈传参。