目录一、中断的分类1. 可屏蔽中断2. 不可屏蔽中断二、异常的分类1. 故障2. 陷阱3. 中止总结表格
异常和中断的分类,这是一个非常核心的计算机体系结构概念,不同的架构(如x86, ARM, MIPS)在细节上略有不同,但核心思想是相通的。
下图从来源和目的的角度,清晰地展示了异常与中断的整体分类框架:
flowchart TD
A[CPU外部事件] --> B[中断 Interrupt
异步]
A --> C[异常 Exception
同步]
B --> D[可屏蔽中断
e.g. 来自网卡、声卡、硬盘等]
B --> E[不可屏蔽中断
e.g. 硬件故障、电源掉电]
C --> F[故障 Fault
可修复,重试指令
e.g. 缺页异常]
C --> G[陷阱 Trap
有意为之,继续下条指令
e.g. 系统调用、调试断点]
C --> H[中止 Abort
严重错误,终止程序
e.g. 硬件错误、非法指令]
一、中断的分类
中断主要根据其紧急程度和是否可被忽略来分类。
1. 可屏蔽中断
特点:CPU可以通过设置程序状态字中的中断屏蔽位来禁止响应这类中断。当屏蔽位被设置时,即使中断发生,CPU也会忽略它。
目的:允许操作系统在执行一些关键、不允许被打断的代码段(如内核调度、修改重要数据结构)时,暂时关闭中断。
来源:绝大多数由外部设备产生的中断都属于此类。
示例:
硬件定时器中断:用于操作系统实现时间片轮转调度。
I/O设备中断:如键盘按键、鼠标移动、网卡收到数据包、硬盘数据读写完成。
2. 不可屏蔽中断
特点:无法通过中断屏蔽位来禁止。一旦发生,CPU必须立即处理。它拥有最高的优先级。
目的:用于处理非常紧急、关乎系统存亡的硬件故障,必须立即响应。
来源:通常是严重的硬件错误。
示例:
内存奇偶校验错误:内存数据在读写过程中发生错误。
总线错误:在数据传输过程中发生严重错误。
电源掉电警告:电源即将耗尽,通知CPU尽快保存关键数据。
二、异常的分类
异常主要根据其产生原因、处理方式以及返回行为来分类。在x86架构中,异常通常分为以下三类:
1. 故障
特点:
在执行指令的过程中检测到错误。
异常处理程序会尝试修复这个错误。
修复成功后,返回并重新执行那条引发异常的指令。
类比:你读一句话时发现有个词不认识(故障),去查字典(处理程序),回来后重新读这个词(重试指令)。
示例:
缺页异常:这是最经典的故障。当程序访问一个不在物理内存中的虚拟地址时,CPU会触发缺页故障。操作系统的处理程序会从硬盘上加载所需的数据到内存,然后返回并重新执行那条访问内存的指令,这次就能成功执行了。
段错误的一部分情况:例如访问了一个合法但尚未加载的地址。
2. 陷阱
特点:
在执行指令后立即报告异常。
通常是有意触发的,用于调试或请求系统服务。
异常处理程序执行完毕后,返回并执行引发陷阱指令的【下一条】指令。
类比:你主动设置一个闹钟(陷阱),闹钟响后(触发异常),你去处理一件事(处理程序),处理完后回来继续做下一件事(执行下一条指令)。
示例:
系统调用:这是陷阱最重要的应用。用户程序通过执行一条特殊指令(如x86的int 0x80或更现代的syscall/sysenter指令)来主动陷入内核,请求操作系统提供服务(如打开文件、创建进程)。处理完后,返回用户空间继续执行系统调用之后的指令。
调试断点:程序员在代码中设置断点,调试器实际上会将断点处的指令替换为一条陷阱指令(如x86的int 3)。当CPU执行到这里时,触发陷阱,控制权交给调试器。
3. 中止
特点:
无法确定引发异常的指令的精确位置。
错误非常严重,通常是硬件级别的致命错误。
异常处理程序无法修复错误,通常只能收集尽可能多的错误信息,然后终止出错的程序甚至整个系统。
类比:书中的某一页被撕掉了,而且你不知道具体是哪一行(无法定位),你完全无法继续阅读,只能合上书(终止程序)。
示例:
硬件错误:如内存校验错误、处理器温度过高等。
非法指令:CPU遇到了一条它无法识别的指令编码。
严重的系统一致性错误。
总结表格
类型
特点
返回行为
示例
可屏蔽中断
来自外设,可被CPU屏蔽
返回被中断指令
键盘、鼠标、定时器中断
不可屏蔽中断
来自硬件故障,不可屏蔽
返回被中断指令(如果可能)
内存错误、掉电
故障
指令执行中出错,可修复
返回并重试原指令
缺页异常、段错误(部分)
陷阱
指令执行后主动触发
返回执行下一条指令
系统调用、调试断点
中止
严重硬件错误,不可恢复
无法返回,终止程序/系统
硬件故障、非法指令
理解这些分类有助于深入理解操作系统如何管理硬件、处理错误以及为用户程序提供服务。