arm_vcpu 技术文档
路径:
components/arm_vcpu类型:库 crate 分层:组件层 / 可复用基础组件 版本:0.2.2文档依据:Cargo.toml、src/lib.rs、src/vcpu.rs、src/pcpu.rs、src/exception.rs、src/exception.S、src/exception_utils.rs、src/context_frame.rs、src/smc.rs
arm_vcpu 是 Axvisor/axvm 体系在 AArch64 EL2 上的 vCPU 实现。它负责 guest 与 host 上下文切换、EL2 异常向量接管、常见 VM exit 的解析与上报,以及与宿主侧中断注入接口的对接,是 ARM 虚拟化主线中最接近硬件执行边界的组件之一。
1. 架构设计分析
1.1 设计定位
arm_vcpu 的职责边界十分清晰:
- 它实现的是 AArch64 架构相关的 vCPU 运行时,不是通用虚拟机资源管理层。
- 它向上实现
axvcpu::AxArchVCpu/AxArchPerCpu,由axvm统一调度和管理。 - 它向下直接操作 EL2 寄存器、异常向量、
VTTBR_EL2、VTCR_EL2、HCR_EL2等硬件虚拟化设施。 - 它不负责完整的 vGIC 设备模型,也不负责 VM 生命周期编排;这些分别由
arm_vgic、axvm和更上层 hypervisor 逻辑承担。
因此,arm_vcpu 的核心价值是“把 ARM EL2 虚拟化原语整理成一个可被上层 hypervisor 驱动的 vCPU 对象”。
1.2 内部模块划分
src/lib.rs:crate 入口与对外导出。导出Aarch64VCpu、Aarch64PerCpu、配置类型和TrapFrame别名。src/vcpu.rs:vCPU 主体实现,包含Aarch64VCpu、AxArchVCpu实现、run()主线、VM 寄存器恢复与 VM exit 分析。src/pcpu.rs:per-CPU 虚拟化状态入口,负责 EL2 向量基址、HCR 与 IRQ 处理回调等本地状态。src/exception.rs:异常入口 glue,定义vmexit_trampoline、同步异常处理和 VM exit 归类。src/exception.S:真正的 EL2 异常向量与保存/恢复汇编路径。src/exception_utils.rs:ESR/FAR/HPFAR 等寄存器解析、GPA 合成与若干汇编辅助宏。src/context_frame.rs:TrapFrame/Aarch64ContextFrame与GuestSystemRegisters的存取实现。src/smc.rs:SMC 指令封装,用于必要的 SMC 转发路径。
1.3 关键数据结构与对象
-
Aarch64VCpu<H>:核心 vCPU 对象,内部最关键的字段顺序是:ctx: TrapFramehost_stack_top: u64guest_system_regs: GuestSystemRegisters
这一布局和
exception.S的汇编路径强绑定,不能随意调整。 -
TrapFrame/Aarch64ContextFrame:保存 guest 的 GPR、sp_el0、elr、spsr。 -
GuestSystemRegisters:保存 guest 视角的 EL1/EL0 系统寄存器,以及hcr_el2、vttbr_el2、vtcr_el2、vmpidr_el2等虚拟化关键状态。 -
Aarch64PerCpu<H>:每 CPU 的 EL2 本地状态对象。 -
VmCpuRegisters:面向更高层打包的寄存器聚合类型,适合描述“可迁移/可保存的一组 vCPU 状态”。
1.4 vCPU 创建、运行与退出主线
arm_vcpu 的主线非常明确:
可以进一步拆解为:
new()只构造基本上下文,并把 DTB 地址写到约定参数寄存器。setup()/init_hv()配置SPSR_EL2、VTCR_EL2、HCR_EL2、VMPIDR_EL2等虚拟化状态。set_entry()设置 guest 入口 PC;set_ept_root()设置VTTBR_EL2。run()先保存宿主SP_EL0,再恢复 guest 系统寄存器,最后通过裸函数run_guest()跳到context_vm_entry并eret进入 guest。- guest 一旦因同步异常、IRQ 或系统寄存器 trap 回到 EL2,
exception.S会把 guest 上下文写回Aarch64VCpu,再通过vmexit_trampoline切回宿主栈。 vmexit_handler()把硬件 trap 归类为AxVCpuExitReason,再交给上层 hypervisor 处理。
1.5 VM exit 与内建处理逻辑
arm_vcpu 的 VM exit 路径不是简单“返回异常号”,而是做了明确分类:
Synchronous:走数据 abort、系统寄存器访问、HVC、SMC/PSCI 等细分解析。Irq:上报为ExternalInterrupt,由 HAL 侧决定 vector 语义。- 对
SysRegRead/SysRegWrite,还会额外执行内建的系统寄存器处理逻辑,例如ICC_SGI1R_EL1生成SendIPI类型退出。
这说明 arm_vcpu 不只是“上下文切换器”,它同时承担了第一层 trap 解码器的角色。
1.6 与 GIC、中断与 Stage-2 页表的关系
set_ept_root()实际写的是VTTBR_EL2,即 Stage-2 根页表基址。VTCR_EL2会根据ID_AA64MMFR0_EL1探测宿主支持的物理地址位宽和页表层级。HCR_EL2会根据配置选择虚拟中断或物理直通中断行为。- 真正的“虚拟中断注入”并不在本 crate 内建模,而是调用
axvisor_api::arch::hardware_inject_virtual_interrupt(),与arm_vgic形成分工。
2. 核心功能说明
2.1 主要功能
- 创建和维护 AArch64 guest 上下文。
- 在 EL2 和 guest EL1/EL0 之间切换执行。
- 解析常见 VM exit 并生成
AxVCpuExitReason。 - 提供 per-CPU EL2 本地状态管理。
- 与宿主 HAL / 中断注入接口协作完成 IRQ 路径。