ARM64 VHE

张开发
2026/4/16 18:16:43 15 分钟阅读

分享文章

ARM64 VHE
VHEVirtualization Host Extensions是 ARMv8.1 硬件扩展核心是让 Host Linux 直接运行在 EL2消除 EL1↔EL2 切换开销大幅提升 KVM 性能。VHE 模式 让 Host OS 直接运行在 EL2但假装自己还在 EL1。Guest依然 EL1 EL0Host原来 EL1 → 现在EL2异常路由、寄存器、权限全部由硬件重新映射异常级别基础ARMv8 标准 4 级正常非虚拟化EL0用户态EL1内核态EL2Hypervisor虚拟化层EL3安全世界 / TrustZone传统 NVHENon-VHEKVM 模型Host LinuxEL1KVM HypervisorEL2GuestEL1 EL0问题每次 VM exit/entry 都要EL1 ↔ EL2 切换开销巨大。核心定位与启用条件全称Virtualization Host Extensions虚拟化主机扩展引入版本ARMv8.1-A启用标志HCR_EL2.E2H1EL2 HostHCR_EL2.TGE1Trap General Exceptions内核配置CONFIG_ARM64_VHEyCPU 支持/proc/cpuinfo中Features含vhNVHE vs VHE 异常级别与运行模型1. 传统 NVHENon-VHE模式ARMv8.0┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Guest EL0 │────▶│ Guest EL1 │────▶│ Host EL1 │ └─────────────┘ └─────────────┘ └─────────────┘ ▲ │ ▼ ┌─────────────┐ │ KVM EL2 │ └─────────────┘Host LinuxEL1KVM HypervisorEL2切换代价VM Exit/Entry 需EL1↔EL2 完整上下文切换开销大2. VHE 模式ARMv8.1┌─────────────┐ ┌─────────────┐ │ Guest EL0 │────▶│ Guest EL1 │ └─────────────┘ └─────────────┘ ▲ │ ▼ ┌─────────────────────┐ │ Host Linux KVM EL2 │ └─────────────────────┘Host Linux KVM同跑在 EL2GuestEL1/EL0不变切换代价无 EL1↔EL2 切换直接函数调用开销骤降Host 侧宿主机 LinuxHost EL0 → 仍然 EL0Host EL1 → 硬件重映射 → 实际运行在 EL2也就是说Host 内核代码以为自己在 EL1但硬件把它提升到 EL2 特权级Guest 侧虚拟机完全不变Guest EL0Guest EL1Guest 完全感知不到 VHE。最终级别布局VHE 模式┌───────────────┬───────────────┐ │ Host EL0 │ Guest EL0 │ ├───────────────┼───────────────┤ │ Host EL1* │ Guest EL1 │ │ (实际运行 EL2)│ │ └───────────────┴───────────────┘ ↑ │ EL2统一管理层*标记就是 VHE 的魔法。VHE 三大硬件支柱1. 寄存器重映射Register AliasingARM64 寄存器重映射是硬件 / 软件层面将逻辑寄存器名 / 访问目标重定向到不同物理寄存器 / 异常级别寄存器的机制核心场景包括VHE 系统寄存器重定向、AArch32/AArch64 状态映射、通用 / 浮点寄存器别名、虚拟化虚拟寄存器、微架构寄存器重命名。ARMv8.1 VHE 让 Host OS 直接运行在 EL2 且无需修改代码核心是EL1 寄存器访问被硬件重定向到 EL2 寄存器。控制位HCR_EL2.E2H1使能重定向TGE1强制 EL0/EL1 异常路由到 EL2。Host 内核代码原 EL1一行不改即可在 EL2 运行重映射规则E2H1 时软件访问TTBR0_EL1→ 硬件实际访问TTBR0_EL2软件访问TTBR1_EL1→ 硬件实际访问TTBR1_EL2软件访问SCTLR_EL1→ 硬件实际访问SCTLR_EL2软件访问VBAR_EL1→ 硬件实际访问VBAR_EL2反向访问Hypervisor 要读写真实 EL1 寄存器直接写TTBR0_EL2→ 实际写入TTBR0_EL1虚拟寄存器与捕获重映射Hypervisor 为 Guest 提供虚拟寄存器视图虚拟寄存器硬件支持VMIDR_EL2→ Guest 读MIDR_EL1时返回此值VMPIDR_EL2→ Guest 读MPIDR_EL1时返回此值无需异常捕获直接硬件重定向寄存器访问捕获软件模拟Guest 访问敏感系统寄存器如ID_AA64MMFR0_EL1触发 EL2 异常Hypervisor 在异常处理中返回虚拟值实现软件层面重映射2. EL2 内存模型增强ARMv8.0 EL2 仅 1 个TTBR0_EL2VHE 让 EL2 支持双基址TTBR0/TTBR1与 EL1 完全一致Host 在 EL2 可使用完整的用户 / 内核地址空间分离内存视图与原生 EL1 无差别3. 异常路由简化TGE1TGE1所有 EL0/EL1 异常直接陷入 EL2不经过 EL1Host 直接在 EL2 处理中断、缺页、系统调用减少跳转层级VHE 对两阶段地址翻译的影响1. 翻译链路不变核心逻辑一致VA →(TTBR0/1_EL1 · Stage1)→ IPA →(VTTBR_EL2 · Stage2)→ PAStage1Guest EL1 控制TTBR0/1_EL1VHE下仍指向 Guest 页表Stage2KVM EL2 控制VTTBR_EL2Host 直接读写无需切换2. 寄存器归属与访问变化寄存器NVHE 模式VHE 模式TTBR0/1_EL1Guest EL1 专属Guest EL1 专属硬件重映射仅对 Host 生效VTTBR_EL2KVM EL2 读写Host EL2 直接读写无 EL 切换Host 页表基址TTBR0/1_EL1EL1TTBR0/1_EL2EL2通过重映射访问3. TLB 与 VMID/ASIDVMIDStage2 TLB 标记VHE 下仍由VTTBR_EL2携带ASIDStage1 TLB 标记Guest 用TTBRx_EL1.ASIDHost 用TTBRx_EL2.ASIDTLB 刷新Host 可直接在 EL2 执行TLBI指令无需陷入VHE 模式下的世界切换World Switch1. VM Entry进入 GuestHost EL2 保存自身上下文EL2寄存器加载 Guest 上下文EL1寄存器TTBR0/1_EL1、SCTLR_EL1等设置HCR_EL2开启 Stage2 翻译VTTBR_EL2生效ERET到 Guest EL12. VM Exit退出 GuestGuest 异常 / 陷入直接到Host EL2无 EL1 中转保存 Guest 上下文恢复 Host EL2 上下文Host 直接处理如 Stage2 缺页、I/O 模拟再次ERET返回 Guest性能收益与关键优势消除 EL1↔EL2 切换开销上下文保存 / 恢复、TLB 刷新、特权检查大幅减少Host-KVM 直接调用无需HVC异常函数级调用延迟降低 50%异常处理更高效中断、缺页直接在 EL2 处理减少跳转代码兼容性Host 内核无需修改原生运行在 EL2总结VHE EL2 上的 EL1 兼容环境Host Linux 跑在 EL2用_EL1寄存器语法硬件重映射Guest 仍跑 EL1/EL0两阶段翻译逻辑不变核心收益零成本 EL2 运行 消除跨 EL 切换开销

更多文章