ARM v8

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

ARM v8_第1张图片

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也是如此。
ARM v8_第2张图片
执行态的切换必须要进入更高的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)
ARM v8_第3张图片

你可能感兴趣的:(ARM)