arm v8r的通用寄存器总结
好的,这是一个非常具体的技术问题。ARMv8-R架构的通用寄存器与其经典的ARMv7-R架构类似,并且与ARMv8-A的AArch32状态下的寄存器集高度兼容,因为它主要运行在32位执行状态下。
ARMv8-R架构的通用寄存器组包含16个32位寄存器,命名为 R0 到 R15。这些寄存器可以根据其特定功能分为几类:
核心通用寄存器 (R0-R12)
- R0 - R7: 这些是未分组的寄存器(或称为低寄存器)。在所有处理器模式下(例如 User、IRQ、FIQ、SVC 等),指令都可以访问到同一组物理 R0-R7 寄存器。这是进行通用数据处理操作最常用的寄存器。
- R8 - R12: 这些是分组寄存器(或称为高寄存器)。除了 FIQ 模式外,在其他所有处理器模式下,它们都指向同一组物理寄存器。在FIQ(快速中断)模式下,它们有自己独立的物理副本(即 R8_fiq - R12_fiq)。这非常重要,因为进入FIQ中断时,处理器可以直接使用这些独立的寄存器,而无需先保存用户模式的R8-R12,从而极大地加速了中断处理,满足了实时性要求。
特殊功能寄存器 (R13-R15)
这三个寄存器有专门的用途和别名:
-
R13: 栈指针 (SP)
- 通常用作栈指针,用于在调用子程序或处理中断时保存临时数据。
- 它也是分组寄存器。每个异常模式(如 IRQ、FIQ、SVC、Abort 等)都有自己独立的 SP(即 SP_irq, SP_fiq, SP_svc 等)。这确保了当模式切换时(例如发生中断),操作系统或实时内核可以使用专属的栈,而不会破坏用户程序的栈,提高了系统的可靠性和确定性。
-
R14: 链接寄存器 (LR)
- 当执行分支链接指令(如
BL)时,处理器会自动将返回地址(下一条指令的地址)保存到 LR 中。 - 在进入异常(如中断)时,处理器也会自动将返回地址保存到当前模式的 LR 中(如 LR_irq, LR_svc)。
- 它也是分组寄存器,每个模式都有自己独立的 LR。
- 当执行分支链接指令(如
-
R15: 程序计数器 (PC)
- 指向当前正在执行的指令。写入 PC 的值会引发跳转(分支)。
- 所有模式共享同一个 PC。
当前程序状态寄存器 (CPSR)
虽然不是一个通用寄存器(无法像R0那样进行算术运算),但它是核心编程模型不可或缺的一部分。
- CPSR 包含了关键的状态和控制位,例如:
- 条件标志位 (N, Z, C, V): 表示上一条算术或逻辑操作的结果(负数、零、进位、溢出)。
- 中断禁用位 (I, F): 用于启用或禁用IRQ和FIQ中断。
- 执行状态位 (T): 指示当前是执行 ARM 指令还是 Thumb 指令。对于 Cortex-R 系列,通常设置为 1,表示主要运行Thumb-2指令集以获得最佳的代码密度和性能。
- 模式位 (M[4:0]): 指示处理器当前处于何种模式(如 User, FIQ, IRQ, SVC等)。
总结表
| 寄存器 | 别名 | 功能 | 分组情况 |
|---|---|---|---|
| R0 - R7 | - | 通用数据寄存器 | 不分组(所有模式共享) |
| R8 - R12 | - | 通用数据寄存器 | 分组(仅在FIQ模式有独立副本) |
| R13 | SP | 栈指针 | 分组(每个异常模式都有独立SP) |
| R14 | LR | 链接寄存器(保存返回地址) | 分组(每个异常模式都有独立LR) |
| R15 | PC | 程序计数器 | 不分组 |
| - | CPSR | 当前程序状态寄存器 | - |
在虚拟机模式,有一个额外的专用链接寄存器ELR_hyp;
重要提示:与 ARMv8-A 的区别
- ARMv8-R 旨在提供具有内存保护功能的实时确定性行为。它没有实现 ARMv8-A 中的 AArch64(64位)执行状态。因此,ARMv8-R 处理器没有 ARMv8-A 中那些 64 位的通用寄存器(如 X0-X30)。
- ARMv8-R 的核心编程模型与 ARMv7-A/R 一脉相承,专注于 32 位,并增强了内存保护单元(MPU)等功能,非常适合汽车、工业和医疗等对时间有苛刻要求的嵌入式实时应用。
简单来说,你可以将 ARMv8-R 的寄存器模型理解为经典的 ARM32 寄存器集,并针对高可靠性实时操作进行了优化(通过大量的寄存器分组来实现快速上下文切换)。
浙公网安备 33010602011771号