Skip to content

Hypervisor 抽象层:KVM / MSHV

概述

Hypervisor 抽象层的核心价值是“上层稳定、下层可替换”。

  • vmm 来说,只面向统一 trait(Hypervisor/Vm/Vcpu
  • 对平台差异来说,落在 kvm/mshv/ 两套实现里
  • 对功能演进来说,新增能力可以先扩展 trait,再逐步补齐各后端

这让 Cube Hypervisor 可以在不重写 VMM 主流程的前提下,复用同一套 VM 生命周期管理。

代码定位

目录/文件角色
hypervisor/src/lib.rstrait 定义、错误类型、通用接口
hypervisor/src/kvm/Linux KVM 后端实现
hypervisor/src/mshv/Windows MSHV 后端实现
vmm/src/vm.rs调用抽象层完成 VM 生命周期
vmm/src/cpu.rsvCPU 创建、启动、暂停、恢复

三层抽象:谁负责什么

Hypervisor:平台入口

职责:创建 VM、查询后端能力(API 版本、CPU 能力、MSR 列表等)。

典型方法:

  • create_vm():创建一个新的 VM 句柄
  • get_cpuid():获取 CPU 特性白名单/可见能力
  • get_msr_list():获取可访问 MSR 范围

Vm:虚机资源控制面

职责:管理 VM 级资源和控制器。

典型方法:

  • create_vcpu(id):创建对应 vCPU
  • set_user_memory_region(...):建立 GPA -> HVA 映射
  • create_irq_chip() / create_pit():构建中断与时钟基础设施
  • register_ioevent(...) / register_irqfd(...):把设备事件与中断打通

Vcpu:执行面

职责:维护 vCPU 执行上下文并进入运行循环。

典型方法:

  • set_regs(...) / set_sregs(...):设置寄存器上下文
  • set_cpuid2(...):限制 guest 可见 CPU 特性
  • run():进入 guest 执行,等待 VM Exit 事件

Vm::boot() 到后端 ioctl 的调用链

这里最关键的是:

  1. vmm 不关心 KVM/MSHV 细节
  2. 设备与中断通过统一接口注册
  3. VM Exit 分发仍在上层可控,便于统一审计和日志

能力探测与降级策略

实际工程里,不同宿主机能力并不完全一致。建议在初始化阶段做“能力探测 -> 配置裁剪”。

能力项探测来源常见降级策略
CPU 虚拟化扩展get_cpuid()关闭依赖特性的 guest 优化
MSR 白名单get_msr_list()过滤不支持寄存器访问
中断模型能力后端 capability回退到兼容中断路径
脏页跟踪能力后端 API快照采用全量内存导出

错误模型设计建议

抽象层建议保留两类错误:

  1. 语义错误(参数非法、状态不合法)
  2. 后端错误(ioctl/hypercall 失败)

这样上层可以区分“可重试”和“不可重试”的情况:

  • 参数或状态错误:直接失败并返回明确提示
  • 临时资源不足:可重试或触发降级流程

性能与可观测性关注点

维度关注点观测指标
VM 创建后端句柄创建耗时vm_create_latency_ms
vCPU 启动run() 首次进入耗时vcpu_first_run_latency_ms
Exit 频率高频退出导致抖动vm_exit_rate
内存映射大量 region 注册耗时memory_region_map_ms

常见问题排查

1) VM 创建失败

优先看:

  • 宿主机是否开启硬件虚拟化
  • 当前用户是否具备访问虚拟化设备权限
  • 能力探测与配置是否匹配

2) vCPU 启动后立即退出

优先看:

  • 引导寄存器是否初始化完整
  • 内核入口地址与内存布局是否一致
  • 中断控制器是否已完成初始化

3) 设备中断不生效

优先看:

  • register_irqfd() 是否成功
  • 中断路由表是否按架构正确写入
  • guest 内核驱动是否完成 probe

推荐阅读顺序

  1. hypervisor/src/lib.rs(先建立抽象心智模型)
  2. hypervisor/src/kvm/(看 Linux 主路径)
  3. vmm/src/vm.rs(看抽象层如何被编排)
  4. vmm/src/cpu.rs(看 vCPU 生命周期)
  5. hypervisor/src/mshv/(对照平台差异)

小结

Hypervisor 抽象层不是“薄封装”,而是 Cube Hypervisor 的可移植性和稳定性基础层。理解这层之后,读 vm.rscpu.rsdevice_manager.rs 会明显更顺畅。