ARM64 虚拟化的核心是 ARMv8 架构引入的EL2 异常级别与Stage 2 地址翻译硬件扩展,为构建 Type-2 型 Hypervisor(如 KVM)提供了原生、高效的硬件辅助能力。
ARMv8-A 定义了 4 个异常级别(EL),虚拟化核心在于EL2(Hypervisor 层):
- EL0:用户态(Guest 应用)
- EL1:内核态(Guest OS 内核)
- EL2:Hypervisor(KVM 运行于此)
- EL3:安全监控(Secure World 与 Normal World 切换)
关键硬件扩展:
- 虚拟化扩展(Virtualization Extensions):启用 EL2,支持敏感指令陷入(Trap)与异常路由。
- VHE(Virtualization Host Extensions,ARMv8.1+):允许 Host 内核直接运行于 EL2,减少切换开销,提升性能。
- GICv3/v4:支持虚拟中断注入与硬件加速,优化中断虚拟化性能。
- SMMUv3:I/O 地址翻译,支持设备直通与 DMA 虚拟化。
CPU 虚拟化:Trap-and-Emulate
- 敏感指令捕获:通过 HCR_EL2 寄存器配置,将 Guest(EL1/EL0)执行的敏感指令(如 WFI/WFE、修改系统寄存器)路由至 EL2,触发异常并交由 KVM 处理。
- 世界切换(World Switch):
- Guest 运行:非敏感指令直接硬件执行,无开销。
- 陷入(Trap):敏感操作→EL2→KVM 解析 ESR_EL2,处理异常(模拟指令、注入中断)。
- 恢复执行:KVM 完成处理后,通过 ERET 指令返回 Guest 继续运行。
- vCPU 调度:KVM 为每个虚拟 CPU(vCPU)创建独立上下文(struct kvm_vcpu),由 Linux 调度器管理,实现物理 CPU 的时分复用。
内存虚拟化:两阶段地址翻译(Stage 1 + Stage 2)
彻底隔离 Guest 物理地址(IPA)与真实物理地址(PA),硬件自动完成两级页表遍历:
- Stage 1(Guest):VA → IPA(Guest 虚拟地址→Guest 物理地址),由 Guest 内核通过 TTBR0_EL1/TTBR1_EL1 管理,无需陷入。
- Stage 2(KVM):IPA → PA(Guest 物理地址→真实物理地址),由 KVM 通过 VTTBR_EL2 管理,每个 VM 独立一套 Stage 2 页表。
- VMID:每个虚拟机分配唯一标识符(8/16 位),标记 TLB 项,支持多 VM 地址空间共存,减少 TLB 刷新开销。
Stage 2 地址翻译
ARM64 虚拟化的 Stage 2 地址翻译是硬件辅助虚拟化的核心机制,由 EL2(Hypervisor)管控,完成IPA(中间物理地址)→PA(真实物理地址)的转换,与 Guest OS 控制的 Stage 1(VA→IPA)串联,形成VA→IPA→PA的两级地址翻译流水线。
- 内存隔离:强制 VM 仅访问分配的物理内存,避免跨 VM/Host 越权。
- 地址空间重映射:将 VM 连续的 IPA 空间映射到物理机离散的 PA 空间,支持内存超分配与动态迁移。
- 硬件加速:两级翻译均由 MMU 硬件自动完成,无需软件介入,性能接近原生。
关键寄存器(EL2 特权)
1. VTTBR_EL2(Virtualization Translation Table Base Register)
- 作用:指向当前 VM 的 Stage 2 页表基地址,含VMID(虚拟机 ID)。
- 格式:
- 高 48 位:Stage 2 页表物理基地址(4KB 对齐)。
- 低 16 位:VMID(8 位 / 16 位,由 VTCR_EL2.VS 控制),用于 TLB 标记,避免 VM 切换时全刷 TLB。
- 配置:VM 切换时,Hypervisor 写入当前 VM 的页表基址 + VMID。
2. VTCR_EL2(Virtualization Translation Control Register)
- 作用:配置 Stage 2 页表的全局参数(地址位宽、页粒度、缓存属性等)。
- 关键字段:
字段 说明 T0SZ IPA 空间大小(64-T0SZ 位,如 T0SZ=32→4GB IPA) SL0 页表起始级别(0=L0,1=L1,适配 4KB/64KB 页) TG0 页粒度(0=4KB,1=16KB,2=64KB) PS 物理地址空间大小(0=32 位,1=36 位,2=40 位,3=42 位,4=44 位,5=48 位) ORGN0/IRGN0 外部 / 内部缓存策略(00 = 无缓存,01 = 写回,10 = 写直通) SH0 共享属性(00 = 非共享,11 = 内部共享) VS VMID 宽度(0=8 位,1=16 位)
3. HCR_EL2(Hypervisor Configuration Register)
- 关键位:VM(bit0),置 1 时启用 Stage 2 翻译,所有 EL0/EL1 内存访问强制走 Stage1+Stage2 两级翻译。
4. MAIR_EL2(Memory Attribute Indirection Register)
- 作用:定义 8 种内存属性(缓存、设备、共享等),Stage 2 页表项通过 **AttrIndx(3 位)** 索引此寄存器,统一管理内存属性,减少页表项冗余。
Stage 2 页表结构(IPA→PA)
Stage 2 页表格式与 Stage 1 兼容,支持4 级 / 3 级 / 2 级页表(取决于 IPA 位宽与页粒度),以4KB 页、48 位 IPA为例(4 级页表:L0→L1→L2→L3)。
1. 页表项描述符格式
页表项(64 位)由低 2 位决定类型:
- 0b00/0b01:无效描述符,触发 Stage 2 翻译故障。
- 0b10:块描述符(L0/L1/L2),映射大页(如 L1 块映射 1GB),无下级页表。
- 0b11:
- 非 L3:表描述符,指向下一级页表基地址。
- L3:页描述符,映射 4KB 物理页。
2. 页表项关键字段(块 / 页描述符)
| 字段 | 说明 |
|---|---|
| PA[47:12] | 真实物理地址(4KB 对齐) |
| S2AP[1:0] | Stage 2 访问权限(00 = 无访问,01 = 只读,10 = 只写,11 = 读写) |
| AttrIndx[2:0] | 索引 MAIR_EL2 的内存属性 |
| AF | 访问标志(置 1 表示已访问,用于页面回收) |
| SH | 共享属性(00 = 非共享,11 = 内部共享) |
3. 地址翻译流程(4KB 页、4 级页表)
- 输入 IPA:
IPA[47:0] - L0 页表查找:
- 索引:
IPA[47:39](9 位) - 基址:
VTTBR_EL2[47:12] - 输出:L1 页表基址
- 索引:
- L1 页表查找:
- 索引:
IPA[38:30](9 位) - 输出:L2 页表基址
- 索引:
- L2 页表查找:
- 索引:
IPA[29:21](9 位) - 输出:L3 页表基址
- 索引:
- L3 页表查找:
- 索引:
IPA[20:12](9 位) - 输出:
PA[47:12]
- 索引:
- 拼接页内偏移:
PA[11:0] = IPA[11:0],最终得到PA[47:0]。
Stage 2 故障处理
当 Stage 2 翻译失败(如页表无效、权限不足、IPA 未映射),硬件触发EL2 数据中止异常,Hypervisor 通过以下寄存器定位故障:
- ESR_EL2:异常状态寄存器,记录故障原因(翻译故障、权限故障、访问标志故障等)。
- HPFAR_EL2:Stage 2 故障地址寄存器,记录触发故障的IPA 地址(Hypervisor 据此判断是内存访问还是 MMIO 访问)。
- FAR_EL2:记录 Stage 1 输出的 IPA 地址(与 HPFAR_EL2 一致)。
常见故障类型
- Translation Fault:IPA 无有效 Stage 2 映射(如访问未分配的 IPA 空间,触发 MMIO 模拟)。
- Permission Fault:S2AP 权限不匹配(如只读页写操作)。
- Access Flag Fault:页表项 AF=0,需 Hypervisor 置 AF 并重新访问(用于页面回收)。
与 Stage 1 的协作
- Stage 1(Guest EL1):VA→IPA,由 Guest OS 通过 TTBR0_EL1/TTBR1_EL1 管理,Guest 可直接修改,无需 Trap 到 EL2。
- Stage 2(Hypervisor EL2):IPA→PA,由 Hypervisor 通过 VTTBR_EL2/VTCR_EL2 管理,Guest 无权限修改。
- 硬件串联:内存访问时,MMU 先做 Stage 1 翻译(VA→IPA),再自动做 Stage 2 翻译(IPA→PA),全程硬件完成,无软件开销。
优化特性
- VMID 标记 TLB:TLB 项含 VMID,不同 VM 的 TLB 项共存,VM 切换时无需全刷 TLB,仅无效化当前 VM 项,大幅提升切换性能。
- 大页支持:Stage 2 支持 1GB/2MB 大页(L1/L2 块描述符),减少页表级数与 TLB miss,提升内存访问效率。
- Stage 2 仅模式:部分场景(如设备直通)可绕过 Stage 1,直接启用 Stage 2 翻译(IPA→PA),简化虚拟化配置。
中断虚拟化:GICv3/v4 虚拟中断
- 物理中断→虚拟中断:KVM 将物理中断(如外设、定时器)封装为虚拟中断,通过 GICv3/v4 注入 vCPU。
- 中断路由:HCR_EL2 的 FMO/IMO/AMO 位控制 FIQ/IRQ/SERROR 异常路由至 EL2,由 KVM 统一处理。
I/O 虚拟化:全虚拟化与半虚拟化结合
- 全虚拟化(QEMU 模拟):Guest 访问 MMIO/PIO 时触发 Stage 2 缺页,KVM 转发至 QEMU 模拟设备(如串口、磁盘),兼容性好但性能低。
- 半虚拟化(virtio):Guest 安装 virtio 驱动,直接通过共享内存与 QEMU/KVM 通信,绕过模拟层,性能接近原生(支持 virtio-blk、virtio-net、virtio-gpu 等)。
- 设备直通(VFIO):通过 SMMUv3 将物理设备直接分配给 VM,适合高性能场景(如 GPU、网卡)。
KVM/ARM64 架构
KVM 是 ARM64 平台主流 Hypervisor,与 QEMU 组合形成完整虚拟化方案:
- 架构分层:
- 硬件层:支持 EL2、GICv3、SMMUv3 的 ARM64 CPU(如 Cortex-A72/A76、鲲鹏 920、飞腾 FT-2000+)。
- Host OS:Linux(内核≥4.15,推荐 5.4+),启用 KVM 模块与 VHE 扩展。
- KVM(EL2):负责 vCPU 调度、Stage 2 页表管理、中断注入、异常处理。
- QEMU(用户态):模拟设备、提供 virtio 后端、处理 I/O 请求。
- Guest OS:Linux、Windows(部分支持)、Android 等,支持 32/64 位 ARM 系统。
- 性能特点:
- VHE 模式:Host 内核运行于 EL2,减少 EL1↔EL2 切换,性能提升 10-15%。
- 两阶段地址翻译:硬件遍历页表,TLB miss 率低于 x86,内存性能损耗约 5-10%。
- virtio 设备:I/O 性能接近原生,网络 / 磁盘吞吐量可达物理机的 90% 以上。
与 x86 虚拟化(VT-x/AMD-V)的关键差异
| 特性 | ARM64(EL2+Stage 2) | x86(VT-x/AMD-V) |
|---|---|---|
| 特权模型 | 原生 EL2,与 EL0/EL1/EL3 统一 | 新增 Root/Non-Root 模式,独立于 Ring 0-3 |
| 内存虚拟化 | Stage 2 页表(S2 MMU) | EPT(Intel)/NPT(AMD) |
| 切换机制 | EL1↔EL2 异常级别切换 | VM Entry/Exit 指令切换模式 |
| 中断虚拟化 | GICv3/v4 硬件加速 | APICv/x2APIC |
| I/O 虚拟化 | SMMUv3+virtio 为主 | VT-d+IOMMU 更成熟 |
| 嵌套虚拟化 | ARMv8.1 + 支持 | VT-x/AMD-V 支持,但兼容性有限 |
总结
ARM64 虚拟化凭借EL2 原生设计、Stage 2 硬件地址翻译和GIC/SMMU 虚拟化扩展,构建了高效、低损耗的虚拟化体系。KVM/ARM64 已在服务器、边缘计算、嵌入式领域广泛应用,尤其在国产芯片(鲲鹏、飞腾、龙芯)生态中,成为替代 x86 虚拟化的核心技术。