[register]-04-ARMv8的寄存器简介和总结

本文详细对比了ARMv8与ARMv7架构中的寄存器类型,包括通用寄存器、向量寄存器、状态寄存器等,并深入介绍了ARMv8的系统寄存器,如特殊用途寄存器、地址转换和TLB维护指令等。

快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈

在这里插入图片描述

在介绍寄存器之前,我们先看下ARM中都有什么,以arm为例:
在这里插入图片描述

1、通用寄存器

(1)、 a r m v 7 \color{red}{arm v7} armv7 有 16 个 32-bit 通用寄存器,用 r0-r15 表示;
sp:r13, lr:r14, pc:r15
(2)、 a r m v 8 \color{red}{arm v8} armv8 有 31 个 64-bit 通用寄存器,用 x0-x30 表示,和v7不一样的是,这31个寄存器也可以作为 32-bit 寄存器来用,用 w0-w30 表示,其中 wn 是 xn 的低32位;
lr:x30, sp, pc

2、向量寄存器(SIMD)

(1)、 a r m v 7 \color{red}{arm v7} armv7 包含 16 个 128-bit 向量寄存器,用 q0-q15 表示。其中每个q寄存器又可以拆分成两个 64-bit 向量寄存器来用,用 d0-d31 来表示
(2)、 a r m v 8 \color{red}{arm v8} armv8 包含32个 128-bit 向量寄存器

a)、每个128-bit向量寄存器可以当做:

  • 包含 2 个 64-bit 元素的向量寄存器来用,表达形式是 vn.2d;
  • 包含 4 个 32-bit 元素的向量寄存器来用,表达形式是 vn.4s;
  • 包含 8 个 16-bit 元素的向量寄存器来用,表达形式是 vn.8h;
  • 包含 16 个 8-bit 元素的向量寄存器来用,表达形式是 vn.16b;

或者每个向量寄存器也可以只用低 64-bit:

  • 1 个 64-bit 元素的向量寄存器来用,表达形式是 vn.1d;
  • 2 个 32-bit 元素的向量寄存器来用,表达形式是 vn.2s;
  • 4 个 16-bit 元素的向量寄存器来用,表达形式是 vn.4h;
  • 8 个 8-bit 元素的向量寄存器来用,表达形式是 vn.8b;

q:128, d:64, s:32, h:16, b:8

状态寄存器

3、banked registers:

(armv8文档描述)
Banked register
A register that has multiple instances, with the instance that is in use depending on the PE mode, Security state, or other PE state

