简短结论先给出来: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 缓存。