AArch64两级页表翻译:异常等级变化及完整流程细节咨询
AArch64两级页表翻译中的异常等级切换与完整流程解析
先澄清核心误区:两级翻译无需软件主动切换异常等级
你提到的Stage-1(客户OS侧)和Stage-2(VMM侧)页表翻译,全程由MMU硬件自动完成,不需要客户OS(EL1)主动触发异常切换到EL2。EL2的VMM只负责提前配置好Stage-2的页表和相关寄存器,翻译过程完全在硬件流水线中后台执行,CPU始终保持在EL1上下文,只有当翻译出错时才会触发异常进入EL2。
两级页表翻译完整流程(含寄存器、指令与异常细节)
1. 前置配置:EL2 VMM完成初始化
VMM在启动客户VM前,会完成以下关键配置:
- 虚拟化控制寄存器:执行
MSR HCR_EL2, x0(x0中包含配置值),设置VM=1开启Stage-2翻译,RW=0指定客户EL1为AArch64模式,同时配置其他虚拟化相关控制位(比如允许客户OS访问部分系统寄存器)。 - Stage-2页表基地址:将Stage-2页表的物理基地址 + VM的ASID(地址空间标识符,隔离不同VM)写入
VTTBR_EL2,指令为MSR VTTBR_EL2, x0。 - Stage-2翻译规则:通过
VTCR_EL2配置页表粒度(4KB/16KB/64KB)、地址映射范围、缓存策略等,指令为MSR VTCR_EL2, x0。 - 客户EL1页表环境:VMM会为客户OS设置EL1的页表参数:
- 写入
TTBR0_EL1/TTBR1_EL1:分别对应客户EL0/EL1的低地址、高地址空间的Stage-1页表基地址。 - 配置
TCR_EL1:定义Stage-1的页表规则,比如4KB粒度下的地址拆分方式。 - 开启EL1的MMU:执行
MSR SCTLR_EL1, #(SCTLR_EL1_M | SCTLR_EL1_A | SCTLR_EL1_C),其中M位开启MMU,A开启对齐检查,C开启数据缓存。
- 写入
2. EL1上下文下的两级翻译流程(硬件自动执行)
当客户OS(EL1)或其应用(EL0)发起虚拟地址(VA)访问时,硬件按以下步骤自动完成翻译:
Stage-1翻译(基于EL1寄存器)
- 硬件根据
TCR_EL1的配置,将VA拆分为对应Stage-1页表的索引(比如4KB粒度下,VA拆分为Level 1索引、Level 2索引、页内偏移)。 - 用
TTBR0_EL1(低地址访问)或TTBR1_EL1(高地址访问)的基地址,加上索引找到Stage-1页表项(PTE)。 - 检查PTE的权限位:如果当前访问权限不匹配(比如EL1写一个只读页),触发Data Abort同步异常,CPU自动切换到EL2。
- 翻译成功后,得到中间物理地址(IPA)。
Stage-2翻译(基于EL2寄存器,无等级切换)
- 硬件拿到IPA后,自动读取
VTTBR_EL2中的Stage-2页表基地址,结合VTCR_EL2的配置拆分IPA为Stage-2的页表索引。 - 查找Stage-2的PTE,检查VMM设置的权限(比如该VM是否被允许访问这个IPA对应的物理页),如果权限不足或页表项不存在,触发Virtualization Data Abort异常,进入EL2处理。
- 翻译成功后,得到最终物理地址(PA),硬件直接发起对PA的内存访问,全程CPU保持在EL1。
3. 异常场景下的等级切换(仅翻译出错时触发)
只有当Stage-1或Stage-2翻译出现错误时,才会触发异常切换到EL2:
- 硬件自动保存EL1的上下文:将出错时的指令地址写入
ELR_EL2,将EL1的状态寄存器(SPSR_EL1)保存到SPSR_EL2。 - VMM在EL2通过
ESR_EL2(异常 syndrome 寄存器)判断异常原因:- 如果是Stage-1缺页:VMM会配置
HCR_EL2的VW位,将异常注入回EL1,执行ERET指令返回,让客户OS自己处理缺页。 - 如果是Stage-2缺页:VMM负责分配物理页、更新Stage-2页表,然后执行
ERET返回EL1,恢复之前的内存访问。
- 如果是Stage-1缺页:VMM会配置
内容的提问来源于stack exchange,提问作者si yan
相关产品推荐
相关产品推荐

