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

核心问题

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

附件:查表与故障轨迹和两阶段模型源码。

范围与证据等级

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

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

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

映射案例把 GVA 0x1020 先译为 GPA 0x8020,再译为 SPA 0x18020。题设中 VS-stage 缺页委托给 guest,不产生 VM exit;VS 写权限失败设为不委托,会退出;G-stage 缺页和执行权限失败都进入宿主侧处理并标记 VM exit。

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

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

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

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

验收结果

本批实际运行按页偏移的 VS/G 两阶段查表,覆盖映射到 0x18020、VS 缺页、VS 写权限拒绝、G 缺页和 G 执行权限拒绝五种情况。题设中 VS 故障是否退出取决于委托输入,G 故障进入宿主;断言不成立则命令非零退出。输出保留 hardware_compliance=false,没有硬件虚拟化测量。

模式速查

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

一手参考资料