Hypervisor 抽象层:KVM / MSHV
概述
Hypervisor 抽象层的核心价值是“上层稳定、下层可替换”。
- 对
vmm来说,只面向统一 trait(Hypervisor/Vm/Vcpu) - 对平台差异来说,落在
kvm/和mshv/两套实现里 - 对功能演进来说,新增能力可以先扩展 trait,再逐步补齐各后端
这让 Cube Hypervisor 可以在不重写 VMM 主流程的前提下,复用同一套 VM 生命周期管理。
代码定位
| 目录/文件 | 角色 |
|---|---|
hypervisor/src/lib.rs | trait 定义、错误类型、通用接口 |
hypervisor/src/kvm/ | Linux KVM 后端实现 |
hypervisor/src/mshv/ | Windows MSHV 后端实现 |
vmm/src/vm.rs | 调用抽象层完成 VM 生命周期 |
vmm/src/cpu.rs | vCPU 创建、启动、暂停、恢复 |
三层抽象:谁负责什么
Hypervisor:平台入口
职责:创建 VM、查询后端能力(API 版本、CPU 能力、MSR 列表等)。
典型方法:
create_vm():创建一个新的 VM 句柄get_cpuid():获取 CPU 特性白名单/可见能力get_msr_list():获取可访问 MSR 范围
Vm:虚机资源控制面
职责:管理 VM 级资源和控制器。
典型方法:
create_vcpu(id):创建对应 vCPUset_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 的调用链
这里最关键的是:
vmm不关心 KVM/MSHV 细节- 设备与中断通过统一接口注册
- VM Exit 分发仍在上层可控,便于统一审计和日志
能力探测与降级策略
实际工程里,不同宿主机能力并不完全一致。建议在初始化阶段做“能力探测 -> 配置裁剪”。
| 能力项 | 探测来源 | 常见降级策略 |
|---|---|---|
| CPU 虚拟化扩展 | get_cpuid() | 关闭依赖特性的 guest 优化 |
| MSR 白名单 | get_msr_list() | 过滤不支持寄存器访问 |
| 中断模型能力 | 后端 capability | 回退到兼容中断路径 |
| 脏页跟踪能力 | 后端 API | 快照采用全量内存导出 |
错误模型设计建议
抽象层建议保留两类错误:
- 语义错误(参数非法、状态不合法)
- 后端错误(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
推荐阅读顺序
hypervisor/src/lib.rs(先建立抽象心智模型)hypervisor/src/kvm/(看 Linux 主路径)vmm/src/vm.rs(看抽象层如何被编排)vmm/src/cpu.rs(看 vCPU 生命周期)hypervisor/src/mshv/(对照平台差异)
小结
Hypervisor 抽象层不是“薄封装”,而是 Cube Hypervisor 的可移植性和稳定性基础层。理解这层之后,读 vm.rs、cpu.rs、device_manager.rs 会明显更顺畅。