axvm
路径:
virtualization/axvm类型:库 crate 分层:组件层 / 可复用基础组件 版本:0.2.3文档依据:Cargo.toml、README.md、src/lib.rs、src/vm.rs、src/vcpu.rs、src/hal.rs、src/config.rs
axvm 是 Axvisor 虚拟化软件栈中的“VM 资源管理层”。它不负责 Hypervisor 顶层编排,也不直接实现所有架构相关虚拟化细节,而是把虚拟机对象、vCPU 列表、客户机地址空间、设备集合和生命周期状态封装成一个统一的 AxVM 抽象,供上层 VMM 直接使用。
架构设计
设计定位
从职责上看,axvm 位于三类组件的交汇处:
- 向下依赖
axvm-types、各架构 vCPU crate、axaddrspace、axdevice等组件,承接 vCPU、地址空间和设备模型。 - 向外通过
AxVMHal把宿主能力注入进来,例如地址翻译、时间、当前 VM/vCPU/pCPU 信息和中断注入。 - 向上被 Axvisor 的
vmm层直接调用,作为真正的 VM 实例与生命周期实体。
可以把 axvm 理解为“可被 Hypervisor 编排的 VM 对象层”,而不是顶层 Hypervisor 程序。
模块结构
src/lib.rs:crate 入口,导出AxVM、AxVMRef、VMMemoryRegion、VMStatus、config、AxVMHal与has_hardware_support()。src/vm.rs:核心实现文件,定义AxVM、内部可变/不可变状态、内存区管理、状态切换、init()、boot()、shutdown()、run_vcpu()等。src/vcpu.rs:AxVM 自有 vCPU wrapper、状态机、current-vCPU 绑定和架构适配层,按x86_64、riscv64、aarch64、loongarch64选择具体后端。src/hal.rs:定义AxVMHaltrait,规定宿主必须提供的能力边界。src/config.rs:把axvmconfig的 TOML 侧配置转成运行时AxVMConfig、AxVCpuConfig、VMImageConfig、PhysCpuList等结构。
1.3 关键数据结构
AxVM<H, U>:虚拟机主对象,其中H: AxVMHal、U: AxVCpuHal。AxVMInnerConst<U>:初始化后不再变化的部分,主要是phys_cpu_ls、vcpu_list和devices。AxVMInnerMut<H>:可变状态,包含address_space、memory_regions、config和vm_status。VMMemoryRegion:记录客户机物理地址、宿主虚拟地址、布局信息和是否需要回收。VMStatus:Loading、Loaded、Running、Suspended、Stopping、Stopped,描述 VM 生命周期。VcpuSnapshot:对外暴露的架构无关 vCPU 状态快照。AxVMConfig/AxVMCrateConfig:前者用于运行时 VM 创建,后者更贴近 TOML 配置源。
1.4 VM 生命周期与主线
axvm 的主要执行路径如下:
对应到源码:
AxVM::new(config)创建空的客户机地址空间,并把状态初始化为Loading。init()负责真正完成 VM 组装:创建 vCPU、合并直通地址区间、建立设备、设置页表根与 vCPU 初始入口。boot()把状态切换到Running,但不直接执行客户机代码。- 真正执行路径在
run_vcpu(vcpu_id),它循环处理VmExit。 shutdown()把 VM 推入停止状态;Drop中会触发资源清理。
当前源码表明:
suspend/resume语义尚未完整实现,Suspended更偏状态预留。boot()后不意味着所有资源 自动启动,上层 VMM 仍需调度相应的 vCPU 任务。
1.5 架构相关分层
axvm 自身不把所有架构细节写死,而是通过 src/vcpu.rs 做一层统一绑定:
x86_64:主要对接x86_vcpu与 VMX 路径。riscv64:对接riscv_vcpu。aarch64:对接arm_vcpu,并与arm_vgic协作处理中断控制器与虚拟定时设备。
同时,架构 vCPU crate 只保留贴近硬件的后端能力,统一生命周期和运行循环在 axvm 中完成。
核心功能
功能概览
- 管理虚拟机对象生命周期:创建、初始化、启动、停止。
- 管理 vCPU 列表与物理 CPU 亲和信息。
- 管理客户机地址空间和内存区域。
- 管理直通设备与仿真设备配置。
- 统一处理 VM exit,并把硬件相关能力通过 HAL 向上层隔离。
2.2 关键 API
AxVM::new(config):创建 VM 对象。AxVM::init():构造 vCPU、设备和地址空间,是最关键的初始化步骤。AxVM::boot():切到Running状态。AxVM::shutdown():进入停止流程。AxVM::run_vcpu(vcpu_id):执行并处理一次或一轮 vCPU 运行/退出。set_vm_status()/vm_status():状态管理接口。has_hardware_support():检查底层虚拟化支持是否可用。
使用场景
axvm 最典型的消费方不是应用程序,而是 VMM:
- 根据 TOML 配置创建一个 VM。
- 准备内存映射、内核镜像和设备配置。
- 在上层任务系统中为每个 vCPU 分配执行实体。
- 在 VM exit 循环中调用
run_vcpu()并处理 hypercall、MMIO、外部中断等事件。
2.4 使用示意
// 伪代码:宿主需要提供 AxVMHal/AxVCpuHal 的具体实现
let vm = AxVM::<MyVmHal, MyVCpuHal>::new(config)?;
vm.init()?;
vm.boot()?;
let exit_reason = vm.run_vcpu(0)?;
在实际仓库中,这套流程由 virtualization/axvm/src/runtime/* 完成,而不是由普通库使用者直接手写。
依赖关系
直接依赖
axvm-types:提供 VM/vCPU 共享值类型、架构协议 trait 和 VM exit 原因。axaddrspace:提供客户机地址空间管理与 GPA 映射能力。axdevice、axdevice_base:提供虚拟设备与直通设备建模。axvmconfig:提供从配置文件到运行时结构的配置来源。