05 ARM64 KVM 与 virt 目录边界详解

05 ARM64 KVM 与 virt 目录边界详解

1. 为何必须读 arch/arm64/kvm

virt/19 文件;RK3588 上可运行的 KVM 依赖 arch/arm64/kvm/(~98 文件 + hyp/)实现:

能力 主要位置
EL2 hypervisor hyp/nvhe/hyp/vhe/
Guest 退出处理 handle_exit.c
Stage-2 MMU mmu.c
虚拟 GIC vgic/vgic-v3.cvgic-its.c
PSCI 关机/CPU on psci.c
系统寄存器陷阱 sys_regs.c
指针认证/MTE(视配置) sys_regs、特性检测
Protected KVM pkvm.c + hyp 内存保护
虚拟 architected timer arch_timer.c
PMU 虚拟化 pmu.cpmu-emul.c

arch/arm64/kvm/Makefile

1
2
3
include $(srctree)/virt/kvm/Makefile.kvm
kvm-y += arm.o mmu.o ... vgic/*.o
obj-$(CONFIG_KVM) += kvm.o hyp/

kvm.o = virt 公共对象 + 上表 arch 对象;hyp/ 单独构建 EL2 镜像对象。

2. arm.c — 架构枢纽

  • kvm_arch_hardware_setupkvm_vm_ioctl_enable_cap
  • VHE vs nVHE 模式(kvm_modekvm_protected_mode_initialized);
  • per-CPU kvm_arm_hardware_enabledkvm_hyp_vector
  • PSCI、PMU、指针认证 特性交互。

kvm_arch_vcpu_ioctl_run 最终进入汇编 guest entryhyp)。

3. vGIC 子系统

1
2
3
4
5
6
7
8
arch/arm64/kvm/vgic/
├── vgic.c / vgic-init.c # 框架
├── vgic-v2.c / vgic-v3.c # 版本实现
├── vgic-v4.c # 直接注入(HW 支持时)
├── vgic-its.c # LPI/MSI
├── vgic-mmio*.c # 寄存器仿真
├── vgic-irqfd.c # 与 eventfd 衔接
└── vgic-kvm-device.c # KVM_DEVICE API

文档:Documentation/virt/kvm/devices/arm-vgic-v3.rstarm-vgic-its.rst

virt/irqchip.c 负责 GSI 路由表;vgic 负责 IRQ 注入到 guest CPU 接口

4. hyp/ — EL2 代码

  • nVHE(Non-VHE):hypervisor 运行在 EL2,host 内核在 EL1;
  • VHE(Virtualization Host Extensions):host 与 hyp 同在 EL2 部分合并;
  • pKVM:将部分内存标记为 hypervisor protected,隔离恶意 host。

RK3588 Cortex-A76/A55 是否支持 VHE 取决于 ARMv8.1+ 与内核配置;需查 BSP config/proc/cpuinfo

5. 与 virt/kvm 的调用边界

调用方向 示例
virt → arch kvm_arch_vcpu_ioctl_run, kvm_arch_init_vm
arch → virt kvm_set_irq, kvm_vcpu_kick, file_is_kvm
用户态 → virt ioctl → arch KVM_RUN 路径

弱符号:virt 中 __weak 默认空实现,arch 提供强符号。

6. 其它 virt 相关树(非 virt/)

路径 说明
drivers/virtio/ paravirt I/O 设备前端/后端
drivers/vfio/ 设备直通框架
drivers/virt/coco/ 机密虚拟机(SEV 等,非 ARM RK 主流)
tools/virtio/tools/kvm/ 用户态工具

7. 阅读路线图(ARM64 KVM)

  1. virt/kvm/kvm_main.c — ioctl 与 VM 生命周期;
  2. arch/arm64/kvm/arm.c — caps 与 run;
  3. arch/arm64/kvm/handle_exit.c — exit 原因;
  4. arch/arm64/kvm/mmu.c — Stage-2;
  5. arch/arm64/kvm/vgic/vgic-v3.c — 中断;
  6. Documentation/virt/kvm/arm/hyp-abi.rst — ABI 约定。

8. 小结

分析 virt/ 目录 ≠ 分析完 ARM64 KVM。RK3588 虚拟化问题 多数应在 arch/arm64/kvm 与 hyp 下定位virt/ 提供 VM 容器与通用 IRQ/内存/VFIO 框架。

文章互动

阅读 --

留言

0 条留言

正在加载留言…