在AArch64中,通过系统寄存器控制着系统配置,使用MSR和MRS指令访问系统配置。这与ARMv7相对应,这些寄存器通常通过CP15操作进行访问。寄存器的名字告诉你它可以访问的最低异常级别。
比如:
(1)可从EL1,EL2,EL3来访问TTBR0_EL1
(2)可从EL2和EL3来访问TTBR0_EL2
带后缀_ELn的寄存器在一些或所有的异常级别上都有一个独立的寄存器,虽然通常不为EL0。很少的系统寄存器从EL0访问,虽然CACHE TYPE register CTR_EL0为一个可以访问的例子。
访问系统寄存器的代码以如下形式:
MRS x0, TTBR0_EL1
MSR TTBR0_EL1, x0
ARM架构的之前版本使用协处理器来进行系统配置。但是AArch64不包括对协处理器的支持。下表仅列出了本文档提到的系统寄存器。
本表显示了显示了具有分开的寄存器的异常级别。比如ACTLR存在ACTLR_EL1,ACTLR_EL2和ACTLR_EL3。
Name | Register | Description | value |
ACTLR_ELn | 备份的控制寄存器 | 控制处理器相关的特性 | 1,2,3 |
CCSIDR_ELn | 当前CACHE大小ID寄存器 | 提供当前选择CACHE架构的信息 | 1 |
CLIDR_ELn | CACHE级别ID寄存器 | 实现在每个级别或某个CACHE类型。CACHE分级的一致性和联合性的级别 | 1,2,3 |
CNTFRQ_ELn | 计数器定时器频率寄存器 | 报告系统定时器的频率 | 0 |
CNTPCT_ELn | 计数器定时器物理计数寄存器 | 64位当前计数值 | 0 |
CNTKCTL_ELn | 计数器定时器内核控制寄存器 | 控制着从虚拟计数器中产生event stream。也控制着从EL0到物理计数器、虚拟计数器,EL1物理定时器,虚拟定时器的访问 | 1 |
CNTP_CVAL_ELn | 计数器定时器物理定时器比较值 | EL1物理定时器的比较值 | 0 |
CPACR_ELn | 协处理器访问控制寄存器 | 控制着对trace,浮点,NEON功能的访问 | 1 |
CSSELR_ELn | CACHE大小选择寄存器 | 通过指明要求的CACHE级别和类型,或指令或数据CACHE,选择当前CACHE大小ID寄存器CCSIDR_EL1 | 1 |
CNTP_CTL_ELn | 寄存器定时器物理控制寄存器 | 控制着EL1物理定时器的寄存器 | 0 |
CTR_ELn | CACHE类型寄存器 | 架构中集成CACHE的信息情况 | 0 |
DCZID_ELn | 数据CACHE零ID寄存器 | 通过DCZVA系统指令写0值的块大小 | 0 |
ELR_ELn | 异常链接寄存器 | 产生异常的指令地址 | 1,2,3 |
ESR_ELn | 异常综合寄存器 | 包含着异常的原因的信息 | 1,2,3 |
FAR_ELn | 错误地址寄存器 | 虚拟错误地址 | 1,2,3 |
FPCR | 浮点控制寄存器 | 控制着浮点扩展的信息。这个寄存器的该域映射到AArch32 FPSCR对应的域中 | - |
HCR_ELn | hypervisor配置寄存器 | 控制着EL2的虚拟化的设置和异常陷入 | 2 |
MAIR_ELn | 内存属性间接寄存器 | 提供了ELn中stage1转换的长描述符格式转换表项的内存属性编码 | 1,2,3 |
MIDR_ELn | 主ID寄存器 | 运行的处理器类型 | 1 |
MPIDR_ELn | 多处理器亲和性寄存器 | 在多核或cluster系统中,处理器或cluster ID | 1 |
SCR_ELn | 安全配置寄存器 | 控制着EL3的安全状态和异常的陷入 | 3 |
SCTLR_ELn | 系统控制寄存器 | 控制着架构特性,比如MMU,CACHE和对齐检查 | 0,1,2,3 |
SPCR_ELn | 保存程序状态寄存器 | 当异常产生时保存处理器状态 | abt,fiq,irq,und,1,2,3 |
TCR_ELn | 转换控制寄存器 | 决定了哪个TTBR,它定义了从ELn的内存访问的stage1转换的转换表walk的基地址。也控制着转换表的格式和cacheability和shareability信息。 | 1,2,3 |
TPIDR_ELn | 用户读写线程ID寄存器 | 为了OS管理的目的,提供了软件执行在ELn可以存储线程ID信息的地址。 | 0,1,2,3 |
TPIDRRO_ELn | 用户只读线程ID寄存器 | 提供了软件执行在EL1或更高级别可以存储线程ID信息的位置。这个信息对软件执行在EL0上时可见的。 | 0 |
TTBR0_ELn | 转换表基地址寄存器0 | 转换表0的基地址,以及它所使用内存的信息。在ELn的stage1转换的内存访问的其中一个转换表。 | 1,2,3 |
TTBR1_ELn | 转换表及地址寄存器1 | 转换表1的基地址,以及它所使用内存的信息。在ELn的stage1转换的内存访问的其中一个转换表。 | 1 |
VBAR_ELn | 基于vector的地址寄存器 | 发生在ELn的异常的异常基地址 | 1,2,3 |
VTCR_ELn | 虚拟转换控制寄存器 | 控制着从非安全EL0和EL1的stage2内存访问转换的转换表walk。也保持着访问的cacheability和shareability信息。 | 2 |
VTTBR_ELn | 虚拟转换表基地址 | 从非安全EL0和EL1的stage2内存访问转换的转换表的基地址 | 2 |
系统控制寄存器SCTLR控制着标准内存,系统功能并提供core中实现的功能的状态信息。
在EL1及更高异常级别并不是所有的位都有效。这些位含义如下所示:
UCI 当设置时,使能在AArch64中DC CVAU/DC CVAC/IC IVAU指令的EL0访问。
EE 异常的大小端,0-小端,1-大端
EOE 在EL0上明确数据访问的大小端。0-小端,1-大端
WXN 写权限应用XN。0-not force to XN,1-force to XN
nTWE 不陷入到WFE。1表示WFE正常执行。
nTWI 不陷入到WFI。1表示WFI正常执行。
UCT 当设置时,在AArch64上使能EL0访问到CTR_EL0寄存器。
DZE 在EL0上访问DC ZVA指令。0-执行禁止,1-执行允许
I 指令CACHE使能。它是EL0和EL1的指令CACHE的使能位。访问到可缓存的正常内存的指令可以被缓存。
UMA 用户屏蔽访问。当EL0使用AArch64,控制从EL0的中断屏蔽访问。
SED 禁止SETEND。在EL0使用AArch32禁止SETEND指令。0-使能,1-禁止
ITD IT禁止。0 - IT指令有效,1 - IT指令被当作16位指令。仅另外16位指令或32位指令的头16位可以使用,这依赖于实现。
CP15BEN CP barrier使能。如果实现了,它是AArch32 CP15 DMB,DSB和ISB barrier操作的使能位。
SA0 EL0的栈对齐检查使能位
SA 栈对齐检查使能位
C 数据cache使能。EL0和EL1的数据访问使能位。对cacheable普通内存的数据访问都被缓存。
A 对齐检查使能位
M 使能MMU
对SCTLR的访问
为访问SCTLR_ELn,使能:
MRS ,SCTLR_ELn
MSR SCTLR_ELn,
比如:
NOTE: 处理器中的cache必须在在数据和指令的cache在各异常级别被使能之前被无效化。
这里有两种在内存中观察数据的基本方法,或小端LE或大端BE。在大端系统中,在内存中object的最高位存储在最低地址,接近于0的地址。在小端系统中,数据的最低位被保存在最低地址中。术语byte-ordering也可以用来代替大小端。
每个异常级别的数据的大小端都被单独控制。对EL3,EL2和EL1,SCTLR_ELn.EE设置大小端。EL1中其他位SCTLR_EL1.EOE控制EL0的数据大小端的设置。在AArch64执行状态中,数据访问可以位LE或BE,但指令的获取通常位LE。
是否处理器对LE和BE都支持依赖于处理器的实现。若仅支持小端,EE和EOE位都为0。类似的,若仅支持大端,EE和EOE位都是为1。
当使用AArch32时,CPSR.E位与相对应系统控制寄存器中EE位不同,该位在EL1,EL2和EL3被弃用。ARMv7中SETEND指令也被弃用。通过设置SCTLR.SED位可以在执行SETEND指令时造成未定义的异常。