异常与中断
需了解异常和中断的概念和区别,可能在选择题中考察。本节侧重于对比异常和中断,关于中断的具体介绍参考 组成原理相关章节 的内容。
异常
在 CPU 中,异常 是指在程序执行过程中出现的非正常或意外情况,CPU 需要暂停当前执行,转而调用操作系统提供的异常处理程序。异常机制确保系统能够安全、有效地处理错误或特殊事件,并对程序执行做出相应调整。
类型
在执行指令的过程,可能发生如下五类异常:
- 除法错误
- 触发条件:程序尝试除以零或执行非法除法操作。
- 处理方式:通常由操作系统捕获并中断程序执行,可能显示错误信息或终止程序。
- 浮点异常
- 触发条件:浮点运算出现错误,例如溢出、下溢、除以零或非法操作(如对负数开平方)。
- 处理方式:操作系统可能中断程序、设置异常标志,或产生 NaN(非数)结果。
- 缺页异常
- 触发条件:程序访问的内存页尚未加载到物理内存中。
- 处理方式:操作系统会将所需页从磁盘调入内存,更新页表后恢复程序执行。
- 保护错误
- 触发条件:程序试图进行非法操作,如写入只读内存、访问内核空间或执行特权指令。
- 处理方式:操作系统中断程序执行,防止非法访问。
- 硬件错误
- 触发条件:由硬件错误引起,如内存故障、总线错误、电源故障等。
- 处理方式:可能导致系统记录错误、尝试修复或直接宕机,具体行为依赖硬件和系统配置。
下表给出了每种类型的一个具体实例,帮助各位理解什么叫做异常:
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* bad_addr = (char*)0xDEADBEEF;
char c = *bad_addr; // 假设该地址引发硬件错误
自陷
自陷(trap)是 CPU 主动转入异常处理的一种机制。当程序运行过程中出现某些情况需要操作系统介入时,CPU 会触发自陷,将控制权交给内核。与外部中断不同,自陷由当前执行指令或条件触发。
自陷的典型应用:
- 异常处理 当程序发生错误,如除零、非法内存访问、无效指令等,会触发自陷进入异常处理流程。
- 系统调用
用户程序请求操作系统服务(如打开文件、分配内存等)时,会使用特定的指令(如 x86 的
syscall
)触发自陷,从而进入内核态执行系统调用处理程序。 - 调试断点 在调试程序时,可以设置断点。当程序运行到断点位置时,会触发自陷,暂停程序以供调试器介入。
自陷处理流程(简化版)如下:
- CPU 检测到自陷条件(异常、系统调用或断点);
- 暂停当前程序执行,保存程序状态(如 PC、寄存器等);
- CPU 切换到内核态,转入操作系统预设的自陷处理程序;
- 操作系统根据具体情况处理异常或完成服务;
- 若问题可恢复,恢复程序状态,继续执行;否则终止程序。
陷阱指令 是显式由程序发起的指令,用于触发自陷事件。它常用于系统调用、调试等场景,是用户程序与操作系统交互的重要机制。
通过异常和自陷机制,CPU 和操作系统能有效应对运行中的各种突发情况,既保证系统稳定,又提供对错误的良好容错与控制能力。
中断
中断是指 CPU 在正常执行程序过程中,由 外部设备 或 软件指令 触发的事件,促使 CPU 暂停当前执行,转而响应处理这些事件的一种机制。中断机制使得 CPU 能够及时响应外部输入、计时器、网络等事件,是现代操作系统和硬件协同工作的核心技术之一。
分类
中断是一个比较大的概念,我们可以 按照其来源 或者 是否可以屏蔽 将其进行分类:
按照来源- 外部中断:
- 触发来源:外部设备或外部事件触发,如输入设备、时钟、外部信号等。
- 响应:CPU 响应外部事件,执行相应的中断处理程序。
- 内部中断(也叫 异常):
- 触发来源:程序或 CPU 内部状态触发,如异常、错误等。
- 响应:CPU 根据内部条件触发中断,执行特定的中断处理程序。
- 可屏蔽中断(Maskable Interrupt)
- 可以通过设置中断屏蔽位(如 CPU 的中断允许标志)来暂时禁止的中断。
- 通常为普通外设中断,如键盘、鼠标、网卡等。
- 不可屏蔽中断(Non-Maskable Interrupt, NMI)
- 无法被屏蔽的紧急中断,常用于处理系统级错误,如电源故障、内存校验错误等。
注意
中断和异常的区别:
异常发生在 CPU 内部,在一般的分类方法中可以被看为中断类型的一种(内中断),但是在有的书上将中断和异常这两个概念区分了开来:
- 异常代表 CPU 执行指令时的意外事件
- 中断代表来自 CPU 外部、与 CPU 执行指令无关的事件引起的中断
在这里注意一下即可,面对题目可以灵活分辨即可。
中断处理流程
中断处理流程参考计算机组成原理中的 该节。