RISC-V 虚拟化:虚拟机TLB处理

简短结论先给出来:RISC-V 虚拟化(带 Hypervisor Extension / RVH)通常不提供每个虚拟机独立的 TLB 硬件单元,而是多个虚拟机与 Host(HS-mode)共享同一套物理 TLB,通过 VMID(Virtual Machine Identifier)和 V 标志位对 TLB 条目做 Tag 来区分隔离。

下面展开说明:


🔧 RISC-V 虚拟化的 TLB 硬件现实

没有"每 VM 独立 TLB"

RISC-V 特权规范(Hypervisor Extension)不要求也不定义为每个 Guest VM 分配独立的 TLB 硬件处理单元。实际微架构(Rocket、CVA6、香山/Kunminghu 等)都是:

  • CPU 核内只有一套 I-TLB / D-TLB(可能还有 L2 TLB)

  • Guest(VS/VU-mode)和 Hypervisor(HS-mode)共用这组 TLB

TLB 条目用 VMID + V 位做区分

支持虚拟化的实现会在 TLB 表项中额外编码:

  • VMID(Virtual Machine ID) :取自 hgatp.VMID,区分不同虚拟机

  • V 位(Virtualization flag):标记该条目是来自 VS-stage 两阶段翻译(V=1)还是普通 S/U-mode(V=0,HS-mode 下 VMID 无效)

这样切换 VM 时只需改 hgatp(含新 VMID),不需要全量 flush TLB,不匹配 VMID 的旧条目自然被忽略。

两阶段地址转换(VS-stage + G-stage)

  • VS-stage (GVA→GPA):由 Guest OS 通过 vsatp控制,TLB 缓存最终合并后的 GVA→HPA 结果(或分别缓存两阶段,视微架构而定,有设计会增加专用 G-stage TLB / Walk Cache)

  • G-stage (GPA→HPA):由 Hypervisor 通过 hgatp控制,部分高性能实现会有单独的 G-Stage TLB(也叫 Stage-2 TLB) ​ 缓存 GPA→HPA,但这仍是同一核内共享的微架构资源,不是按 VM 分的独立 TLB

VM 切换时的 TLB 管理

  • Hypervisor 切 VM → 写 hgatp(换 VMID + 二级页表基址)

  • 若 VMID 复用或需主动失效 → 执行 HFENCE.VVMA(VS-stage 部分)或 HFENCE.GVMA(G-stage 部分)来选择性 invalidate

  • 低配实现可不支持 VMID Tagging(VMIDLEN=0),此时每次 VM 切换必须全 flush TLB,性能较差


🆚 对比 x86 / ARM

这和 ARM 的 VMID-tagged TLB、x86 的 VPID-tagged TLB 思路一致------都是共享 TLB + Tag 隔离,而非给每个 VM 配独立 TLB 硬件。


一句话总结 :RISC-V 虚拟化中虚拟机没有独立的 TLB 硬件单元 ,Guest 与 Host 共享物理 TLB,靠硬件支持的 VMID + V-bit Tagging ​ 实现多 VM 地址空间隔离,配合 HFENCE.{VVMA,GVMA}指令维护一致性。

具体 RISC-V 核(如香山、CVA6、rocket-chip)的微架构 TLB 组织。

这三款 RISC-V 开源核的 TLB 微架构差异较大,从简单嵌入式级(Rocket/CVA6)到高性能 OoO(香山)。下面按核逐一说明 TLB 层级、容量、两阶段翻译及 VMID 支持情况。


🔬 Rocket-Chip(Rocket Core)

定位:有序单发射,教学/嵌入式用,TLB 较简

  • 层级:仅 L1,分开 ITLB + DTLB,无统一 L2 TLB

    • ITLB:小全相联(通常 8~32 项,可配),支持 Superpage 独立项

    • DTLB:Sectored TLB,标准页用 sectored entries,大页用 fully-assoc superpage entries

  • 两阶段翻译(H-Ext 补丁)

    • 官方 Rocket 不带 VMID Tagging (可选特性被忽略),每次 VM switch 需全 TLB flush 或用 hfence.gvma全清

    • 部分研究分支给 TLB entry 加了 V-bit(区分 HS/VS 模式),但无 VMID 字段

    • PTW 可扩展 S2 PTE Cache 缓存 G-stage 非叶 PTE

  • 特点:最简实现,适合裸金属/简单 hypervisor,VM 切换代价高


🔬 CVA6 / Ariane(OpenHW Group CVA6)

