自学内容网 自学内容网

ARM的异常处理模式

一、ARM处理器的CPU处理模式

ARM处理器具有多种处理模式,它们定义了处理器在执行不同类型任务时的行为和权限。这些模式确保了系统运行的安全性、稳定性和高效性。下面是ARM处理器的处理模式的详细介绍:


1. 处理模式的定义

ARM处理器的处理模式是指处理器运行时的状态,用于区分不同的执行环境和权限级别。每种模式有特定的用途和访问权限。


2. 主要处理模式分类

根据ARM架构版本,不同处理器支持的模式略有不同。以下基于ARMv7-AARMv8-A架构进行说明,在ARMv7之前的CPU处理模式为7种,之后的版本为8种:

ARMv7-A(32位架构)的处理模式

ARMv7支持以下7种处理模式:

  1. 用户模式(User Mode)

    • 特点:运行用户级代码。
    • 权限:不能访问系统控制寄存器和特权指令。
    • 适用场景:普通应用程序的运行环境。
  2. 特权模式(Privileged Modes): ARM处理器运行系统级代码时会切换到特权模式。特权模式包括:

    • 管理模式(Supervisor Mode,SVC)

      • 权限:特权级最高。
      • 适用场景:操作系统内核代码或异常处理时。
      • 进入方式:通过执行SVC指令或触发特定异常。
    • 中断模式(IRQ Mode)

      • 权限:特权模式,用于处理中断请求。
      • 适用场景:快速响应外部硬件中断。
    • 快速中断模式(FIQ Mode)

      • 权限:特权模式,用于快速处理中断。
      • 特点:支持更快的中断响应,专用寄存器减少上下文切换开销。
      • 适用场景:时间敏感的硬件操作。
    • 中止模式(Abort Mode)

      • 权限:特权模式。
      • 适用场景:处理指令或数据访问异常,如内存非法访问。
    • 未定义模式(Undefined Mode)

      • 权限:特权模式。
      • 适用场景:处理未定义指令异常。
    • 系统模式(System Mode)

      • 权限:特权模式,但允许直接访问用户模式资源。
      • 适用场景:系统任务需要访问用户模式的资源时。
  3. 处理模式切换

    • 模式切换通常由异常、外部中断或程序指令触发。
    • 处理器进入不同模式时会更新**CPSR(Current Program Status Register)**中的模式位。 

        所谓的异常模式:指CPU在某些特定情况下(异常)会自动进入模式执行。之所以设计出这么多模式,就是为了 应对CPU在运行时的各种突发事件。在ARMv8之后引入了一个安全模式,加上之前的七种模式,总共8种处理模式,又将其分为特权模式,和非特权模式,处理用户模式是非特权模式之外,其余模式都是特权模式。

ARMv8-A(64位架构)的处理模式

在ARMv8引入64位架构后,处理模式简化为以下两种主要状态:

  1. 非特权状态(EL0)

    • 类似于ARMv7的用户模式。
    • 适用场景:运行用户级应用程序。
  2. 特权状态(EL1至EL3)

    • ARMv8引入了执行层(Exception Levels,EL),用来替代传统的多模式体系。包括:

    • EL1(内核模式)

      • 适用场景:操作系统内核运行。
      • 特权级别:管理硬件资源、配置内存映射、处理异常。
    • EL2(虚拟化模式)

      • 适用场景:支持虚拟化的环境,运行虚拟机管理程序(Hypervisor)。
      • 特权级别:高于EL1,控制多个虚拟机。
    • EL3(监控模式)

      • 适用场景:安全环境(如TrustZone)或系统管理任务。
      • 特权级别:最高,用于管理进入/退出安全模式或其他特权模式。
  3. 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
软件响应操作

硬件操作完成后,处理器会跳转到异常处理代码的入口地址,进入软件异常处理阶段:

  1. 保存上下文
    • 保存所有使用的通用寄存器(如R0~R12),防止覆盖其他任务的状态。
  2. 处理异常
    • 根据异常类型执行特定的操作(如日志记录、资源清理、错误恢复等)。
  3. 恢复上下文
    • 恢复通用寄存器和程序状态寄存器(SPSR内容恢复到CPSR)。
  4. 返回异常发生点
    • 使用SUBS PC, LR, #offset或类似指令返回到异常发生点并继续执行程序。

 

异常优先级

当多个异常同时触发时,ARM根据固定优先级进行处理:

  1. 复位(Reset)——最高优先级。
  2. 数据中止(Data Abort)。
  3. FIQ(快速中断)。
  4. IRQ(普通中断)。
  5. 预取中止(Prefetch Abort)。
  6. SWI(软件中断)。
  7. 未定义指令(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)!