1.概要
在AArch64中,系统配置通过系统寄存器进行控制,并使用MSR和MRS指令进行访问。ARM架构的之前版本(如ARMv7)使用协处理器来进行系统配置。 但是,AArch64不支持协处理器。
AArch64中系统寄存器会以"_ELn"的方式名命,寄存器的名称会告诉你可以访问它的最低异常级别。
<Reg>_EL1:处理器处于EL1、EL2、EL3时可以访问。
<Reg>_EL2:处理器处于EL2、EL3时可以访问。
大部分寄存器不支持处于EL0时访问,但也有一些例外,如CTR_EL0。
例如
TTBR0_EL1可以从EL1、EL2和EL3访问。
TTBR0_EL2可以从EL2和EL3访问。
可以采用以下形式来访问系统寄存器:
MRS x0, TTBR0_EL1 // 把 TTBR0_EL1 的值保存到x0
MSR TTBR0_EL1, x0 // 把x0 的值写入TTBR0_EL1寄存器
下表显示了异常级别,这些异常级别具有每个寄存器的单独副本。 例如,单独的辅助控制寄存器(ACTLR)以ACTLR_EL1,ACTLR_EL2和ACTLR_EL3的形式存在。
名称 | 寄存器 | 说明 | n的允许值 |
---|---|---|---|
ACTLR_ELn | 辅助控制寄存器 | 控制处理器特定的功能。 | 1,2,3 |
CCSIDR_ELn | 当前缓存大小ID寄存器 | 提供有关当前所选缓存的体系结构的信息。 | 1 |
CLIDR_ELn | 缓存级别ID寄存器 | 在每个级别上实现的单个或多个高速缓存的类型 缓存层次结构的一致性级别和统一级别。 | 1,2,3 |
CNTFRQ_ELn | 计数器频率寄存器 | 报告系统计时器的频率。 | 0 |
CNTPCT_ELn | 计数器物理计数寄存器 | 保持64位的当前计数值。 | 0 |
CNTKCTL_ELn | 计数器内核控制寄存器 | 控制从虚拟计数器生成事件流。还控制从EL0访问物理计数器,虚拟计数器,EL1物理计时器和虚拟计时器。 | 1 |
NTP_CVAL_ELn | 计数器物理计时器比较值寄存器 | 保存EL1物理计时器的比较值。 | 0 |
CPACR_ELn | 协处理器访问控制寄存器 | 控制对跟踪,浮点和SIMD功能的访问。 | 1 |
CSSELR_ELn | 缓存大小选择寄存器 | 通过指定所需的缓存级别和缓存类型(指令或数据缓存),选择当前的缓存大小ID寄存器CCSIDR_EL1。 | 1 |
CNTP_CTL_ELn | 计数器物理控制寄存器 | 控制EL1物理计时器的寄存器。 | 0 |
CTR_ELn | 缓存类型寄存器 | 有关集成缓存体系结构的信息。 | 0 |
DCZID_ELn | 数据缓存零ID寄存器 | 指示数据缓存零根据虚拟地址(DCZVA)系统指令写入字节值为0的块大小。 | 0 |
ELR_ELn | 异常链接寄存器 | 保存导致异常的指令的地址。 | 1,2,3 |
ESR_ELn | 异常综合特征寄存器 | 包括有关异常原因的信息。 | 1,2,3 |
FAR_ELn | 故障地址寄存器 | 保存虚拟错误地址。 | 1,2,3 |
FPCR | 浮点控制寄存器 | 控制浮点扩展行为。该寄存器中的字段映射到AArch32 FPSCR中的等效字段。 | . |
FPSR | 浮点状态寄存器 | 提供浮点系统状态信息。该寄存器中的字段映射到AArch32 FPSCR中的等效字段。 | . |
HCR_ELn | Hypervisor 配置寄存器 | 控制虚拟化设置,并将异常情况捕获到EL2。 | 2 |
MAIR_ELn | 存储器属性间接寄存器 | 在ELn的阶段1翻译的Long-descriptor格式转换表项中,提供对应于可能值的存储器属性编码。 | 1,2,3 |
MIDR_ELn | 主ID寄存器 | 代码运行的处理器类型(部件号和版本)。 | 1 |
MPIDR_ELn | 多处理器密切关系的寄存器 | 处理器和群集ID,在多核或群集系统中。 | 1 |
RVBAR_ELn | 基于地址寄存器的重置向量 | 保存重置向量的基地址,以便发送给ELn的任何异常。 | 1,2,3 |
SCR_ELn | 安全配置寄存器 | 控制安全状态和EL3的异常情况。 | 3 |
SCTLR_ELn | 系统控制寄存器 | 控制架构功能,例如MMU,缓存和对齐检查。 | 0,1,2,3 |
SPSR_ELn | 保存的程序状态寄存器 | 当发生异常时,保持已保存的处理器状态。 | abt,fiq,irq,und,1,2,3 |
TCR_ELn | 转换控制寄存器 | 确定哪个转换表基地寄存器定义了转换表行走(translation table walk)的基地址,该基地址是ELn中,内存访问阶段1转换所需要的。 还控制转换表格式并保存可缓存和可共享的信息。 | 1,2,3 |
TPIDR_ELn | 用户读/写线程ID寄存器 | 为了操作系统管理的目的,提供一个在ELn上执行的软件可以存储线程标识信息的位置。 | 0,1,2,3 |
TPIDRRO_ELn | 用户只读线程ID寄存器 | 提供在EL1或更高版本上执行的软件可以存储线程标识信息的位置。为了操作系统管理的目的,在EL0上执行的软件可以看到这些信息。 | 0 |
TTBR0_ELn | 转换表基址寄存器0 | 保存转换表0的基地址,以及它占用的内存的信息。这是ELn内,内存访问阶段1转换的转换表之一。 | 1,2,3 |
TTBR1_ELn | 转换表基址寄存器1 | 保存转换表1的基地址,以及它占据的存储器的信息。 这是在EL0和EL1内,内存访问阶段1转换的转换表之一 | 1 |
VBAR_ELn | 基于向量的地址寄存器 | 保存异常基地址,以便发送到ELn的任何异常。 | 1,2,3 |
VTCR_ELn | 虚拟化转换控制寄存器 | 控制来自非安全EL0和EL1的内存访问阶段2转换所需的转换表步行。还保存访问的可缓存和可共享信息。 | 2 |
VTTBR_ELn | 虚拟化转换表基址寄存器 | 保存来自非安全EL0和EL1的内存访问阶段2转换的转换表的基地址。 | 2 |