中断与异常

张开发
2026/6/7 12:17:19 15 分钟阅读
中断与异常
一句话总结中断是 CPU 外部硬件异步触发的事件异常是 CPU 执行指令时内部同步产生的事件二者是 CPU 处理外部请求与内部错误的核心机制。从 CPU 架构的严格分类来说异常Exception是大类中断Interrupt只是异常里的一种。基本定义1. 中断InterruptCPU 在执行指令流时外部硬件设备主动发送信号请求 CPU 暂停当前任务、转而去处理该硬件事件处理完成后恢复原任务执行。核心特征异步、外部触发、与当前指令无关。典型场景键盘输入、网卡收包、磁盘 I/O 完成、定时器超时、电源按键。2. 异常ExceptionCPU执行当前指令过程中因指令本身错误、非法操作或特殊需求内部自动触发的事件必须由 CPU 立即处理。核心特征同步、内部触发、与当前指令强相关。典型场景除零错误、非法指令、缺页Page Fault、段错误、断点调试、系统调用主动陷入内核。标准分类异常 ⊃ 中断现代 CPUx86 / ARM / RISC-V官方定义基本都是所有打断正常指令流的事件统称异常广义所有打断 CPU 的都是异常狭义异常 指令内部同步错误 / 系统调用中断 外部硬件异步事件异常Exception分两类同步异常Synchronous Exception执行指令时同步触发例缺页、除零、非法指令、系统调用、断点由当前执行指令本身触发指令译码 / 执行阶段检测到错误或特殊条件发生时刻精确绑定某条指令典型缺页Page Fault除零、非法指令系统调用syscall/int 0x80陷阱断点int3异步异常Asynchronous Exception外部事件异步触发这一类就叫中断Interrupt例定时器、网卡、键盘、NMI由外部硬件通过 APIC/PIC 发送信号与当前指令流无关随时可能插入CPU 执行完当前一条指令后响应典型时钟中断网卡 / 键盘 / 磁盘中断NMI所以关系是中断 异步异常异常 同步异常 异步异常中断只是工程习惯叫法把异步硬件事件叫中断把同步指令错误 / 陷入叫异常但从体系结构严格分类中断属于异常的子集。核心区别对比表对比维度中断Interrupt异常Exception触发源外部硬件键盘、网卡、磁盘、定时器CPU 内部指令执行、错误、特殊指令同步性异步随机发生与指令流无关同步当前指令执行中 / 后立即触发可屏蔽性大部分可屏蔽通过中断控制器 / IF 位不可屏蔽必须立即处理上下文中断上下文无关联进程不可睡眠进程上下文关联当前进程可睡眠恢复方式处理后回到下一条指令继续执行故障类回到原指令重试陷阱类下一条终止类不恢复处理目的响应外部 I/O、硬件事件处理程序错误、内存管理、系统调用常见例子键盘按键、网卡收包、定时器中断除零、缺页、段错误、syscall/int 0x80详细分类一中断分类硬件中断Hardware Interrupt可屏蔽中断Maskable如外设 I/O 中断可通过IF标志位x86或中断控制器屏蔽。不可屏蔽中断NMI如硬件故障、掉电CPU 必须立即响应无法屏蔽。软件中断Software Interrupt由软件指令触发如 x86int n、ARMsvc本质是主动异常常用于系统调用。二异常分类x86/Linux 标准故障Fault发生在指令执行前 / 中可修复处理后回到原指令重试。例缺页异常Page Fault、除零、非法内存访问。陷阱Trap发生在指令执行后处理后回到下一条指令。例系统调用syscall/int 0x80、断点调试int3。终止Abort严重错误无法恢复终止当前进程 / 系统。例双重故障、机器检查异常硬件错误。处理流程通用1. 中断处理流程外部硬件发送中断信号 → 中断控制器PIC/APIC转发 → CPU 检测到中断。CPU关中断、保存现场寄存器、EIP/PC、CS、FLAGS到内核栈。查中断描述符表IDT→ 找到对应中断处理程序入口。执行中断处理程序ISR上半部Top Half快速应答硬件、清中断标志不可睡眠。下半部Bottom Half耗时操作推后软中断、tasklet、工作队列。恢复现场 →开中断→ 回到原程序下一条指令继续执行。2. 异常处理流程CPU 执行指令 → 检测到异常条件 → 立即触发。保存现场到内核栈 → 查 IDT → 进入异常处理函数如do_page_fault、do_divide_error。内核处理故障类修复错误如分配物理页→ 返回原指令重试。陷阱类完成系统调用 / 调试 → 返回下一条指令。终止类发送信号如SIGSEGV→ 终止进程。恢复现场 → 回到用户态继续执行。现场保存压栈内容与时机共同动作都会关中断或部分屏蔽把用户态 / 内核态上下文压入栈跳转到 IDT 对应的处理函数关键差异异常触发在指令执行中 / 刚结束EIP/RIP 指向Fault 类异常指向出错指令本身可重试Trap 类异常指向下一条指令中断触发在一条指令完整执行后EIP/RIP 一定指向被打断的下一条指令不会回头重新执行被打断的那条指令压栈内容x86_64异常与中断硬件自动压栈结构完全相同ss rsp rflags cs rip error code部分异常才有只有部分异常会压 error code中断永远不压 error codeIDT / 向量表使用差异1. 编号空间031CPU 保留固定分配给异常32255可用于外部中断 IRQ2. IDT 描述符类型异常一般使用Interrupt Gate中断门Trap Gate陷阱门系统调用 / 调试常用 Trap Gate不自动清 IF中断统一使用Interrupt Gate硬件会自动清除 IF 标志进入后关中断3. 查表过程两者完全一致向量号 → IDT 索引权限检查CPL ↔ DPL跳转至中断 / 异常处理函数入口唯一小区别异常CPU 内部直接生成向量号中断APIC 送来 IRQ 号 → 映射为向量号返回指令与恢复行为共同返回指令都用iretq32 位iret恢复行为差异异常返回Fault 类回到原指令重新执行例缺页处理完 → 重新访问内存Trap 类回到下一条指令例系统调用、断点中断返回永远回到被打断位置的下一条指令不会重新执行被打断的指令栈恢复iret/iretq动作完全一样从栈弹出rip, cs, rflags, rsp, ss恢复 EFLAGS回到被打断的控制流Linux 内核中的关键数据结构IDT中断描述符表存放所有中断 / 异常的处理入口每个表项含段选择子、偏移、权限、类型。irq_desc中断描述符管理每个 IRQ 的处理函数、状态、掩码。tasklet / 软中断中断下半部机制用于延迟处理非紧急任务。异常处理函数如do_page_fault()、do_syscall_64()、do_invalid_op()。关键要点系统调用属于异常用户态通过syscall/int 0x80主动陷入内核是陷阱类异常非硬件中断。缺页是异常由访问未映射内存触发CPU 内部同步产生非外部中断。中断上下文不可睡眠中断处理中不能调用kmalloc(GFP_KERNEL)、mutex_lock等可能睡眠的函数异常可在进程上下文睡眠。

更多文章