ARM的异常处理模式
一、ARM处理器的CPU处理模式
ARM处理器具有多种处理模式,它们定义了处理器在执行不同类型任务时的行为和权限。这些模式确保了系统运行的安全性、稳定性和高效性。下面是ARM处理器的处理模式的详细介绍:
1. 处理模式的定义
ARM处理器的处理模式是指处理器运行时的状态,用于区分不同的执行环境和权限级别。每种模式有特定的用途和访问权限。
2. 主要处理模式分类
根据ARM架构版本,不同处理器支持的模式略有不同。以下基于ARMv7-A和ARMv8-A架构进行说明,在ARMv7之前的CPU处理模式为7种,之后的版本为8种:
ARMv7-A(32位架构)的处理模式
ARMv7支持以下7种处理模式:
-
用户模式(User Mode):
- 特点:运行用户级代码。
- 权限:不能访问系统控制寄存器和特权指令。
- 适用场景:普通应用程序的运行环境。
-
特权模式(Privileged Modes): ARM处理器运行系统级代码时会切换到特权模式。特权模式包括:
-
管理模式(Supervisor Mode,SVC):
- 权限:特权级最高。
- 适用场景:操作系统内核代码或异常处理时。
- 进入方式:通过执行
SVC
指令或触发特定异常。
-
中断模式(IRQ Mode):
- 权限:特权模式,用于处理中断请求。
- 适用场景:快速响应外部硬件中断。
-
快速中断模式(FIQ Mode):
- 权限:特权模式,用于快速处理中断。
- 特点:支持更快的中断响应,专用寄存器减少上下文切换开销。
- 适用场景:时间敏感的硬件操作。
-
中止模式(Abort Mode):
- 权限:特权模式。
- 适用场景:处理指令或数据访问异常,如内存非法访问。
-
未定义模式(Undefined Mode):
- 权限:特权模式。
- 适用场景:处理未定义指令异常。
-
系统模式(System Mode):
- 权限:特权模式,但允许直接访问用户模式资源。
- 适用场景:系统任务需要访问用户模式的资源时。
-
-
处理模式切换:
- 模式切换通常由异常、外部中断或程序指令触发。
- 处理器进入不同模式时会更新**CPSR(Current Program Status Register)**中的模式位。
所谓的异常模式:指CPU在某些特定情况下(异常)会自动进入模式执行。之所以设计出这么多模式,就是为了 应对CPU在运行时的各种突发事件。在ARMv8之后引入了一个安全模式,加上之前的七种模式,总共8种处理模式,又将其分为特权模式,和非特权模式,处理用户模式是非特权模式之外,其余模式都是特权模式。
ARMv8-A(64位架构)的处理模式
在ARMv8引入64位架构后,处理模式简化为以下两种主要状态:
-
非特权状态(EL0):
- 类似于ARMv7的用户模式。
- 适用场景:运行用户级应用程序。
-
特权状态(EL1至EL3):
-
ARMv8引入了执行层(Exception Levels,EL),用来替代传统的多模式体系。包括:
-
EL1(内核模式):
- 适用场景:操作系统内核运行。
- 特权级别:管理硬件资源、配置内存映射、处理异常。
-
EL2(虚拟化模式):
- 适用场景:支持虚拟化的环境,运行虚拟机管理程序(Hypervisor)。
- 特权级别:高于EL1,控制多个虚拟机。
-
EL3(监控模式):
- 适用场景:安全环境(如TrustZone)或系统管理任务。
- 特权级别:最高,用于管理进入/退出安全模式或其他特权模式。
-
-
ARMv8的特性:
- 简化了传统处理模式,提供更清晰的层级划分。
- 允许更好的安全性和虚拟化支持。
二、不同模式的切换
那么ARM当中CPU有这么多模式,肯定要进行模式切换操作,
模式切换:
应用程序在用户模式下执行,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的,ARM处理器的当前运行模式可以通过软件改变,也可能通过外部中断或异常处理改变。在ARM 处理中规定了7种异常源,只要出现对应的异常源,就会进入到对应的异常模式(工作模式的切换)。其中异常源的触发方式和进入对应的异常模式如下图:
在ARM体系结构中,有7种异常源(异常情况),当只要出现对应的异常源(异常情况),切换到对应的异常模式中执行,对异常源的处理操作(在对应的异常模式下),就叫做 异常处理,处理异常操作需要切换到对应的异常模式下面进行处理,那么CPU是怎么来跳转的呢?
三、切换模式时CPU的工作过程
在ARM体系结构中,异常处理是指当处理器检测到某种异常源时,切换到特定的异常模式并执行相应的处理代码。异常处理分为硬件自动操作和软件响应操作。
不同工作模式下面的寄存器,有三角阴影的是私有寄存器,没有三角阴影的是通用寄存器,最上面是对应的模式,
R0~R12:通用寄存器,没有特定功能。
专用寄存器:
R13(SP):栈指针寄存器,当前程序执行的栈顶位置(每种模式下都有自己的栈指针寄存器,来存储自己模式的栈空间地址)
R14(LR):链接寄存器,用于存储跳转时,返回的地址(每种模式下都有自己的链接寄存器)
R15(PC):程序计数寄存器,用于表示当前程序运行的位置(内存地址),CPU要去获取的指令的地址(PC寄存器会由CPU自动+4)
硬件自动操作
当异常源被触发,ARM处理器会自动执行以下操作。这些步骤由硬件完成:
第一步:保存当前执行状态
- 将当前程序状态寄存器(CPSR)的内容备份到对应异常模式下的保存程序状态寄存器(SPSR)。
- 作用:保存异常发生时的CPU状态,以便异常处理完成后可以恢复。
第二步:切换到异常模式
- 更新CPSR寄存器的模式位,切换到异常类型对应的模式,注意这里切换模式并不是将CPSR存储对应模式的地址,而是将0-4位设置为对应的二进制码,不同的二进制码对应不同的模式,设置位置看下图当中的CPSR寄存器,该寄存器是一个32位的寄存器,0-4是用来设置对应模式的位数,当设置0-4位为10000时,就是用户模式,其他的看下图:
- 常见模式包括:Supervisor(SVC管理模式)、Abort(中止模式)、IRQ(普通中断模式)、FIQ(快速中断模式)等,
- 处理器自动进入ARM状态(而非Thumb状态)。注:(这里为什么要这么设置呢?ARM状态是默认的异常处理状态,所有异常代码都以ARM指令集编写。humb是ARM后来扩展的一种优化模式,早期ARM处理器只有ARM指令集,异常处理逻辑默认支持ARM状态,以保持与旧架构的兼容性。)
- 禁止中断:
- 禁止IRQ中断。
- 如果是FIQ异常,还会禁止FIQ中断。
第三步:保存返回地址
- 将异常发生时(下一条需要执行的指令的地址)保存到对应异常模式下的链接寄存器(LR)。保存返回地址这一步中,保存到异常模式下的LR(链接寄存器)的值是触发异常时的下一条指令的地址,及等会处理完异常处理之后,还需要继续回来执行下面的指令。
- 返回地址的调整:
- 对于某些异常类型,返回地址需要减去若干字节(如SWI或IRQ异常)。
- 原因:ARM的流水线特性使得PC总是指向当前指令后的两条指令。
- 返回地址的调整:
第四步:跳转到异常向量表
- 处理器将PC指针设置为异常向量表中对应异常类型的地址。
- 异常向量表:一个固定的内存区域,存储不同异常类型的处理入口地址。
- 地址范围:0x00000000 ~ 0x0000001C(ARMv7默认)。
- Reset异常:0x00000000
- Undefined指令:0x00000004
- SWI:0x00000008
- Prefetch Abort:0x0000000C
- Data Abort:0x00000010
- IRQ:0x00000018
- FIQ:0x0000001C
- 地址范围:0x00000000 ~ 0x0000001C(ARMv7默认)。
- 异常向量表:一个固定的内存区域,存储不同异常类型的处理入口地址。
软件响应操作
硬件操作完成后,处理器会跳转到异常处理代码的入口地址,进入软件异常处理阶段:
- 保存上下文:
- 保存所有使用的通用寄存器(如R0~R12),防止覆盖其他任务的状态。
- 处理异常:
- 根据异常类型执行特定的操作(如日志记录、资源清理、错误恢复等)。
- 恢复上下文:
- 恢复通用寄存器和程序状态寄存器(SPSR内容恢复到CPSR)。
- 返回异常发生点:
- 使用
SUBS PC, LR, #offset
或类似指令返回到异常发生点并继续执行程序。
- 使用
异常优先级
当多个异常同时触发时,ARM根据固定优先级进行处理:
- 复位(Reset)——最高优先级。
- 数据中止(Data Abort)。
- FIQ(快速中断)。
- IRQ(普通中断)。
- 预取中止(Prefetch Abort)。
- SWI(软件中断)。
- 未定义指令(Undefined Instruction)。最低优先级
四、总结
主要讲述了ARM当中CPU处理异常处理的工作流程,从上到下,主要是硬件处理过程,其中还有很多小细节没有讲述清除,比如CPSR当中的其他位代表什么意思?
条件码标志(condition code flags):
「N,Z,C,V」均为条件码标志位,它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。在ARM状态下,绝大多数的指令都是有条件执行的,在Thumb状态下,仅有分支指令是有条件执行的。
「N (Number)」:当用两个补码表示的带符号数进行运算时,N=1表示运行结果为负,N=0表示运行结果为正或零
「Z :(Zero)」:Z=1表示运算结果为零,Z=0表示运行结果非零
「C」 :可以有4种方法设置C的值:
- (Come)加法运算(包括CMP):当运算结果产生了进位时C=1,否则C=0
- 减法运算(包括CMP):当运算产生了借位,C=0否则C=1
- 对于包含移位操作的非加/减运算指令 ,C为移出值的最后一位
- 对于其他的非加/减运算指令C的值通常不改变
「V」 :(oVerflow)对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号位溢出时,V=1表示符号位溢出;对于其他的非加/减运算指令V的值通常不改变
「Q」:在ARM V5及以上版本的E系列处理器中,用Q标志位指示增强的DSP运算指令是否发生了溢出。在其它版本的处理器中,Q标志位无定义
「J:」
仅ARM v5TE-J架构支持 , T=0;J = 1 处理器处于Jazelle状态,也可以和其他位组合.
「E位:」大小端控制位
「A位:」A=1 禁止不精确的数据异常
「T :」T = 0;J=0; 处理器处于 ARM 状态T = 1;J=0 处理器处于 Thumb 状态T = 1;J=1 处理器处于 ThumbEE 状态
控制位 CPSR的低8位(包括I,F,T和M[4:0])称为控制位,当发生异常时这些位可以被改变,如果处理器运行特权模式,这些位也可以由程序修改。
「中断禁止位I,F」【重要】I=1 禁止IRQ中断F=1 禁止FIQ中断
比如我们要想在程序中实现禁止中断,那么就需要将CPSR[7]置1。
难度太大,大家谨慎学习,这只是基础知识
原文地址:https://blog.csdn.net/2301_78622258/article/details/143896759
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!