axvisor
路径:
os/axvisor类型:二进制 crate 分层:Axvisor 层 / Axvisor Hypervisor 运行时 版本:0.3.0-preview.2文档依据:Cargo.toml、README.md、src/main.rs、src/hal/*、src/vmm/*、src/task.rs、build.rs、xtask/*、configs/board/*、configs/vms/*
axvisor 是本仓库中的 Type-I Hypervisor 主程序。它建立在 ArceOS 宿主运行时之上,通过 axvm、axvm-types、架构 vCPU 后端、axaddrspace、axdevice 等组件实现客户机管理,并通过分层配置系统把“编译什么”和“运行哪个 guest”两件事统一到一套工作流中。
架构设计
1.1 包结构与角色
os/axvisor 这个包同时承载两类实体:
src/main.rs对应的 no_std Hypervisor 内核二进制。xtask/src/main.rs对应的 宿主侧构建与运行工具,通过[[bin]] name = "xtask"暴露。
真正的 Hypervisor 运行时逻辑集中在 src/ 下,而 xtask/ 负责构建配置、镜像准备、QEMU 启动与开发流程自动化。写文档时必须把这两层区分开,否则容易误把宿主 CLI 逻辑当成内核主线。
模块结构
src/main.rs:Hypervisor 主入口,按顺序执行 Logo 输出、虚拟化使能、VMM 初始化、VM 启动和控制台 shell。src/hal/:宿主 HAL 实现层,提供AxVMHalImpl、AxVCpuHalImpl、AxMmHalImpl,并用axvisor_api::api_mod_impl注入 memory/time/vmm/host 能力。src/vmm/:VMM 核心,包括 VM 配置加载、镜像加载、VM 列表、vCPU 任务管理、hypercall、定时器、FDT 处理等。src/task.rs:定义VCpuTask,把当前任务与 VM/vCPU 对象绑定,是 Hypervisor 并发模型与ax-task的结合点。src/shell/:交互式控制台与 VM 管理命令。src/driver/:宿主侧硬件驱动接入。
1.3 VMM 子模块划分
src/vmm/config.rs:把 TOML 配置转成AxVMConfig,分配内存、加载镜像并注册 VM。src/vmm/vm_list.rs:全局 VM 列表管理。src/vmm/vcpus.rs:为每个 VM 创建 vCPU 任务,维护等待队列并实现vcpu_run主循环。src/vmm/images/:镜像加载器,负责 kernel/DTB/initrd 等镜像装载。src/vmm/fdt/:AArch64 路径上的 FDT 解析与生成。src/vmm/hvc.rs、src/vmm/ivc.rs:hypercall 与 VM 间通信路径。src/vmm/timer.rs:虚拟机计时与时间服务桥接。
1.4 关键数据结构
VM/VMRef/VCpuRef:在src/vmm/mod.rs中把axvm::AxVM<AxVMHalImpl, AxVCpuHalImpl>固定为工程内使用的 VM 类型。VMStatus:来自axvm,在 Axvisor 中被作为控制台管理和生命周期判断的状态基础。VCpuTask:TaskExt的实现,承载 VM 和 vCPU 引用,使当前任务能够识别自己属于哪个客户机。VMM:并非单独结构体,而是以模块级状态 + 等待队列 + VM 列表的形式实现的全局管理器。AxVMCrateConfig/AxVMConfig:前者贴近 VM TOML,后者是运行时 VM 创建的配置对象。.build.toml与vm_configs:不是 Rust 类型,但却是 Axvisor 行为的关键“外部数据结构”。
1.5 从 main 到 VM 启动的主线
Axvisor 的主线很短, 但层次很深:
这条主线说明:
main()本身几乎不包含复杂业务。- 复杂度集中在
hal、vmm/config.rs、vmm/vcpus.rs和配置/镜像协同逻辑。
1.6 配置驱动机制
Axvisor 使用两层 TOML:
configs/board/*.toml:板级/构建配置,决定目标架构、feature、日志级别、默认vm_configs等。configs/vms/**/*.toml:客户机配置,决定 VM id、CPU 数、内存区域、镜像路径、设备列表等。
对应的协同关系是:
cargo xtask defconfig <board>把板级配置复制为.build.toml。xtask把.build.toml中的vm_configs写入环境变量AXVISOR_VM_CONFIGS。build.rs读取该变量,把 VM TOML 以静态字符串形式嵌入构建产物。- 运行时
config::init_guest_vms()优先尝试文件系统中的/guest/vm_default/*.toml,否则退回静态嵌入配置。
因此,Axvisor 的关键不是“只有代码”,而是“代码 + board config + vm config + 镜像资源”共同决定行为。