virt 目录作用与 KVM 公共层机制详解
1. 在内核虚拟化栈中的位置
Linux 主机虚拟化(KVM)采用 分层模块:
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/lib 在 CONFIG_IRQ_BYPASS_MANAGER 下编译 irqbypass.o。
KVM 模块对象由架构 Makefile 聚合,例如 ARM64:
1 | # arch/arm64/kvm/Makefile |
virt/kvm/Makefile.kvm 定义公共对象:
1 | kvm-y := kvm_main.o eventfd.o binary_stats.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_vm → anon_inode kvm-vm |
KVM_CREATE_VCPU |
kvm_vm_ioctl |
KVM_RUN |
kvm_vcpu_ioctl → kvm_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->lock → kvm->slots_lock → kvm->irq_lock。
6. 弱符号与架构钩子
kvm_main.c 大量 __weak / kvm_arch_* 由架构实现,例如:
kvm_arch_mmu_notifier_invalidate_rangekvm_flush_remote_tlbs调用 arch TLB flushkvm_arch_dev_ioctl处理KVM_CREATE_VM的 type 参数(ARM64 特性)
ARM64 在 arm.c、mmu.c、handle_exit.c 等提供具体行为。
7. RK3588 语境(摘要)
- SoC 支持 ARMv8 虚拟化扩展 时,可
CONFIG_VIRTUALIZATION=y、CONFIG_KVM=y作 Type-2 hypervisor 主机(容器/Android 模拟器/开发用 VM); - 嵌入式产品 默认常关闭 KVM 以减镜像与攻击面;
- 虚拟中断、计时器、PSCI 在
arch/arm64/kvm,非virt/; - 详见 06-RK3588平台关联与使用场景详解.md。
8. 进一步阅读
按 README.md 编号文档;ARM 实现必读 05-ARM64-KVM与virt目录边界详解.md。
正在加载留言…