x86_vcpu
路径:
virtualization/x86_vcpu类型:库 crate 分层:组件层 / x86 虚拟 CPU 后端 版本:0.2.2文档依据:当前仓库源码、Cargo.toml、README.md、src/lib.rs、src/vmx/*、src/svm/*、src/regs/*
x86_vcpu 是 Axvisor 所依赖的 ArceOS Hypervisor 体系中面向 x86_64 的架构后端,实现了基于 Intel VT-x/VMX 和 AMD SVM 的 vCPU 执行引擎。它实现 axvm-types 给出的架构协议接口,并把 PIO、APIC、MSR、EPT/NPT 等 x86 语义保留在本 crate 内部,统一生命周期和运行循环由 axvm 负责。
架构设计
设计定位
该 crate 的职责可以概括为三点:
- 实现 x86_64 架构下的
VmArchVcpuOps - 实现每物理 CPU 的 VMX 或 SVM 启停逻辑
- 将 VMX/SVM exit 原因翻译成
axvm-types::VmExit
它不承担:
- VM 生命周期管理
- 访客内存布局组织
- 通用设备模型管理
- 调度多个 VM/vCPU 的系统级策略
这些职责分别位于 axvm、axaddrspace、axdevice、os/axvisor 等更高层。
模块结构
| 模块 | 作用 | 关键内容 |
|---|---|---|
lib.rs | crate 入口和公共导出 | 导出稳定的 x86 vCPU 类型与接口 |
runtime.rs | 运行时选择与统一接口 | 根据 CPUID 选择 VMX/SVM、实现 X86Vcpu、X86PerCpuState |
vmx/vcpu.rs | vCPU 主实现 | VmxVcpu、setup、run、vmexit、注入事件 |
vmx/percpu.rs | 每核 VMX 状态 | VmxPerCpuState、vmxon / vmxoff |
vmx/vmcs.rs | VMCS 访问封装 | 字段读写、控制域配置、exit 信息解析 |
vmx/structs.rs | VMX 内存结构 | VmxRegion、I/O bitmap、MSR bitmap、EPT pointer |
vmx/definitions.rs | 常量与枚举 | exit reason、控制位、事件信息等 |
vmx/instructions.rs | 特权指令辅助 | invept 等 |
svm/vcpu.rs | AMD vCPU 主实现 | SvmVcpu、setup、run、VM exit、注入事件 |
svm/percpu.rs | 每核 SVM 状态 | SvmPerCpuState、EFER.SVME 与 HSAVE 页 |
svm/vmcb.rs | VMCB 访问封装 | 控制域、状态域与 exit 信息解析 |
regs/ | 通用寄存器布局与保存恢复 | GeneralRegisters 和汇编辅助 |
msr.rs | MSR 常量与访问 | VMX 能力和常见寄存器读写 |
ept.rs | EPT 相关辅助 | GuestPageWalkInfo 等辅助结构 |
1.3 VmxVcpu:核心状态载体
VmxVcpu<H> 是整个 crate 的中心结构。它内部聚合了:
- 客户机通用寄存器
- host 栈顶指针
launched状态vmcs- I/O bitmap
- MSR bitmap
pending_eventsvlapicxstate
其中几个字段的语义特别重要:
vmcs
每个 vCPU 一份 VMCS 区,负责保存:
- guest state
- host state
- execution controls
- exit/entry controls
- EPT pointer
pending_events
用于软件排队待注入的中断/异常事件。真正写入 VM-entry 注入字段发生在运行前的 inject_pending_events() 阶段。
vlapic
类型来自外部依赖 x86_vlapic::EmulatedLocalApic。这说明 LAPIC 虚拟化并不内嵌在本仓库内的独立 crate 中,而是作为外部组件由 x86_vcpu 调用。
xstate
负责 guest/host 间 XSAVE 相关上下文切换,保证启用扩展状态时客户机和宿主机的 XCR0/IA32_XSS 等状态不会互相污染。
1.4 VmxPerCpuState:每核硬件虚拟化开关
VmxPerCpuState 对应 axvm-types::VmArchPerCpuOps。它负责:
- 打开 CR4.VMXE
- 检查 VMX 能力 MSR
- 执行
vmxon - 在退出时
vmxoff
这层设计说明:
- vCPU 是每个虚拟 CPU 的运行实体
- VMX 开关状态是每个物理 CPU 的宿主状态
两者被清晰分离。