(stackoverflow的描述)
(https://stackoverflow.com/questions/42810627/arm-banked-register 描述)
In ARM there is a concept of Banked Register. While reading many questions and their answer and various other resources about what is Banked mean here. Then I got this definition: Register banking refers to providing multiple copies of a register at the same address. Not all registers can be seen at once.

a r m v 7 \color{red}{arm v7} armv7中,有很多banked registers,例如TTBRx,VBAR,SCTLR…
a r m v 8 \color{red}{arm v8} armv8中,banked registers就少了很多,因为大多数系统寄存器都添加了ELx后缀

4、状态寄存器CPSR:

在armv7上有cpsr寄存器
在armv8-32上同样有cpsr寄存器
在armv8-32上同样有PSTATE取代了cpsr,PSTATE是一组状态寄存器的集合

5、系统寄存器:

在armv7上,系统寄存器的读写都是通过协处理器指令来操作的
在armv8-arch64上,移除了协处理器的概念,通过MSR/MRS来访问系统寄存器。

6、以下重点介绍ARMV8的系统寄存器:

• Special-purpose registers.
• VMSA-specific registers
• ID registers on page
• Performance monitors registers
• Debug registers on page
• RAS registers on page
• Generic timer registers
• Cache maintenance system instructions
• Address translation system instructions
• TLB maintenance system instructions
• Prediction restriction System instructions
• Base system registers

(1)、Special-purpose registers
ELR_EL1
ELR_EL2
ELR_EL3

SP_EL0
SP_EL1
SP_EL2
SP_EL3

SPSR_EL1
SPSR_EL2
SPSR_EL3
SPSR_fiq
SPSR_irq
SPSR_und
SPSR_abt
(2)、Base system registers
PSTATE
SCR_EL3
SCTLR_EL1
SCTLR_EL2
SCTLR_EL3
VBAR_EL1
VBAR_EL2
VBAR_EL3

其中PSTATE又包含:
NZCV
DAIF
CurrentEL
SPSel
PAN
UAO
DIT
SSBS
(3)、Cache maintenance system instructions
DC CGDSW
DC CGDVAC
DC CGDVADP
DC CGDVAP
DC CGSW
DC CGVAC
…(共31个)…

DC CGDVAC, <Xt>

(4)、Address translation system instructions
AT S12E0R
AT S12E0W
AT S12E1R
AT S12E1W
AT S1E0R
AT S1E0W
AT S1E1R
AT S1E1RP
AT S1E1W
AT S1E1WP
AT S1E2R
AT S1E2W
AT S1E3R
AT S1E3W

AT S1E1W, <Xt>

(5)、TLB maintenance system instructions
TLBI ALLE1
TLBI ALLE1IS
TLBI ALLE1OS
TLBI ALLE2
TLBI ALLE2IS
TLBI ALLE2OS
…(共78个)…

TLBI ALLE1IS{, <Xt>}

(6)、cryptographic Extension instructions


ARMv8架构下的寄存器组成及其功能是该架构设计中的核心部分,它支持两种执行状态:AArch64AArch32。以下是针对这两种状态的寄存器概述: ### AArch64执行状态 在AArch64模式下,ARMv8提供了丰富的通用寄存器专用寄存器,以支持现代操作系统应用程序的需求。 #### 通用寄存器 - **X0-X30**:31个64位通用寄存器,用于存储数据、地址等信息。这些寄存器可以作为32位(W0-W30)或64位(X0-X30)使用。 - **SP (Stack Pointer)**:堆栈指针寄存器,用于指向当前堆栈顶部的位置。 - **PC (Program Counter)**:程序计数器,指示下一条要执行的指令地址。 - **LR (Link Register)**:通常由子程序调用指令自动保存返回地址[^1]。 #### 特殊用途寄存器 - **PSTATE (Processor State)**:处理器状态寄存器,包含条件标志(如N, Z, C, V)、中断屏蔽位以及当前异常级别等信息。 - **ELR_ELx (Exception Link Register)**:当发生异常时,这个寄存器会保存异常返回地址。 - **SCTLR_ELx (System Control Register)**:系统控制寄存器,用于配置内存管理单元(MMU)、缓存其他系统级特性。 - **TCR_ELx (Translation Control Register)**:翻译控制寄存器,用于配置虚拟地址到物理地址的转换过程。 - **MAIR_ELx (Memory Attribute Indirection Register)**:内存属性间接寄存器,定义了不同内存区域的访问权限缓存策略。 - **TTBR0_ELx TTBR1_ELx (Translation Table Base Registers)**:这两个寄存器分别指向两个不同的页表基址,用于实现虚拟地址空间的映射。 - **AFSR0_ELx, AFSR1_ELx (Auxiliary Fault Status Registers)**:辅助故障状态寄存器,记录更详细的页表访问错误信息。 - **ESR_ELx (Exception Syndrome Register)**:异常综合寄存器,提供关于最近一次异常的具体原因的信息。 - **FAR_ELx (Fault Address Register)**:如果发生了与内存访问相关的异常,这个寄存器将保存导致异常的地址。 - **Context ID Registers (e.g., CONTEXTIDR_EL1)**:上下文标识符寄存器,用于标记每个进程的唯一标识符,便于调试性能监控。 ### AArch32执行状态 尽管ARMv8引入了新的64位架构,但它仍然兼容传统的32位ARM指令集。在这种模式下,寄存器布局类似于早期的ARM版本,但有一些扩展改进。 #### 通用寄存器 - **R0-R15**:16个32位通用寄存器,其中R13通常用作堆栈指针(SP),R14为链接寄存器(LR),R15为程序计数器(PC)。 - **R8-R12**:可用于通用目的,但在某些情况下可能有特殊用途。 - **R13 (SP)**:堆栈指针。 - **R14 (LR)**:链接寄存器,保存子程序返回地址。 - **R15 (PC)**:程序计数器。 #### 状态寄存器 - **CPSR (Current Program Status Register)**:当前程序状态寄存器,包含了条件标志、模式位、中断禁用位等。 - **SPSR (Saved Program Status Register)**:保存的程序状态寄存器,在异常处理期间用来保存CPSR的状态。 ### 使用场景 ARMv8寄存器设计旨在支持高效的操作系统内核开发、多任务处理以及高级语言编译优化。例如,通过使用多个堆栈指针支持多种异常级别,ARMv8能够有效地隔离用户空间内核空间的操作,从而提高系统的安全性稳定性。此外,对于嵌入式系统来说,灵活的内存管理强大的中断处理能力使得ARMv8成为了一个非常受欢迎的选择。 ```assembly ; 示例:简单的AArch64汇编代码片段,展示如何使用寄存器 MOV X0, #0x123456789ABCDEF0 ; 将立即数加载到X0寄存器 ADD X1, X0, X0 ; 将X0的内容加到自身,并结果存入X1 B . ; 无限循环 ``` 上述示例展示了基本的寄存器操作,包括移动加法指令。实际应用中,开发者需要根据具体需求选择合适的寄存器并正确设置相关配置寄存器来启用所需的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arm精选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值