virt 源码目录与模块索引
源码根:rk3588/kernel-6.1/virt/(19 文件)
1. 目录树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| virt/ ├── Makefile # obj-y += lib/ ├── kvm/ │ ├── kvm_main.c # KVM 核心 (~6k 行) │ ├── eventfd.c # irqfd、ioeventfd │ ├── irqchip.c # GSI 路由、irq routing API │ ├── vfio.c / vfio.h # KVM-VFIO 桥 │ ├── dirty_ring.c # 脏页环 │ ├── pfncache.c # PFN 缓存 │ ├── async_pf.c / .h # 异步 page fault │ ├── coalesced_mmio.c/.h # MMIO 合并环 │ ├── binary_stats.c # 二进制统计导出 │ ├── kvm_mm.h # MMU 辅助宏/声明 │ ├── Makefile.kvm # 公共 kvm-y 对象列表 │ └── Kconfig # HAVE_KVM_* 能力开关 └── lib/ ├── irqbypass.c # IRQ bypass 管理器 ├── Kconfig # IRQ_BYPASS_MANAGER └── Makefile
|
2. Makefile.kvm → 对象映射
| 对象 |
Kconfig 条件 |
源文件 |
| 始终 |
— |
kvm_main.o, eventfd.o, binary_stats.o |
| VFIO |
CONFIG_KVM_VFIO |
vfio.o |
| MMIO |
CONFIG_KVM_MMIO |
coalesced_mmio.o |
| 异步 PF |
CONFIG_KVM_ASYNC_PF |
async_pf.o |
| IRQ 路由 |
CONFIG_HAVE_KVM_IRQ_ROUTING |
irqchip.o |
| 脏页环 |
CONFIG_HAVE_KVM_DIRTY_RING |
dirty_ring.o |
| PFN cache |
CONFIG_HAVE_KVM_PFNCACHE |
pfncache.o |
ARM64 arch/arm64/kvm/Kconfig 在 KVM 菜单下 select 多项 HAVE_KVM_*。
3. kvm_main.c 功能块索引
| 主题 |
大致内容 |
| 模块参数 |
halt_poll_ns* 停机轮询优化 |
| 全局 |
kvm_lock, vm_list, kvm_debugfs_dir |
| VCPU 调度 |
vcpu_load/put, kvm_make_vcpu_request, IPI kick |
| MMU 缓存 |
kvm_mmu_memory_cache_* |
| mmu_notifier |
host 内存变更 → guest PTE 失效 |
| memslots |
创建/删除/查询 GPA→HVA |
| ioctl |
kvm_dev_ioctl, kvm_vm_ioctl, kvm_vcpu_ioctl, kvm_device_ioctl |
| 设备 API |
kvm_ioctl_create_device 虚拟设备 |
| 初始化 |
kvm_init / kvm_exit, CPU hotplug, reboot 通知 |
4. 关联架构树(RK3588)
arch/arm64/kvm/ 主要文件:
| 文件/目录 |
职责 |
arm.c |
架构初始化、cap、vcpu run 入口 |
mmu.c |
Stage-2页表、IPA |
handle_exit.c |
EL2 退出原因分发 |
vgic/ |
vGICv2/v3/v4、ITS |
hyp/ |
nVHE/VHE hypervisor 代码 |
pkvm.c |
Protected KVM |
psci.c |
电源状态 |
arch_timer.c |
虚拟定时器 |
sys_regs.c |
系统寄存器陷阱 |
fpsimd.c |
SIMD/FP 状态 |
构建:include virt/kvm/Makefile.kvm + obj-$(CONFIG_KVM) += hyp/。
5. 头文件与 UAPI(virt 外)
| 头文件 |
用途 |
include/uapi/linux/kvm.h |
用户态 ioctl 定义 |
include/linux/kvm_host.h |
内核 KVM 内部结构 |
include/linux/kvm_dirty_ring.h |
脏页环 |
include/linux/irqbypass.h |
bypass 注册 API |
arch/arm64/include/asm/kvm_*.h |
ARM 专用 |
6. 文档路径
1 2 3 4
| Documentation/virt/kvm/api.rst Documentation/virt/kvm/arm/index.rst Documentation/virt/kvm/devices/arm-vgic-v3.rst Documentation/virt/kvm/locking.rst
|
7. 与 drivers/virt 区分
| drivers/virt |
virt/ |
| ACRN、SEV guest、EFI secret |
KVM 公共层 |
独立菜单 Device Drivers → Virtualization drivers |
由 arch/*/kvm/Kconfig source |
8. 快速定位
| 问题 |
查看 |
| VM 创建失败 |
kvm_create_vm, kvm_arch_init_vm |
| 内存迁移脏页 |
dirty_ring.c 或 legacy dirty log ioctl |
| 中断注入 |
kvm_set_irq, arch vgic |
| 直通 GPU/NIC |
vfio.c + drivers/vfio |
| ARM VM 不启动 |
arch/arm64/kvm/hyp, handle_exit.c |
正在加载留言…