kvm aarch64 原理详解

发布时间:2026/5/20 8:55:22

kvm aarch64 原理详解 KVM on AArch64 基于 ARMv8 硬件虚拟化扩展EL2、两阶段地址翻译、GICv3/v4、VHE以Trap-and-Emulate为核心实现 CPU、内存、中断、设备的高效虚拟化宿主机 Linux 与 KVM 协同提供完整虚拟化能力。ARMv8 虚拟化硬件基础异常级别Exception Level, ELARMv8 定义 4 个异常级别形成严格权限隔离EL名称运行主体权限核心作用EL0User应用程序最低执行非特权指令EL1KernelGuest OS 内核特权管理 Guest 资源EL2HypervisorKVM 核心最高非安全虚拟化管控、异常捕获EL3MonitorTrustZone / 固件最高安全安全世界切换关键Guest 运行在EL1/EL0KVM 运行在EL2。Guest 执行特权 / 敏感操作时硬件自动Trap 到 EL2由 KVM 处理。EL2 拥有独立寄存器组如HCR_EL2、VTTBR_EL2与异常向量表。核心虚拟化寄存器HCR_EL2HCR_EL2Hypervisor Configuration Register是 AArch64 虚拟化总控开关决定哪些操作会 Trap 到 EL2位名称功能IMOInterrupt Mask Override物理 IRQ 路由到 EL2FMOFIQ Mask Override物理 FIQ 路由到 EL2AMOSError Mask Override系统错误路由到 EL2TWITrap WFI执行WFI触发 EL2 异常TWETrap WFE执行WFE触发 EL2 异常TVMTrap Virtual Memory访问 Stage 1 页表寄存器TTBR0_EL1触发 TrapE2HEL2 HostVHE 模式使能Host 运行在 EL2RWRegister Width控制 Guest 运行在 AArch64/AArch32两阶段地址翻译Stage 1 Stage 2AArch64 内存虚拟化的核心彻底隔离 Guest 物理地址IPA与真实物理地址PAStage 1Guest 内部Guest OS 管理VA → IPAGuest 虚拟地址 → Guest 物理地址寄存器TTBR0_EL1/TTBR1_EL1可直接由 Guest 编程无需 TrapStage 2KVM 管控KVM 管理IPA → PAGuest 物理地址 → 真实物理地址寄存器VTTBR_EL2每个 VM 独立一套 Stage 2 页表硬件自动完成两阶段 Walk性能接近原生VHEVirtualization Host Extensions, ARMv8.1解决传统 NVHE 模式下 HostEL1与 KVMEL2频繁切换的开销NVHENon-VHEHost Linux 运行在 EL1KVM 运行在 EL2Host 调用 KVM 需通过HVC异常开销大。VHEHost Linux 直接运行在EL2KVM 与 Host 共享 EL2 环境消除 EL1 ↔ EL2 切换开销Host 可直接函数调用 KVM 接口页表格式兼容简化内存管理现代 AArch64 服务器如 Neoverse N1/N2默认启用 VHE。KVM-AArch64 整体架构软件栈分层┌─────────────────────────────────────────────────┐ │ User Space │ │ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │ │ QEMU │ │ libvirt │ │ 其他管理工具 │ │ │ └──────────┘ └──────────┘ └──────────────┘ │ ├───────────────────┬─────────────────────────────┤ │ Kernel Space │ KVM Module (EL2) │ │ ┌──────────────┐ │ ┌───────────────────────┐ │ │ │ Linux Kernel │◄─┼─►│ CPU/内存/中断虚拟化 │ │ │ │ (EL1/EL2) │ │ │ Trap 处理、页表管理│ │ │ └──────────────┘ │ └───────────────────────┘ │ └───────────────────┴─────────────────────────────┘ ▲ ▲ │ │ ▼ ▼ ┌─────────────────────────────────────────────────┐ │ Hardware (AArch64) │ │ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │ │ CPU │ │ GIC │ │ 其他外设 │ │ │ └──────────┘ └──────────┘ └──────────────┘ │ └─────────────────────────────────────────────────┘核心组件KVM 内核模块kvm.ko、kvm-arm.ko运行在 EL2负责 CPU 虚拟化、内存虚拟化、中断虚拟化、vCPU 调度。提供/dev/kvm接口供 QEMU 等用户态工具使用。QEMU设备模拟virtio-net、virtio-blk、串口、显卡等VM 生命周期管理创建、启动、暂停、销毁与 KVM 交互下发虚拟化指令GICv3/v4中断控制器硬件支持虚拟中断vIRQ、vFIQKVM 直接配置 GIC 虚拟接口Guest 可直接访问减少 Trap。CPU 虚拟化原理核心Trap-and-EmulatevCPU 模型每个 vCPU 对应一个 Linux 内核线程kvm_vcpu_thread。vCPU 状态寄存器、PC、SP、标志位保存在struct kvm_vcpu中。世界切换World SwitchHost ↔ Guest 时硬件 / 软件保存 / 恢复 vCPU 上下文。执行流程Guest 运行 → Trap → 处理 → 恢复Guest 运行EL1/EL0非敏感指令直接在硬件执行无开销。普通异常如系统调用、缺页由 Guest 内核EL1处理。敏感操作触发 TrapEL2执行WFI/WFE、修改TTBR0_EL1、访问协处理器等 → 硬件自动跳转到 EL2 异常向量表。KVM 捕获异常解析异常原因ESR_EL2 寄存器。KVM 处理EL2模拟指令如WFI→ KVM 调度该 vCPU 让出物理 CPU。内存虚拟化Stage 2 缺页 → KVM 分配物理页、更新 Stage 2 页表。中断注入将物理中断转为虚拟中断注入到 vCPU。MMIO 模拟Guest 访问设备寄存器 → KVM 转发给 QEMU 模拟。恢复 Guest 执行EL1/EL0处理完成后KVM 执行eret指令返回 Guest 继续执行。关键指令与异常HVC 指令Guest 主动陷入 EL2类似 x86vmcall用于 PV 操作如 virtio 通知。SMC 指令陷入 EL3TrustZoneKVM 可拦截并模拟。异常路由通过HCR_EL2.IMO/FMO/AMO控制物理中断是否路由到 EL2。内存虚拟化原理两阶段翻译 影子页表地址空间模型Guest VAGuest 进程虚拟地址EL0Guest IPAGuest 物理地址EL1 看到的 “物理内存”Host PA真实物理地址EL2 管理Stage 2 页表管理每个 VM 拥有独立的 Stage 2 页表由 KVM 维护。VTTBR_EL2指向当前 VM 的 Stage 2 页表基址VM 切换时更新。硬件自动完成 Stage 1VA→IPA Stage 2IPA→PA翻译无需软件干预。内存分配与映射QEMU 向 KVM 申请 Guest 内存KVM_SET_USER_MEMORY_REGION。KVM 分配物理页建立IPA → PA的 Stage 2 映射。Guest 触发 Stage 2 缺页时KVM 懒分配 / 映射物理页。大页Huge Page支持AArch64 支持 2MB/1GB 大页KVM 可配置 Stage 2 使用大页大幅降低 TLB miss 率提升性能。中断虚拟化原理GICv3/v4 虚拟中断GICv3/v4 虚拟化硬件支持CPU 接口物理 CPU 接口ICC_ 虚拟 CPU 接口ICV_Guest 直接访问虚拟接口。** redistributor**每个物理 CPU 对应一个 redistributor支持虚拟中断路由。中断虚拟化寄存器ICH_*Interrupt Controller HypKVM 用于配置虚拟中断。中断处理流程物理中断到达外设发送物理 IRQ → GIC → 路由到 EL2HCR_EL2.IMO1。KVM 处理识别中断目标 VM/vCPU。将物理中断转换为虚拟中断vIRQ。通过 GIC 虚拟接口注入到目标 vCPU写ICV_IAR0_EL1等。Guest 接收vCPU 在 EL1 收到 vIRQ执行 Guest 中断处理程序。虚拟定时器AArch64 提供虚拟定时器CNTVCT_EL0、CNTV_CVAL_EL0Guest 直接访问无需 Trap。KVM 配置虚拟定时器实现每个 vCPU 独立时间片。设备虚拟化原理MMIO VirtioMMIO 设备模拟纯软件模拟Guest 访问设备寄存器IPA 空间→ Stage 2 无映射 → Trap 到 EL2。KVM 解析地址判断为 MMIO → 转发给 QEMU。QEMU 模拟设备行为返回结果 → KVM 注入到 Guest 寄存器。缺点每次访问都触发 Trap性能低。Virtio 半虚拟化高性能方案前端Guest 内核驱动virtio-net、virtio-blk 等。后端QEMU/KVM 实现的设备后端。共享内存Guest 与 Host 共享环形缓冲区virtqueue减少数据拷贝。通知机制Guest 通过HVC指令或 MMIO 通知 HostHost 通过虚拟中断通知 Guest。优势接近原生性能是 AArch64 虚拟化主流设备方案。KVM-AArch64 启动与初始化流程硬件初始化Bootloader 启用 EL2设置HCR_EL2进入 EL2 模式。Linux 启动VHE 模式Linux 直接运行在 EL2检测ARM64_HAS_VIRT_EXTN。NVHE 模式Linux 运行在 EL1通过HVC与 EL2 KVM 交互。KVM 模块加载检查 EL2 可用、虚拟化扩展支持is_hyp_mode_available()。初始化 EL2 异常向量表、Stage 2 页表管理、GIC 虚拟化、虚拟定时器。QEMU 创建 VM打开/dev/kvm创建 VMKVM_CREATE_VM。设置 Guest 内存KVM_SET_USER_MEMORY_REGION。创建 vCPUKVM_CREATE_VCPU初始化 vCPU 上下文。配置设备virtio、串口等启动 vCPU 线程。性能优化关键技术VHE 启用消除 EL1 ↔ EL2 切换开销Host 与 KVM 同 EL2 运行。Stage 2 大页使用 2MB/1GB 大页降低 TLB 压力。Virtio 全虚拟化优先使用 virtio 设备避免 MMIO 模拟。中断亲和性将物理中断绑定到指定物理 CPU减少跨 CPU 调度。vCPU 绑核将 vCPU 线程绑定到物理 CPU提升缓存命中率。PV 操作使用HVC指令实现高效 PV 接口减少 Trap。与 x86 KVM 核心差异特性AArch64 KVMx86 KVM特权模型EL0/EL1/EL2/EL3 分层Ring 0~3 平面模型虚拟化层独立 EL2 异常级别VMX root/non-root 模式内存虚拟化硬件两阶段翻译Stage 12EPTExtended Page Tables中断虚拟化GICv3/v4 硬件虚拟中断APICv/Posted-InterruptHost 运行模式VHEHost 运行在 EL2Host 运行在 Ring 0VMX root敏感指令处理HCR_EL2 位控 TrapVMCS 配置 Exit 条件总结KVM-AArch64 深度融合 ARMv8 硬件虚拟化扩展以EL2 特权隔离、两阶段地址翻译、GIC 硬件中断虚拟化为基石通过Trap-and-Emulate实现高效、安全的虚拟化。VHE 与 Virtio 进一步消除软件开销使 AArch64 虚拟化性能接近原生满足边缘、云原生、服务器等场景需求。

相关新闻