本文声明:内容来源于网络,进行整合/再创作;部分内容由AI辅助生成。
在计算机系统中,异常不仅仅是"错误",它是一个广义概念。
- 定义:任何导致软件正常执行流程被强行打断的事件。
- 目的:通知特权软件(如操作系统内核或异常处理程序)介入,采取措施以确保系统继续正常运行。
- 机制:每种异常类型都有对应的异常处理程序。处理完异常后,特权软件将为内核做好准备工作,以恢复发生异常之前的所有操作。
根据触发源、优先级及与指令流的关系,异常主要分为三类:中断异常、中止异常、复位异常。
中断异常(外部信号请求、不可预测、异步)
这是最常见的异常类型,由外部硬件通过内核的物理引脚发送信号触发,核心是外部设备与内核的通信请求。
1、两大核心类型:FIQ 与 IRQ
- FIQ(快速中断):优先级更高的中断类型,专为高实时性需求设计(比如高速数据传输),特点是处理程序执行速度快、寄存器占用少,减少中断响应时间。
- IRQ(普通中断):优先级低于 FIQ,用于一般外设请求(如按键、串口数据接收),是系统中最常用的中断类型。
- 两者共性:均对应内核的物理输入引脚(内核的 FIQ 接口、IRQ 接口),且需中断控制器参与调度。
2、触发与响应机制
- 前提:内核未禁用对应中断(即使能FIQ/IRQ),外部硬件发出中断请求后,请求会在中断控制器中排队。
- 触发时机:当前指令执行完成后(部分加载多个值的指令允许被打断),内核会响应并跳转到对应异常处理程序。
- 中断控制器:是多外设中断管理的核心,连接所有外设中断源,对中断进行仲裁 (决定谁更重要)、优先级排序 、去重,最终将串行化的中断信号发送到内核的 FIQ/IRQ 引脚。
3、关键属性
- 属于异步 异常:中断异常的触发与内核当前执行的软件指令无直接关联,由外部硬件独立触发。
- 其他异步异常:除 FIQ、IRQ 外,系统错误(SError) 也属于异步异常,通常由硬件故障(如内存访问错误、总线异常)触发。
中止异常(内存访问失败、指令相关、同步)
这类异常由内存访问相关的错误触发,核心是指令/数据访问失败,分为指令中止和数据中止两类。
1、触发场景
- 指令中止:处理器在指令提取阶段失败,比如要执行的指令所在内存地址无效、不存在,或外部存储器返回错误响应。
- 数据中止:处理器在数据加载 / 存储阶段失败,比如访问的内存地址不合法、权限不足,或 MMU(内存管理单元)转换失败。
- 触发主体:可能是外部存储器系统(如访问不存在的内存地址),也可能是内核的 MMU。(MMU负责虚拟地址到物理地址的转换和权限管理,操作系统可利用 MMU 中止异常实现动态内存分配,比如来实现"按需分页",即只为应用程序当前真正用到的内存分配物理空间)
2、同步特性(核心关键)
- 中止异常是同步 异常:中止异常的触发与处理器正在执行的特定指令直接相关 ,是执行该指令的直接结果,且返回地址能精准指向出错指令且能提供详细信息。
- 指令中止:异常发生在指令执行前 (提取阶段)。若在指令进入执行阶段前刷新流水线,异常不会触发。异常仅在内核尝试执行该指令时才触发。
- 数据中止:异常发生在数据读写后,是加载 / 存储指令的直接结果。
特殊说明:在 ARMv8-A 架构中,指令中止和数据中止均为同步异常,这是 ARMv8 架构的核心规范之一。
复位异常(开机启动、不可屏蔽、最高级别)
这是优先级最高的特殊异常,是 ARM 内核启动与初始化的核心机制。
1关键特征
- 属于最高级别异常 ,是所有异常中优先级最高的类型,会中止一切正在进行的操作,并且无法被屏蔽(无论内核是否使能中断,复位都能触发)。
- 有固定地址的复位向量 :异常触发时,内核会强制跳转到该固定地址执行复位相关代码,这个地址由RVBAR_ELn 寄存器存储(n 为当前实现的最高异常级别编号)。
2、触发与作用
- 触发条件:内核有专用的复位输入引脚,上电启动 或硬件复位时,内核会立即执行复位异常。
- 核心作用:完成内核的初始化工作(比如配置寄存器、初始化内存、启动操作系统),是系统从 "断电状态" 到 "正常运行" 的第一步,无法被任何程序干扰。
三类异常对比总结
|------------------|--------|--------|-------------------------------------------------|
| 异常类型 | 同步/异步 | 触发源 | 关键特性 |
| 中断 (IRQ/FIQ) | 异步 | 外部硬件设备 | 与当前指令无关,通过中断控制器仲裁后触发。用于处理外设请求,保障实时性/通用通信。 |
| 中止 (指令/数据) | 同步 | 内存访问失败 | 由执行某条指令直接导致,返回地址能准确定位问题指令。可用于处理内存访问错误,支持动态内存管理。 |
| 复位 | ------ | 外部复位引脚 | 最高优先级,不可屏蔽。用于内核启动和初始化。 |
核心逻辑梳理
