分析代码
/* LORegions */
mrs x1, id_aa64mmfr1_el1
ubfx x0, x1, #ID_AA64MMFR1_LOR_SHIFT, 4
cbz x0, 1f
msr_s SYS_LORC_EL1, xzr
1:
/* Stage-2 translation */
msr vttbr_el2, xzr
ID_AA64MMFR1_EL1
第2行代码,涉及到arm64 ID_AA64MMFR1_EL1, AArch64 Memory Model Feature Register 1寄存器,参考arm64芯片手册,该寄存器的含义如下:
Provides information about the implemented memory model and memory management support in AArch64 state.
该寄存器提供了EL1异常等级下内存管理的支持
第3行代码,涉及到的 ID_AA64MMFR1_LOR_SHIFT 宏定义如下:
#define ID_AA64MMFR1_LOR_SHIFT 16
对应的寄存器位域LO bits [19:16]的含义如下:
From ARMv8.1:
LORegions. Indicates support for LORegions. Defined values are:
0b'0000 LORegions not supported.
0b'0001 LORegions supported.
LORegions
关于LORegions,arm64芯片手册给出了解释:
ARMv8.1 introduces limited ordering regions (LORegions), which allow large systems to perform special load-acquire and store-release instructions that provide order between the memory accesses to a region of the PA map as observed by a set of observers.
意思就是:ARMv8.1引入了有限排序区域(LORegions),允许大型系统执行特殊的加载获取和存储释放指令,以便在一组观察者观察到的物理地址(PA)映射区域中的内存访问之间提供排序。
感觉还是很抽象,想要理解必须详细阅读arm64芯片手册该章节相关的部分。
第4行代码,判断x0寄存器是否为0,如果为0则跳转到第6行
第5行代码,涉及到寄存器 LORC_EL1, LORegion Control (EL1),参考arm64芯片手册,该寄存器的含义如下:
Enables and disables LORegions, and selects the current LORegion descriptor.
该寄存器可以在EL1异常等级下,使能或者禁止LORegions,选择当前的LORegions描述符。
通过查看寄存器位域的的描述,该寄存器最多支持256个描述符。
如果支持LORegions的话,我们将寄存器 LORC_EL1 的值清零,为什么清零不清楚,可能是创造一个干净的环境进行后续初始化吧,等到系统初始化到一定阶段后,用户可以根据差异化的需求重新配置。
VTTBR_EL2
第8行代码是一行注释,意思是二级转换,感觉像是页表转换。
第9行代码涉及到寄存器 VTTBR_EL2, Virtualization Translation Table Base Register,参考arm64芯片手册,该寄存器的含义如下:
Holds the base address of the translation table for the initial lookup for stage 2 of an address translation in the EL1&0 translation regime, and other information for this translation regime.
VTTBR_EL2是虚拟化翻译表基址寄存器,它用于存放虚拟机(VM)在Stage-2地址转换过程中使用的页表的基地址。
在ARMv8-A架构中,虚拟化通常涉及两个阶段的地址转换:Stage-1转换由操作系统控制,而Stage-2转换则由hypervisor控制。
VTTBR_EL2寄存器就是用于在Stage-2转换中指向虚拟机页表的基地址。
该行代码的作用是将该寄存器清零。