定位:6 级流水有序核,支持 RVH 的研究用实现

  • L1 TLB:分离 ITLB + DTLB(典型各 16~32 项,可配,全相联)

    • 开启 UseSharedTlb时可配一个小型统一 Shared TLB(L1.5)供 I/D 共享
  • 虚拟化支持

    • L1 TLB entry 显式存储 VMID + ASID,支持 VMID-tagged TLB,VM switch 不必全 flush

    • 每个条目可存 VS-stage + G-stage 合并结果(最终 GVA→HPA),或分别缓存权限

    • PTW 中可选加入 **GTLB(G-Stage TLB)**​ 缓存 GPA→HPA 中间翻译,加速嵌套 walk

    • 完整支持 hfence.vvma/ hfence.gvma按 VMID/ASID/GPA 过滤失效

  • 特点:学术界常用虚拟化验证平台,TLB 支持较规范但容量小、无深层级


🔬 香山 --- 雁栖湖 / 南湖 / 昆明湖(XiangShan)

定位:高性能 OoO 核,TLB 最接近商用高端

  • 两级 TLB 结构

    • L1 ITLB:全相联,~32 项普通页 + 4 项大页(Superpage),前端阻塞式

    • L1 DTLB:混合结构(南湖为例---16 项全相联 + 64 项 DM 作 Victim Cache),非阻塞,多端口(Load/Store 各独立 DTLB,内容保持一致)

    • L2 TLB(Unified):大容量统一 TLB,由 I/D 共享,内含 Page Cache(缓存各级非叶+叶 PTE)、PTW / LLPTW(并行叶 walk)、Miss Queue、预取器

  • 两阶段翻译 & VMID

    • L1/L2 TLB entry 均带 VMID(HGATP.VMID)+ ASID + s2xlate 标记,支持 VMID-tagged 查找

    • L2 TLB 集成 **HPTW(Hypervisor PTW)**​ 专做 G-stage 翻译,有独立缓存加速 GPA→HPA

    • 支持 Sv39x4/Sv48x4,两阶段合并缓存最终 GVA→HPA,也保留中间 GPA 供异常报告

    • 完整支持 hfence.vvma/ hfence.gvma,可按 VMID/ASID/vaddr/gpa 部分 flush

  • 特点:TLB 组织与 ARM Cortex-A7x 系类似(L1 per-port + shared L2 + VMID tag + Stage-2 walk cache),是三者中唯一达到高性能服务器级 TLB 设计的开源核


📊 横向对比速览

特性 Rocket-Chip CVA6 (Ariane) 香山 (XiangShan)
L1 TLB 分 I/D,小全相联+sectored 分 I/D 全相联(≈16~32),可选 SharedTLB 分 I/D,全相联+DM混合,多端口 DTLB
L2 TLB ❌ 无 ✅ 可选小型 Shared TLB ✅ 大容量统一 L2 TLB + Page Cache
VMID Tag ❌(全 flush) ✅ VMID in entry ✅ VMID in L1+L2 entry
G-Stage TLB ❌(仅 S2 PTE cache in PTW) ✅ 可选 GTLB ✅ HPTW + L2 Page Cache 缓存 GPA→HPA
hfence.{vvma,gvma} ✅ 全清或忽略 VMID ✅ 按 VMID/ASID 过滤 ✅ 按 VMID/ASID/vaddr/gpa 过滤
定位 教学/嵌入式 研究/嵌入式应用 高性能 OoO 服务器级

小结 :三者都共用物理 TLB(无 per-VM 独立 TLB),区别在有没有 VMID tag + G-stage TLB 加速。Rocket 最简且缺 VMID tag;CVA6 学术规范但容量小;香山最接近商用,有两级 TLB + VMID + HPTW G-stage 缓存。

相关推荐
夏幻灵1 小时前
深度解析 JavaScript 异步编程:从回调地狱到 Promise 的重构
开发语言·javascript·重构
鱼子星_1 小时前
C++从零开始系列篇(二):C++入门——函数重载,引用,inline与nullptr
开发语言·c++·笔记
程序猿乐锅1 小时前
【 苍穹外卖day03 | 菜品管理 】
java·开发语言·数据库·mysql
派大鑫wink1 小时前
Java 高级编程技巧(生产级实用,覆盖性能、并发、设计、JVM、语法、避坑)
开发语言·python
JSON_L1 小时前
PHP实现大文件分片上传
开发语言·php
雾削木1 小时前
B语言经典教程现代化重构
java·前端·stm32·单片机·嵌入式硬件
凤山老林1 小时前
JDK 11 升级至 JDK 17
java·开发语言·jdk17·jdk升级·jdk11
指令集梦境1 小时前
图解:单调栈算法模板(Java语言)
java·开发语言·算法
IronMurphy2 小时前
多线程问!
java·jvm·spring