目录

ARMv8寄存器的介绍

ARMv8寄存器的介绍

寄存器是CPU的内部组成单元,是CPU运算时取指令和数据最快的地方。它可以用来暂存指令、数据和地址。在CPU的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。CPU的算术逻辑部件中,包含的寄存器有累加器(ACC),具体的有:

  • 高速访问:寄存器是CPU内部最快的存储单元,比主存(RAM)和缓存(Cache)访问速度更快,通常在一个时钟周期内完成读写操作。
  • 减少等待时间:频繁使用寄存器进行数据存储和操作,减少了对主存的访问,避免了长时间的等待,从而提高了处理速度。
  • 简化指令执行:寄存器直接存储操作数和计算结果,使指令执行更简便,不需要频繁从内存读取数据,简化了指令的执行流程。
  • 并行处理:寄存器支持多条指令的并行执行,通过
  • 避免数据相关性问题,提高指令级并行性和处理器的整体吞吐量。
  • 减少总线冲突:使用寄存器操作数据可以减少总线访问频率,降低总线冲突,提高系统的整体性能和响应速度。

寄存器结构

每个寄存器由多个触发器组成,输入数据通过写使能信号控制是否写入新值。读出数据通过读口送出。当写使能(Write Enable)为0时,时钟边沿到来时输出不变;当写使能信号为1时,时钟边沿到来时输出开始变为输入。若每个时钟边沿都写入,则不需要Write Enable信号。

寄存器组结构

寄存器组由多个寄存器组成,每个寄存器都可以通过编号来定位。N位编号可以表示2的N次方个寄存器,而M个寄存器的位数则是log M的上取整。

ARMv8中有34个寄存器,包括31个64 位通用寄存器、1个64 位的程序计数(Program Counter, PC)指针寄存器、栈指针(StackPointer, SP)寄存器以及异常链接寄存器(Exception Link Register, ELR),一个处理器状态寄存器PSTATE来表示当前的处理器状态(processor state),

https://i-blog.csdnimg.cn/direct/a264cb077c7c450483800f6f721dea62.png

1、通用寄存器

AArch64执行状态支持31个64位的通用寄存器,分别是X0-X30寄存器,而AArch32状态支持16个32位的通用寄存器。除用于数据运算和存储之外,通用寄存器还可以在函数调用过程中起到特殊作用,ARM64体系结构的函数调用标准和规范对此有所约定,如下图所示。

https://i-blog.csdnimg.cn/direct/5e04fe07c84545ed9bb2a62bf1211af0.png

  • X0-X7 用于参数传递
  • X9-X15 在子函数中使用这些寄存器时,直接使用即可, 无需save/restore. 在汇编代码中x9-x15出现的频率极低 在子函数中使用这些寄存器时,直接使用即可, 无需save/restore. 在汇编代码中x9-x15出现的频率极低
  • X19-X29 在callee子函数中使用这些寄存器时,需要先save这些寄存器,在退出子函数时再resotre 在callee子函数中使用这些寄存器时,需要先save这些寄存器,在退出子函数时再resotre
  • X8, X16-X18, X29, X30 这些都是特殊用途的寄存器 – X8: 用于返回结果 – X16、X17 :进程内临时寄存器 – X18 :resrved for ABI – X29 :FP(frame pointer register) – X30 :LR

在 AArch64 状态下,使用 X(如 X0、 X30 等)表示 64 位通用寄存器。另外,还可以使用

W 来表示低 32 位的数据,如 W0 表示 X0 寄存器的低 32 位数据, W1 表示 X1 寄存器的低 32

位数据,

https://i-blog.csdnimg.cn/direct/eb7c7b81ed4449c8a4daab2c34d4f45d.png

2、PSTATE寄存器

AArch64 体系结构使用 PSTATE 寄存器来表示当前处理器状态(processor state),PSTATE的主要字段

  • N(Negative) :负数标志位,结果为负数时置1。
  • Z(Zero) :零标志位,结果为零时置1。
  • C(Carry) :进位标志位,算术运算发生进位时置1。
  • V(Overflow) :溢出标志位,算术运算发生溢出时置1。
  • EL(Exception Level) :异常级别,指示当前的异常处理级别。
  • SP(Stack Pointer Select) :栈指针选择,指示当前使用的栈指针(SP_EL0或SP_ELx)。

3、特殊寄存器

ARMv8架构中还有一些专用寄存器,用于特定功能和操作。主要的专用寄存器包括:

  1. SP_ELx(Stack Pointer Registers for Exception Levels) :每个异常级别都有独立的栈指针寄存器(SP_EL0, SP_EL1, SP_EL2, SP_EL3)。
  2. ELR_ELx(Exception Link Registers for Exception Levels) :每个异常级别都有独立的异常链接寄存器(ELR_EL1, ELR_EL2, ELR_EL3),用于存储异常返回地址。
  3. SPSR_ELx(Saved Program Status Registers for Exception Levels) :每个异常级别都有独立的保存程序状态寄存器(SPSR_EL1, SPSR_EL2, SPSR_EL3),用于保存异常发生时的PSTATE值。

https://i-blog.csdnimg.cn/direct/d9fead56fc9149419258d07d775666ca.png

4、系统寄存器

系统寄存器用于控制和管理CPU的操作模式、特权级别、内存管理、中断处理等关键系统功能。主要的系统寄存器包括:

  1. SCTLR_ELx(System Control Register) :系统控制寄存器,用于控制和配置处理器的系统级特性,如内存保护、缓存策略等。
  2. TTBR0_ELx(Translation Table Base Register) :转换表基地址寄存器,用于定义页表的基地址,支持内存地址转换和虚拟内存管理。
  3. MAIR_ELx(Memory Attribute Indirection Register) :内存属性指示寄存器,用于定义不同内存区域的属性,如缓存策略、访问权限等。
  4. TCR_ELx(Translation Control Register) :转换控制寄存器,用于控制地址转换的行为和特性,如地址范围、页大小等。
  5. ESR_ELx(Exception Syndrome Register) :异常综合症寄存器,用于存储异常发生时的状态信息,帮助调试和错误处理。

程序可以通过 MSR 和 MRS 指令访问系统寄存器。

mrs X0, TTBR0_EL1 //把 TTBR0_EL1 的值复制到 X0 寄存器
msr TTBR0_EL1, X0 //把 X0 寄存器的值复制到 TTBR0_EL1

参考: