KVM 的 VMM 代码包括内核代码和用户空间代码两部分。 内核代码即 kvm.ko 模块的代码,分布在内核源码的 virt/kvm 和 arch/x86/kvm 两个目录下,前者是和硬件结构无关的代码,后者是和硬件结构相关的代码,其中和 AMD-V 相关的代码由 arch/x86/kvm/svm.c 文件提供。KVM 内核空间代码实现的功能包括如下几个方面 : - 实现硬件辅助的虚拟化的核心功能。包括实现“guest”模式及模式切换,虚拟 CPU 的状态和控制,指令仿真等所有之前提到的 x86 虚拟化所要解决的问题。代码分布在 arch/x86/kvm 下 x86.c, svm.c, emulate.c 等文件中。
- 提供用户空间对KVM控制。实现/dev/kvm字符设备接口用于qemu-kvm 对 KVM 的控制,包括创建虚拟机,创建虚拟 CPU,创建虚拟机内存空间,运行虚拟机等功能的 ioctl() 接口,其实现的 ioctl() 功能主要分成二类,针对单个虚拟机整体的功能和针对单个虚拟 CPU 的功能。相关代码分布在 kvm_main.c, x86.c,svm.c 等文件中。
- 对x86平台设备进行仿真。包括仿真 PIC,IOAPIC,Local APIC 及PIT 的代码。
- 实现IO Port空间和MMIO空间的仿真。这是实现平台设备和外部设备仿真所需要的基础功能。代码分布在 coalesced_mmio.c, iodev.h, emulate.c, x86.c 及svm.c 等文件中。
- 实现基于文件描述符的通知机制。代码在 eventfd.c 文件中。 其中 ioeventfd 机制用于内核空间仿真 PIO 后向用户空间发送通知, irqfd 机制用于 qemu-kvm 进程向虚拟机注入中断。
- MMU虚拟化的支持。包括shadow页表的实现,TLB的虚拟化。主要代码在 mmu.c 文件中。
- 和PCI-Passthrough相关的功能。代码分布在 kvm_main.c 和 iommu.c 中。当然对物理 IOMMU 单元的管理还需要 Linux内核IOMMU设备抽象层的代码及厂家IOMMU驱动的代码,分别分布在driver/base/iommu.c及 arch/x86/kernel/ 下的 amd_iommu.c 和 amd_iommu_init.c 文件中。 对 IOMMU 的支持是独立于 KVM 的,它也可以被用于非系统虚拟化的情景。
|