异常与中断

CPU

🔥 高优先级

本节也基本是选择题必考,要掌握 异常和中断的区别 ,就是概念上要区分开,不知道为啥,老头们很喜欢考这个。关于中断的具体介绍参考 组成原理相关章节 的内容。

异常

在 CPU 中,异常 是指在程序执行过程中出现的非正常或意外情况,CPU 需要暂停当前执行,转而调用操作系统提供的异常处理程序。异常机制确保系统能够安全、有效地处理错误或特殊事件,并对程序执行做出相应调整。

类型

在执行指令的过程,可能发生如下五类异常:

  1. 除法错误
  • 触发条件 :程序尝试除以零或执行非法除法操作。
  • 处理方式 :通常由操作系统捕获并中断程序执行,可能显示错误信息或终止程序。
  1. 浮点异常
  • 触发条件:浮点运算出现错误,例如溢出、下溢、除以零或非法操作(如对负数开平方)。
  • 处理方式:操作系统可能中断程序、设置异常标志,或产生 NaN(非数)结果。
  1. 缺页异常
  • 触发条件:程序访问的内存页尚未加载到物理内存中。
  • 处理方式:操作系统会将所需页从磁盘调入内存,更新页表后恢复程序执行。
  1. 保护错误
  • 触发条件:程序试图进行非法操作,如写入只读内存、访问内核空间或执行特权指令。
  • 处理方式:操作系统中断程序执行,防止非法访问。
  1. 硬件错误
  • 触发条件:由硬件错误引起,如内存故障、总线错误、电源故障等。
  • 处理方式:可能导致系统记录错误、尝试修复或直接宕机,具体行为依赖硬件和系统配置。

下表给出了每种类型的一个具体实例,帮助各位理解什么叫做异常:

  • 除法错误
  • 浮点异常
  • 缺页异常
  • 硬件错误
  • 机器检查
int a = 10;
int b = 0;
int c = a / b;  // 除以零,触发除法错误



float x = 0.0;
float y = sqrt(-1.0);  // 无效操作,结果为 NaN(非数) 



char* ptr = mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0);
char c = ptr[0];  // 当访问 ptr[0] 时,触发缺页异常
                  // 内核通过页调度机制将数据从磁盘加载进内存,随后程序继续执行。



int* ptr = (int*)0xFFFF0000;  // 指向只读或内核地址
*ptr = 42;  // 写操作触发保护错误(Segmentation Fault)



// 机器检查异常通常由硬件引发,难以模拟。
// 示例:某些平台可使用特殊指令测试内存校验错误。
// 实际触发依赖硬件环境,下面为伪代码:
char c = *bad_addr;  // 假设该地址引发硬件错误

自陷

自陷 (trap)是 CPU 主动转入异常处理的一种机制。当程序运行过程中出现某些情况需要操作系统介入时,CPU 会触发自陷,将控制权交给内核。与外部中断不同,自陷由当前执行指令或条件触发。

自陷的典型应用:

  1. 异常处理 当程序发生错误,如除零、非法内存访问、无效指令等,会触发自陷进入异常处理流程。
  2. 系统调用 用户程序请求操作系统服务(如打开文件、分配内存等)时,会使用特定的指令(如 x86 的 syscall)触发自陷,从而进入内核态执行系统调用处理程序。
  3. 调试断点 在调试程序时,可以设置断点。当程序运行到断点位置时,会触发自陷,暂停程序以供调试器介入。

自陷处理流程 (简化版)如下:

  • CPU 检测到自陷条件(异常、系统调用或断点);
  • 暂停当前程序执行,保存程序状态(如 PC、寄存器等);
  • CPU 切换到内核态,转入操作系统预设的自陷处理程序;
  • 操作系统根据具体情况处理异常或完成服务;
  • 若问题可恢复,恢复程序状态,继续执行;否则终止程序。

陷阱指令 是显式由程序发起的指令,用于触发自陷事件。它常用于系统调用、调试等场景,是用户程序与操作系统交互的重要机制。

通过异常和自陷机制,CPU 和操作系统能有效应对运行中的各种突发情况,既保证系统稳定,又提供对错误的良好容错与控制能力。

中断

中断是指 CPU 在正常执行程序过程中,由 外部设备软件指令 触发的事件,促使 CPU 暂停当前执行,转而响应处理这些事件的一种机制。中断机制使得 CPU 能够及时响应外部输入、计时器、网络等事件,是现代操作系统和硬件协同工作的核心技术之一。

分类

中断是一个比较大的概念,我们可以 按照其来源 或者 是否可以屏蔽 将其进行分类:

按照来源

  1. 外部中断
  • 触发来源:外部设备或外部事件触发,如输入设备、时钟、外部信号等。
  • 响应:CPU 响应外部事件,执行相应的中断处理程序。
  1. 内部中断 (也叫 异常 ):
  • 触发来源:程序或 CPU 内部状态触发,如异常、错误等。
  • 响应:CPU 根据内部条件触发中断,执行特定的中断处理程序。

按照是否可屏蔽

  1. 可屏蔽中断 (Maskable Interrupt)
  • 可以通过设置中断屏蔽位(如 CPU 的中断允许标志)来暂时禁止的中断。
  • 通常为普通外设中断,如键盘、鼠标、网卡等。
  1. 不可屏蔽中断 (Non-Maskable Interrupt, NMI)
  • 无法被屏蔽的紧急中断,常用于处理系统级错误,如电源故障、内存校验错误等。

中断的分类可以通过下图辅助理解:

中断和异常的区别:

异常 发生在 CPU 内部,在一般的分类方法中可以被看为中断类型的一种(内中断 ),但是在有的书上将中断和异常这两个概念区分了开来:

  • 异常代表 CPU 执行指令时的意外事件
  • 中断代表来自 CPU 外部、与 CPU 执行指令无关的事件引起的中断

异常 (Exception)

在这里注意一下即可,面对题目可以灵活分辨即可。

中断处理流程

中断处理流程参考组成原理中的 该节

相关笔记

  • 数据对齐
  • 指令格式与寻址方式
  • 高级语言与机器码
  • 指令系统
  • 指令操作码
  • 指令集种类