中断是计算机系统中最为核心的控制机制之一。当中断发生时,中央处理器暂时中止当前程序的执行,转而处理触发事件所对应的服务程序,处理完毕后再自动返回原程序继续执行。这个过程并非简单的函数调用,而是由硬件信号驱动、涉及处理器状态全面切换的复杂控制流转移。
在中断机制诞生之前,处理器与外部设备的通信依赖轮询方式,需要周期性地逐一查询每个设备的状态寄存器。这种方式大量浪费计算资源,系统响应慢、吞吐量低。中断机制从根本上改变了这一局面,外部设备能在需要服务时主动向处理器发出信号,处理器只在收到信号后才介入处理,其余时间专注于正常计算任务。这种从"我问你答"到"你叫我应"的模式变革,使系统的实时性和效率得到质的飞跃。
在操作系统的视野中,中断是实现多任务并发的时间基础,是时钟中断驱动进程调度、实现时间片轮转的硬件基石。没有中断,操作系统无法从运行中的进程手中夺回处理器控制权,抢占式调度无从谈起。此外,中断还承担着系统异常处理、缺页故障响应、系统调用入口等多重关键职能,可谓操作系统的"心脏起搏器"。
在软考知识体系中,中断机制横跨计算机组成原理与操作系统两大学科板块,是架构、软设、系分三个方向共同考查的底层基础考点。从计算机组成原理的角度看,中断涉及处理器的引脚信号、标志寄存器控制、总线时序和中断控制器编程等硬件层面的知识点。从操作系统的角度看,中断是进程调度、系统调用、输入输出管理和异常处理等核心功能实现的硬件前提。中断向量表、可屏蔽与不可屏蔽中断的区分、中断处理流程的五阶段、中断嵌套和现场保护等问题频繁出现在历年真题中,属于必须牢牢掌握的核心知识。
理解中断机制,首先需从硬件层面弄清中断信号如何从外部设备传递到处理器并引发控制流转移。在经典x86体系结构中,处理器提供两根专门接收外部中断请求的物理引脚:INTR和NMI。INTR是可屏蔽中断请求引脚,键盘、硬盘、网卡等外部设备通过它申请服务。NMI是不可屏蔽中断请求引脚,专门传递内存奇偶校验错误、电源掉电等紧急事件。
在INTR引脚前端连接着可编程中断控制器。早期单处理器系统使用英特尔8259A芯片,最多管理八条中断请求线,支持通过级联方式将两片8259A形成主从结构,从而管理多达十五条外部中断源。8259A不仅负责接收和汇总外部中断信号,还承担着优先级仲裁、中断屏蔽控制以及向处理器提供中断类型号的关键职责。当多个设备同时请求时,8259A按预设优先级决定先处理哪一个,通过INTR引脚发出信号,并在处理器响应后将中断类型号通过数据总线传递过去。现代多核系统使用高级可编程中断控制器,分为IO APIC和Local APIC两部分,支持二十四条输入线和处理器间中断通信等高级功能。
中断向量表是中断响应中最精妙的数据结构。当处理器接受中断请求后,面临的核心问题是中断处理程序的代码存放在哪里。中断向量表就是存放在内存固定区域的一张查找表,表中每一项称为中断向量,本质上就是对应中断服务程序的入口地址,由代码段寄存器和指令指针寄存器组成,占据四个字节。
在x86实模式下,中断向量表固定放置在物理内存00000H到003FFH处,共一千零二十四个字节,容纳二百五十六个中断向量。中断类型号乘以四就是对应向量在表中的偏移地址。处理器获得类型号后即可计算物理地址,读取四个字节内容作为入口地址完成精确定位。
二百五十六个类型号有固定分配:零号对应除法错误,当除数为零或除数过小导致商溢出时触发;一号对应单步调试,支持逐条指令调试;二号固定给不可屏蔽中断,这意味着所有不可屏蔽中断的处理程序入口都固定保存在地址00008H处;三号对应断点中断,通常由INT 3指令触发;四号对应溢出中断,由INTO指令在溢出标志位置位时触发。五到三十一号保留给处理器异常和BIOS,三十二到二百五十五号分配给外部设备可屏蔽中断和用户自定义软件中断。在保护模式下,中断向量表被中断描述符表取代,其基地址不再固定为零而是由中断描述符表寄存器动态指定,每个描述符占八字节,包含入口地址、特权级信息和门类型属性,但核心思想不变:以类型号为索引快速定位入口地址。
中断处理全过程划分为五个紧密衔接的阶段。
第一阶段中断请求。外部设备通过中断控制器的某一条中断请求线发出有效的电平或边沿信号。中断控制器接收到信号后,将其记录在内部的中断请求寄存器中,同时根据中断屏蔽寄存器的设置和当前正在服务的中断的优先级,决定是否将这条请求转发到处理器的INTR引脚。如果中断屏蔽寄存器中对应位未被置位,且该请求的优先级高于当前处理器正在处理的中断的优先级,中断控制器就在INTR引脚上发出有效信号。处理器在每条指令执行结束的时刻,硬件逻辑会自动采样INTR引脚的电平状态。如果检测到INTR上存在有效请求信号,并且标志寄存器中的中断允许标志位IF当前为一,处理器就认定存在一个合法的、应予响应的可屏蔽中断请求,这就是所谓的开中断状态。如果IF为零,即便INTR上有有效信号,处理器也对它视而不见。
第二阶段中断响应,硬件参与度最高。处理器首先将标志寄存器当前值压栈保存,接着将代码段寄存器和指令指针寄存器的值压栈,两者构成断点地址。随后处理器将IF位清零实现关中断,防止响应过程中另一起中断引发混乱;将TF位清零防止单步调试干扰。完成清除后,处理器连续发送两个INTA负脉冲:第一个通知中断控制器冻结优先级状态,第二个请求将中断类型号放到数据总线。读取类型号后乘四计算向量表地址,取出入口地址装入CS和IP寄存器,控制流转移完成。
第三阶段现场保护,由中断服务程序软件代码完成。需要明确的是,硬件在中断响应阶段自动保存的内容仅限于标志寄存器和断点地址,而通用寄存器、段寄存器以及其他处理器内部状态寄存器的内容并未被硬件自动保存。如果在中断服务程序中需要使用这些寄存器,必须在服务程序开头显式将它们的当前值压入堆栈保存,这就是
第四阶段中断处理。键盘中断读取扫描码并转换为字符编码放入缓冲区;硬盘中断检查传输状态并唤醒等待进程;时钟中断更新时钟计数并触发进程调度;不可屏蔽中断处理程序尽量记录错误状态、执行紧急数据保存。
第五阶段现场恢复与中断返回。服务程序末尾按与保护现场相反的顺序执行POP指令恢复寄存器,恢复次序必须与保护次序严格对称,因为堆栈是后进先出的数据结构。最后执行IRET指令,硬件自动从堆栈弹出断点地址和标志寄存器值,处理器程序计数器重回被中断程序的断点位置,指令执行流平滑延续到中断发生前的轨道上,被中断的程序仿佛什么都没有发生过一样继续执行。
可屏蔽中断是系统中数量最多、使用最频繁的中断类型,几乎所有外部输入输出设备的中断都属于此类。所谓"可屏蔽",指处理器可通过标志寄存器中IF位的值选择接受或忽略这类请求。IF等于一时开中断,IF等于零时关中断。IF位通过STI指令置位、CLI指令清除,操作系统由此获得精细控制中断响应时机的手段。
典型场景包括键盘中断,每次按键触发处理器读取扫描码,整个过程仅需几十微秒;硬盘中断在DMA传输完成时触发,通知检查传输结果并唤醒等待进程;网卡中断在收到数据包时触发。此外,打印机就绪、声卡缓冲区耗尽、USB设备连接等中断都属于可屏蔽中断范畴。
可
本篇完!