You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,恢复之前的内存访问。

内容的提问来源于stack exchange,提问作者si yan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:01:29