virt 目录作用与 KVM 公共层机制详解

virt 目录作用与 KVM 公共层机制详解

1. 在内核虚拟化栈中的位置

Linux 主机虚拟化(KVM)采用 分层模块

ioctl /dev/kvmirq bypassQEMU / crosvm / Cloud Hypervisorkvm 字符设备 kvm_main.cstruct kvm VMstruct kvm_vcpukvm_arch_* / arch/arm64/kvmEL2 hyp: arch/arm64/kvm/hypVFIO 设备驱动virt/lib/irqbypass.c
  • virt/kvm/:VM 生命周期、内存槽、ioctl 分发、通用 irq 路由、VFIO 桥、脏页环等;
  • arch/<arch>/kvm/:指令仿真、MMU、虚拟中断控制器、hypercall;
  • virt/lib/:IRQ bypass 匹配(producer/consumer),供 KVM 与 VFIO 共用。

virt/ Rockchip 定制(全树 grep 无 rockchip/rk3588)。

2. 目录体量

位置 文件数(约) 说明
virt/ 19 公共 C 源文件 + Kconfig
arch/arm64/kvm/ 98+ RK3588 相关 KVM 实现主体
Documentation/virt/kvm/ 50+ rst API、VGIC、ARM hyp ABI

分析 仅读 virt/ 会遗漏 VGIC、定时器、PSCI、pKVM 等 ARM 关键路径。

3. 构建与链接

virt/Makefile 仅:

1
obj-y += lib/

virt/libCONFIG_IRQ_BYPASS_MANAGER 下编译 irqbypass.o

KVM 模块对象由架构 Makefile 聚合,例如 ARM64:

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

virt/kvm/Makefile.kvm 定义公共对象:

1
2
3
4
5
kvm-y := kvm_main.o eventfd.o binary_stats.o
kvm-$(CONFIG_KVM_VFIO) += vfio.o
kvm-$(CONFIG_HAVE_KVM_IRQ_ROUTING) += irqchip.o
kvm-$(CONFIG_HAVE_KVM_DIRTY_RING) += dirty_ring.o
...

最终 kvm.ko(或 built-in)= virt/kvm/* + arch/arm64/kvm/* + hyp/ 子构建。

4. 用户态接口(概念)

节点/操作 实现位置
/dev/kvm miscdevice kvm_main.c
KVM_CREATE_VM kvm_dev_ioctl_create_vmanon_inode kvm-vm
KVM_CREATE_VCPU kvm_vm_ioctl
KVM_RUN kvm_vcpu_ioctlkvm_arch_vcpu_ioctl_run(ARM 在 arm.c
KVM_SET_USER_MEMORY_REGION 内存槽 → mmu_notifier
KVM_IRQFD / routing eventfd.c + irqchip.c + arch VGIC

API 文档:Documentation/virt/kvm/api.rst

5. 核心数据结构(公共层)

定义于 include/linux/kvm_host.h(不在 virt/ 目录内,但被其广泛使用):

  • struct kvm:VM 实例、memslots、irq 路由表、lock 层级;
  • struct kvm_vcpu:虚拟 CPU、请求位、async_pf 队列;
  • struct kvm_memory_slot:Guest RAM 映射;
  • kvm_io_bus:MMIO/PIO 总线(coalesced mmio 优化)。

锁顺序(kvm_main.c 注释):kvm->lockkvm->slots_lockkvm->irq_lock

6. 弱符号与架构钩子

kvm_main.c 大量 __weak / kvm_arch_* 由架构实现,例如:

  • kvm_arch_mmu_notifier_invalidate_range
  • kvm_flush_remote_tlbs 调用 arch TLB flush
  • kvm_arch_dev_ioctl 处理 KVM_CREATE_VMtype 参数(ARM64 特性)

ARM64 在 arm.cmmu.chandle_exit.c 等提供具体行为。

7. RK3588 语境(摘要)

  • SoC 支持 ARMv8 虚拟化扩展 时,可 CONFIG_VIRTUALIZATION=yCONFIG_KVM=yType-2 hypervisor 主机(容器/Android 模拟器/开发用 VM);
  • 嵌入式产品 默认常关闭 KVM 以减镜像与攻击面;
  • 虚拟中断、计时器、PSCIarch/arm64/kvm,非 virt/
  • 详见 06-RK3588平台关联与使用场景详解.md

8. 进一步阅读

README.md 编号文档;ARM 实现必读 05-ARM64-KVM与virt目录边界详解.md

文章互动

阅读 --

留言

0 条留言

正在加载留言…