ARMv8寄存器的介绍
一、寄存器的作用
寄存器是CPU的内部组成单元,是CPU运算时取指令和数据最快的地方。它可以用来暂存指令、数据和地址。在CPU的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。CPU的算术逻辑部件中,包含的寄存器有累加器(ACC),具体的有:
- 高速访问:寄存器是CPU内部最快的存储单元,比主存(RAM)和缓存(Cache)访问速度更快,通常在一个时钟周期内完成读写操作。
- 减少等待时间:频繁使用寄存器进行数据存储和操作,减少了对主存的访问,避免了长时间的等待,从而提高了处理速度。
- 简化指令执行:寄存器直接存储操作数和计算结果,使指令执行更简便,不需要频繁从内存读取数据,简化了指令的执行流程。
- 并行处理:寄存器支持多条指令的并行执行,通过寄存器重命名技术
- 避免数据相关性问题,提高指令级并行性和处理器的整体吞吐量。
- 减少总线冲突:使用寄存器操作数据可以减少总线访问频率,降低总线冲突,提高系统的整体性能和响应速度。
二、寄存器(Register)与寄存器组结构
寄存器结构
每个寄存器由多个触发器组成,输入数据通过写使能信号控制是否写入新值。读出数据通过读口送出。当写使能(Write Enable)为0时,时钟边沿到来时输出不变;当写使能信号为1时,时钟边沿到来时输出开始变为输入。若每个时钟边沿都写入,则不需要Write Enable信号。
寄存器组结构
寄存器组由多个寄存器组成,每个寄存器都可以通过编号来定位。N位编号可以表示2的N次方个寄存器,而M个寄存器的位数则是log M的上取整。
三、ARMv8寄存器介绍
ARMv8中有34个寄存器,包括31个64 位通用寄存器、1个64 位的程序计数(Program Counter, PC)指针寄存器、栈指针(StackPointer, SP)寄存器以及异常链接寄存器(Exception Link Register, ELR),一个处理器状态寄存器PSTATE来表示当前的处理器状态(processor state),
1、通用寄存器
AArch64执行状态支持31个64位的通用寄存器,分别是X0-X30寄存器,而AArch32状态支持16个32位的通用寄存器。除用于数据运算和存储之外,通用寄存器还可以在函数调用过程中起到特殊作用,ARM64体系结构的函数调用标准和规范对此有所约定,如下图所示。
- 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
位数据,
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架构中还有一些专用寄存器,用于特定功能和操作。主要的专用寄存器包括:
- SP_ELx(Stack Pointer Registers for Exception Levels):每个异常级别都有独立的栈指针寄存器(SP_EL0, SP_EL1, SP_EL2, SP_EL3)。
- ELR_ELx(Exception Link Registers for Exception Levels):每个异常级别都有独立的异常链接寄存器(ELR_EL1, ELR_EL2, ELR_EL3),用于存储异常返回地址。
- SPSR_ELx(Saved Program Status Registers for Exception Levels):每个异常级别都有独立的保存程序状态寄存器(SPSR_EL1, SPSR_EL2, SPSR_EL3),用于保存异常发生时的PSTATE值。
4、系统寄存器
系统寄存器用于控制和管理CPU的操作模式、特权级别、内存管理、中断处理等关键系统功能。主要的系统寄存器包括:
- SCTLR_ELx(System Control Register):系统控制寄存器,用于控制和配置处理器的系统级特性,如内存保护、缓存策略等。
- TTBR0_ELx(Translation Table Base Register):转换表基地址寄存器,用于定义页表的基地址,支持内存地址转换和虚拟内存管理。
- MAIR_ELx(Memory Attribute Indirection Register):内存属性指示寄存器,用于定义不同内存区域的属性,如缓存策略、访问权限等。
- TCR_ELx(Translation Control Register):转换控制寄存器,用于控制地址转换的行为和特性,如地址范围、页大小等。
- ESR_ELx(Exception Syndrome Register):异常综合症寄存器,用于存储异常发生时的状态信息,帮助调试和错误处理。
程序可以通过 MSR 和 MRS 指令访问系统寄存器。
mrs X0, TTBR0_EL1 //把 TTBR0_EL1 的值复制到 X0 寄存器
msr TTBR0_EL1, X0 //把 X0 寄存器的值复制到 TTBR0_EL1
参考:
https://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt_4088083317822557806&sourceFrom=search_a
https://zhuanlan.zhihu.com/p/711014643
ARMv8寄存器详解-CSDN博客