ARMv8 Registers
General Purpose Registers
ARMv8提供了31个64-bit的通用寄存器。分别是X0-X30。
每个64-bit的寄存器低32位又包含32-bit的兼容形式。称作W0-W30。
读取W不会影响相应X的高32位,写入W会清零相应X的高32位。
Special Registers
In the ARMv8 architecture, when executing in AArch64, the exception return state is held in the
following dedicated registers for each Exception level:
- Exception Link Register (ELR).
- Saved Processor State Register (SPSR).
There is a dedicated SP per Exception level, but it is not used to hold return state.
Zero register
这个寄存器读取值时返回0,写入值时值被忽略。
Stack pointer
可以看到在每个 Exception level 都有相应的SP寄存器。
进入某个异常级后可以选择当前级的SP_ELn 或者选择 SP_EL0作为堆栈指针。
Exception Link Register
保存异常发生的返回地址。
Saved Process Status Register
保存异常发生时的PSTATE值。类似于程序状态字。包含各种标志、进位、溢出等。
如前面图片所示,SPSR在各个异常级同样都有对应的SPSR_ELn。
System Registers
这些寄存器负责系统配置。且使用MSR, MRS指令进行控制。通常EL0是无法访问这些寄存器的。
The name of a register tells you the lowest Exception level that it can be accessed from.
For example:
- TTBR0_EL1 is accessible from EL1, EL2, and EL3.
- TTBR0_EL2 is accessible from EL2 and EL3.
MRS x0, TTBR0_EL1 // Move TTBR0_EL1 into x0
MSR TTBR0_EL1, x0 // Move x0 into TTBR0_EL1
Execution State
ARM v8为了兼容32位指令有两个执行态,分别是AArch32和AArch64。
具体的支持情况见下图:
可以看到64位的OS可以支持32位和64位的APP,32位的OS只能支持32的APP。道理很简单,如果64的APP运行在32位的OS上,syscall的参数将被OS截断。同理EL2的Hypervisor也是如此。
执行态的切换必须要进入更高的EL。例如,EL0当前运行在AArch32希望切换到AArch64,必须向OS请求来实现执行态的变更。这里没有提到EL3,如果EL3希望切换执行态该怎么办呢?由于EL3是最高的异常级了,所以自己没办法改变执行态,只能通过复位配置来解决。对于其他异常级而言,可以通过System Register来控制。
另外需要注意的是:If, when taking an exception or returning from an exception, the Exception level remains the same, the execution state cannot change.
Data Model
64-bit Linux使用LP64,ARM的A64指令集支持LP64和LLP64。Procedure Call Standard (PCS)