ARMv8异常的类型与处理

本文声明:内容来源于网络,进行整合/再创作;部分内容由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) | 异步 | 外部硬件设备 | 与当前指令无关,通过中断控制器仲裁后触发。用于处理外设请求,保障实时性/通用通信。 |
| 中止 (指令/数据) | 同步 | 内存访问失败 | 由执行某条指令直接导致,返回地址能准确定位问题指令。可用于处理内存访问错误,支持动态内存管理。 |
| 复位 | ------ | 外部复位引脚 | 最高优先级,不可屏蔽。用于内核启动和初始化。 |

核心逻辑梳理

相关推荐
EnglishJun5 小时前
ARM嵌入式学习(二) --- 入门51(中断)
arm开发·学习
头发够用的程序员1 天前
GPU 流水线底层探索:从 SIMT 前端到 SIMD 后端的全链路解析
arm开发·人工智能·嵌入式硬件·深度学习·硬件架构·边缘计算
梁洪飞1 天前
armv7a和uboot里面的重要概念
arm开发·嵌入式硬件·arm
忆和熙2 天前
ARM异常概述与级别(ARMv8异常机制——异常的概述、级别)
arm开发·arm异常
嵌入式学习菌2 天前
用 mDNS 实现逆变器与电表的自动通信
arm开发
fygfh.2 天前
Linux的系统架构浅析
linux·arm开发·系统架构
忆和熙3 天前
ARM Load/Store指令、伪指令(ARM处理器指令系统——ARM指令集初学,下篇)
arm开发·arm指令
忆和熙3 天前
ARM数据处理指令(ARM处理器指令系统——ARM指令集初学,上篇)
arm开发·arm指令
EnglishJun3 天前
ARM嵌入式学习(一) --- 入门51
arm开发·学习