计算机体系结构 E03:硬件虚拟化与嵌套翻译

核心问题

虚拟机里的虚拟地址怎样到达宿主物理内存?两阶段翻译先把 guest virtual address 转为 guest physical address,再由 G-stage 转为 supervisor physical address。任一阶段失败都应保留故障来源,TLB miss 本身则不等于 VM exit。

附件:E03-virtualization.json。

范围与证据等级

证据等级为功能执行。模型只用两个字典表示 VS-stage 与 G-stage 映射,不实现 Sv39x4 页表布局、真实 CSR、page walk、TLB、trap entry 或 shootdown。因此它不是 RISC-V H 扩展合规测试。

规范中的两阶段翻译还要求 VS 页表遍历访问本身经过 G-stage。当前模型只保留“两个阶段都必须成功”以及故障归属,不模拟遍历产生的全部内存访问。

核心案例:同一个缺页词不能抹平两个阶段

映射案例把 GVA 0x1000 先译为 GPA 0x8000,再译为 SPA 0x18000。VS-stage 缺页或权限失败在本题设中委托给 guest,不产生 VM exit;G-stage guest-page fault 则进入宿主侧处理并标记 VM exit。

这里的委托策略是模型输入,不是“所有 VS fault 都不退出”的架构定律。真实实现要结合 delegation CSR、当前特权状态和异常类型判断。

模式:每层翻译保留自己的输入与故障

1
GVA --VS-stage--> GPA --G-stage--> SPA

嵌套页表、IOMMU 二次翻译和容器地址映射分析都能复用这一做法。把中间地址抹掉后,故障归因与权限边界会一起丢失。

验收结果

本批脚本退出 0,覆盖成功映射、VS-stage fault 和 G-stage guest-page fault 三种情况。输出显式保留 hardware_compliance=false,没有硬件虚拟化测量。

模式速查

事件 首先检查 不能直接等同
TLB miss 缓存的翻译缺失 VM exit
VS-stage fault guest 映射与权限 G-stage fault
G-stage fault GPA 到 SPA 的映射 普通 guest 缺页

一手参考资料