1、通用寄存器
AArch64运行环境提供了31个64bit的通用寄存器:X0~X31,同时他们也都有32bit的形式:W0~W31,他们对应映射到64bit寄存器的低32位。
读取W寄存器,将会只读X的低32位;
写W寄存器,将会将X的高32位写为0。也就是说设置W0为0xFFFFFFFF,结果设置X0为0x00000000FFFFFFFF。
2、AArch64特殊寄存器
除了31个核心寄存器外,还有一些特殊寄存器。
在AArch64运行状态,异常返回的状态,保存在每个异常等级的ELR和SPSR寄存器 (EL0不用异常返回,所以这个异常等级没有ELR和SPSR寄存器)。
2.1 XZR/WZR寄存器(零寄存器)
读的时候返回0,写的时候忽略写的值。
2.2 SP寄存器(堆栈指针)
每个异常等级都有自己的SP寄存器(SP_EL0, SP_EL1, SP_EL2, SP_EL3)。但是,除了EL0以外,其它异常等级都有两个选择,或者用自己等级的SP_ELn,或者用EL0等级的SP_EL0;EL0就只能用SP_EL0了。
异常等级 | 选项 |
EL0 | EL0t |
EL1 | EL1t, EL1h |
EL2 | EL2t, EL2h |
EL3 | EL3t, EL3h |
t表明选择了SP_EL0寄存器,h表明选择了SP_ELn寄存器。
2.3 PC寄存器(程序计数)
ARMv7有个R15寄存器,就是PC(程序计数)寄存器,是可以作为通用寄存器使用的。
但是ARMv8这里不一样了,不能被当做有名字的寄存器来访问了。
2.4 ELR(异常连接)寄存器
保存异常返回的地址。
2.5 SPSR寄存器(保存的进程状态寄存器)
当异常发生时,处理器的状态就被保存在SPSR寄存器里,和ARMv7中的CPSR类似。SPSR保存了处理异常前的PSTATE,当异常返回前需要将PSTATE设回来。
3、处理器状态(PSTATE)
AArch64没有像ARMv7的CPSR寄存器,需要通过PSATE,其各个字段定义如下:
其中N、Z、C、V可以在EL0访问,其他字段在EL0是未定义状态,需要在EL1或者更高级访问或执行。
在AArch64运行状态,通过执行ERET指令从异常返回,从而导致SPSR_ELn被拷贝到了PSTATE。
4、系统寄存器(System Registers)
在AArch64运行状态,使用MSR和MRS指令,通过系统寄存器(System Registers)来进行系统的配置。而在ARMv7上,使用协处理器CP15。之前的ARM版本都使用协处理器进行系统配置,但是AArch64不支持协处理器。
寄存器的名字,指出了其能被访问的最低的异常等级。比如:
TTBR0_EL1可以在EL1、EL2、EL3访问;
TTBR0_EL2可以在EL2、EL3访问。
访问这些寄存器的汇编指令(M代表move,R代表寄存器,S代表系统寄存器):
名字 | 寄存器 | 描述 | n的值 |
ACTLR_EL
n
|
赋值控制寄存器 Auxiliary Control Register |
控制处理器特有的feature | 1,2,3 |
CCSIDR_EL
n
|
当前缓存大小ID寄存器
Current Cache Size ID Register
|
提供当前选中的缓存信息 | 1 |
CLIDR_EL
n
|
缓存等级ID寄存器
Cache Level ID Register
|
缓存的类型 | 1,2,3 |
CNTFRQ_EL
n
|
计数时钟频率寄存器
Counter-timer Frequency Register
|
系统时钟的频率 | 0 |
CNTPCT_EL
n
|
计数时钟的物理计数寄存器
Counter-timer Physical Count Register
|
64bit的时钟的物理计数 | 0 |
CNTKCTL_EL
n
|
计数时钟的内核控制寄存器
Counter-timer Kernel Control Register
|
控制从虚拟计数器产生的事件。
Also controls access from EL0 to the physical counter,
virtual counter, EL1 physical timers, and the virtual timer.
|
1 |
CNTP_CVAL_EL
n
|
Counter-timer Physical Timer Compare Value Register
|
Holds the compare value for the EL1 physical timer.
|
0 |
CPACR_EL
n
|
Coprocessor Access Control Register
|
Controls access to Trace, floating-point, and NEON
functionality
|
1 |
CSSELR_EL
n
|
Cache Size Selection Register
|
Selects the current Cache Size ID Register, CCSIDR_EL1, by
specifying the required
|