ARMv7 寄存器 分类

ARMv7-A 架构中,处理器支持多种工作模式(Processor Modes),每种模式下可用的寄存器数量和类型有所不同。以下是基于 ARMv7 的寄存器组织和模式划分的详细说明:

参考链接:https://blog.csdn.net/qq_40309666/article/details/136147962
https://blog.csdn.net/weixin_45649908/article/details/125677511


1. ARMv7 的处理器模式

ARMv7 有 7 种处理器模式(也称为特权模式),每种模式对应不同的权限级别和用途:

  1. User (usr):非特权模式,普通应用程序运行在此。
  2. Supervisor (svc):操作系统内核运行在此。
  3. Fast Interrupt Request (fiq):处理高速中断。
  4. Interrupt Request (irq):处理普通中断。
  5. Abort (abt):处理内存访问异常(如 Prefetch Abort 或 Data Abort)。
  6. Undefined (und):处理未定义指令异常。
  7. Monitor (mon):管理安全状态切换(TrustZone)。
  8. Hyp (hyp):虚拟化扩展模式(部分实现中支持)。

:Monitor 和 Hyp 模式在部分 ARMv7 实现中可能不启用。


2. 寄存器的基本分类

ARMv7 的寄存器分为以下几类:

  • 通用寄存器(General Purpose Registers, GPRs):共 16 个(R0~R15)。
  • 程序状态寄存器(Program Status Registers, PSRs)
    • CPSR(Current Program Status Register):当前程序状态寄存器。
    • SPSR(Saved Program Status Register):异常模式下保存 CPSR 的值。
  • 特殊寄存器(如 CP15 控制寄存器,用于内存管理、时钟等)。

3. 各模式下的寄存器分配

(1) 共享寄存器(未分组寄存器)

  • R0~R7:所有模式下共享相同的物理寄存器。
  • R15(PC):程序计数器,在所有模式下共享。

(2) 分组寄存器(模式专用寄存器)

  • R8~R12:在 FIQ 模式 下有专用的物理寄存器(R8_fiq~R12_fiq)。
  • R13(SP):堆栈指针寄存器(Stack Pointer),每种模式有独立的物理寄存器:
    • SP_usr, SP_svc, SP_irq, SP_abt, SP_und, SP_mon, SP_hyp
  • R14(LR):链接寄存器(Link Register),保存子程序返回地址:
    • LR_usr, LR_svc, LR_irq, LR_abt, LR_und, LR_mon, LR_hyp

(3) 程序状态寄存器

  • CPSR:在所有模式下可访问。
  • SPSR:仅在异常模式(如 FIQ、IRQ、SVC、ABT、UND、MON、HYP)下存在,用于保存异常发生前的 CPSR 值。

4. 各模式下的寄存器列表

模式 通用寄存器 SP(R13) LR(R14) SPSR
User (usr) R0R7(共享)、R8R12(共享)、R13(SP_usr)、R14(LR_usr)、R15(PC) SP_usr LR_usr
FIQ (fiq) R0R7(共享)、R8R12(专用 fiq)、R13(SP_fiq)、R14(LR_fiq)、R15(PC) SP_fiq LR_fiq SPSR_fiq
IRQ (irq) R0R7(共享)、R8R12(共享)、R13(SP_irq)、R14(LR_irq)、R15(PC) SP_irq LR_irq SPSR_irq
SVC (svc) R0R7(共享)、R8R12(共享)、R13(SP_svc)、R14(LR_svc)、R15(PC) SP_svc LR_svc SPSR_svc
ABT (abt) R0R7(共享)、R8R12(共享)、R13(SP_abt)、R14(LR_abt)、R15(PC) SP_abt LR_abt SPSR_abt
UND (und) R0R7(共享)、R8R12(共享)、R13(SP_und)、R14(LR_und)、R15(PC) SP_und LR_und SPSR_und
MON (mon) R0R7(共享)、R8R12(共享)、R13(SP_mon)、R14(LR_mon)、R15(PC) SP_mon LR_mon SPSR_mon
HYP (hyp) R0R7(共享)、R8R12(共享)、R13(SP_hyp)、R14(LR_hyp)、R15(PC) SP_hyp LR_hyp SPSR_hyp

5. 寄存器总数

  • 逻辑上可见的寄存器:16 个通用寄存器(R0~R15) + 1 个 CPSR = 17 个
  • 物理寄存器数量
    • 未分组寄存器(R0~R7、R15):共 9 个物理寄存器。
    • 分组寄存器
      • R8~R12 在 FIQ 模式下有专用副本:5 个物理寄存器。
      • R13(SP):7 个物理寄存器(每种模式一个)。
      • R14(LR):7 个物理寄存器(每种模式一个)。
    • SPSR:7 个物理寄存器(异常模式各一个)。
    • 总计:9(未分组) + 5(R8~R12_FIQ) + 7(SP) + 7(LR) + 7(SPSR) = 35 个物理寄存器
      image

6. 关键寄存器功能说明

(1) R0~R7

  • 作用:通用数据寄存器,用于存储临时数据或函数参数。
  • 特点:所有模式共享同一物理寄存器。

(2) R8~R12

  • User/SVC/IRQ/ABT/UND/HYP 模式:共享同一物理寄存器。
  • FIQ 模式:专用物理寄存器(R8_fiq~R12_fiq),避免中断处理时频繁压栈/出栈。

(3) R13(SP)

  • 作用:堆栈指针,指向当前模式的栈顶。
  • 特点:每种模式有独立的物理寄存器(如 SP_irq、SP_svc)。

(4) R14(LR)

  • 作用:保存子程序返回地址(由 BL 指令设置)。
  • 特点:每种模式有独立的物理寄存器(如 LR_irq、LR_svc)。

(5) R15(PC)

  • 作用:程序计数器,指向当前执行指令的地址。
  • 特点:所有模式共享同一物理寄存器。

(6) CPSR

  • 作用:保存当前处理器状态(条件标志位、中断使能、当前模式等)。
  • 字段
    • M[4:0]:指示当前模式(如 0b10000 表示 SVC 模式)。
    • N/Z/C/V:算术运算结果标志(负数、零、进位、溢出)。
    • I/F:中断屏蔽位(禁止 IRQ/FIQ)。
    • T:ARM/Thumb 状态标志。

(7) SPSR

  • 作用:在异常发生时保存 CPSR 的值,供异常处理结束后恢复。
  • 特点:仅存在于异常模式(如 SPSR_irq、SPSR_svc)。

7. 示例:从 User 模式到 FIQ 模式的寄存器变化

  • User 模式
    • 使用 SP_usrLR_usr
    • R8~R12 是共享寄存器。
  • FIQ 模式
    • 使用 SP_fiqLR_fiq
    • R8~R12 是专用寄存器(无需压栈/出栈,直接访问)。

8. 总结

  • ARMv7 的寄存器设计通过 分组寄存器(如 SP/LR)和 模式专属寄存器(如 SPSR)实现了对不同特权级别的灵活支持。
  • 逻辑上的 16 个通用寄存器(R0~R15)在物理上因模式不同而扩展为多个副本,确保异常处理和中断响应的高效性。
  • CPSR 和 SPSR 是管理处理器状态的核心寄存器,尤其在模式切换和异常处理中扮演关键角色。

这种设计既保持了 RISC 架构的简洁性,又通过硬件机制提高了系统的安全性和性能。

posted @ 2025-04-30 16:01  颜小雀  阅读(176)  评论(0)    收藏  举报