系统中断
系统中断是指 CPU 对系统发生的某个事件做出的一种反应:CPU 暂停正在执行的程序,保留现场后转去执行相应的处理程序,处理完该事件后再返回断点继续执行被打断的程序。
中断可以避免 CPU 轮询等待某条件成立,减小系统开销。中断是多程序并发执行的前提条件。
当中断发生时,由于操作系统的管理工作需要特权指令,CPU 会立刻进入核心态,使得操作系统获得计算机的控制权。用户态到核心态的转换就是通过中断机制实现的,并且是唯一途径。
内中断(软中断)
**内中断又称为软件中断、同步中断、异常,内中断的信号来源于 CPU 内部、与当前执行的指令有关。**如整数除 0。之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断。
处理流程:
- CPU 终止执行当前程序流,将 CPU 所有寄存器的数值保存到栈中;
- CPU 根据中断向量,从中断向量表中查找中断处理程序的入口地址,执行中断处理程序;
- CPU 恢复寄存器中的数值,返回原程序流停止位置继续执行。
外中断(硬中断)
**外中断又称为硬件中断、异步中断,外中断的信号来源于 CPU 外部,与当前执行的指令无关。**如磁盘的 IO 中断、时钟中断等。
计算机中每个组成组件都有自己的 IRQ(Interrupt Request,中断请求),都可以在需要的时候通过总线向 CPU 发送硬件中断通知。
处理流程:
- 外设 将中断请求发送给中断控制器;
- 中断控制器 根据中断优先级,有序地将中断传递给 CPU;
- CPU 终止执行当前程序流,将 CPU 所有寄存器的数值保存到栈中;
- CPU 根据中断向量,从中断向量表中查找中断处理程序的入口地址,执行中断处理程序;
- CPU 恢复寄存器中的数值,返回原程序流停止位置继续执行。
中断描述符表
IDT,中断描述符表,Interrupt Descriptor Table,每个表项为 8 个字节,记录对应中断处理函数的地址以及其他的一些控制位。IDT 存在于内核空间,CPU 中有寄存器 IDTR 用于保存 IDT 32 位的基地址和 16 位的限长值,限长值是以字节为单位的 IDT 表的长度。
因为最多只支持 256 个中断向量,所以 IDT 无需包含多于 256 个描述符。
CPU 在接收到中断时,会根据中断向量在中断描述符表中检索对应的描述符,每个中断对应一个表项。其中 0-31 号中断号位系统为预定义的中断和异常保留的,用户不得使用,硬件中断号从 32 号开始分发。
每当 CPU 接收到一个中断信号,CPU 首先要做的决定是否响应这个中断(具体由中断控制器根据中断优先级决定是否给 CPU 发送中断信号)。如果决定响应,就终止当前运行的进程,根据 IDTR 寄存器获取中断描述符表的基地址,然后根据中断号定位具体的中断描述符。
门描述符
IDT 中的每一个表项叫做中断描述符、中断向量,或门描述符(gate descriptor),”门“的含义是指当中断发生时,必须先通过这些门,然后才能进入相应的处理程序。
门描述符可以分为三类:
- 中断门(Interrupt Gate):中断门包含了一个中断或异常处理程序所在段的选择符和段内偏移量。当控制权通过中断门进入中断处理程序时,处理器清 IF 标志,即关闭中断,以避免中断嵌套。
- 陷阱门(Trap Gate):与中断门类似,其唯一的区别是,控制权通过陷阱门进入处理程序时维持 IF 标志位不变,即不关闭中断。
- 任务门(Task Gate):段选择符中存放的是任务状态段 TSS(Task State Segment)的选择子,可以通过这种与硬件配合的方式指定运行任务。
图中灰色部分表示未使用的保留部分。