概述
kvm模块,kvm在加载之初,只存在/dev/kvm文件。
针对虚拟处理器最重要的IOCTL调用。
内存虚拟化也是KVM模块实现,并且是一个虚拟机中代码量最大,实现最复杂的部分。
处理器中的MMU通过页表形式将程序运行的虚拟地址转换成物理地址,在虚拟机模式下,内存管理单元的页表必须在一次查询完成两次转换,KVM 模块使用了影子页表技术解决该问题。
官网代码:
kvm核心代码:
下载:git clone git://git.kernel.org/pub/scm/virt/kvm/kvm.git
分为三部分:KVM框架的核心源代码,与硬件架构相关的代码,kvm头文件。
kvm代码的核心代码:
virt/kvm/中的代码,是与架构无关的代码,有7309行,kvm_main.c是代码中最核心的文件之一,其中的kvm_init()函数是与硬件无关的kvm初始化入口。
与硬件结构相关的代码:
位于
arch/*/kvm目录下。[root@localhost kvm]# ls -d arch/*/kvm
arch/arm64/kvm arch/mips/kvm arch/s390/kvm arch/x86/kvm
arch/arm/kvm arch/powerpc/kvm arch/tile/kvm
在kvm支持的架构中,
x86架构相关代码位于:arch/x86/kvm/目录下,有37067行代码,
assigned-dev.c hyperv.h iommu.c lapic.c mmutrace.h pmu.h x86.c
assigned-dev.h i8254.c irq.c lapic.h mtrr.c pmu_intel.c x86.h
cpuid.c i8254.h irq_comm.c Makefile page_track.c svm.c
cpuid.h i8259.c irq.h mmu_audit.c paging_tmpl.h trace.h
emulate.c ioapic.c Kconfig mmu.c pmu_amd.c tss.h
hyperv.c ioapic.h kvm_cache_regs.h mmu.h pmu.c vmx.c
vmx.c和svm.c分别是intel和AMD CPU架构相关模块kvm-intel和kvm-amd主要代码,vmx_init()是初始化函数。
kvm相关头文件:
目录为:ls -d arch/*/include/asm/kvm*
arch/arm64/include/asm/kvm_arm.h arch/powerpc/include/asm/kvm_asm.h
arch/arm64/include/asm/kvm_asm.h arch/powerpc/include/asm/kvm_book3s_32.h
arch/arm64/include/asm/kvm_coproc.h arch/powerpc/include/asm/kvm_book3s_64.h
arch/arm64/include/asm/kvm_emulate.h arch/powerpc/include/asm/kvm_book3s_asm.h
arch/arm64/include/asm/kvm_host.h arch/powerpc/include/asm/kvm_book3s.h
arch/arm64/include/asm/kvm_hyp.h arch/powerpc/include/asm/kvm_booke.h
arch/arm64/include/asm/kvm_mmio.h arch/powerpc/include/asm/kvm_booke_hv_asm.h
arch/arm64/include/asm/kvm_mmu.h arch/powerpc/include/asm/kvm_fpu.h
arch/arm64/include/asm/kvm_psci.h arch/powerpc/include/asm/kvm_host.h
arch/arm/include/asm/kvm_arm.h arch/powerpc/include/asm/kvm_para.h
arch/arm/include/asm/kvm_asm.h arch/powerpc/include/asm/kvm_ppc.h
arch/arm/include/asm/kvm_coproc.h arch/s390/include/asm/kvm_host.h
arch/arm/include/asm/kvm_emulate.h arch/s390/include/asm/kvm_para.h
arch/arm/include/asm/kvm_host.h arch/um/include/asm/kvm_para.h
arch/arm/include/asm/kvm_hyp.h arch/x86/include/asm/kvm_emulate.h
arch/arm/include/asm/kvm_mmio.h arch/x86/include/asm/kvm_guest.h
arch/arm/include/asm/kvm_mmu.h arch/x86/include/asm/kvm_host.h
arch/arm/include/asm/kvm_psci.h arch/x86/include/asm/kvm_page_track.h
arch/mips/include/asm/kvm_host.h arch/x86/include/asm/kvm_para.h
arch/mips/include/asm/kvm_para.h
Linux内核代码仓库中还有一些关
于kvm的文档,主要位于
Documentation/virtual/kvm/
Documentation/*/kvm*
详细介绍:
(1.)include\kvm\中有2个文件:代码总共行数:4957
Arm_arch_timer.h:KVM定时器相关的函数 代码行数:103
Arm_vgic.h:虚拟通用中断控制器相关的数据结构和函数 代码行数:314
一些跟踪事件函数的声明
其中一段代码:
#define kvm_trace_exit_reason \
ERSN(UNKNOWN), ERSN(EXCEPTION), ERSN(IO), ERSN(HYPERCALL), \
ERSN(DEBUG), ERSN(HLT), ERSN(MMIO), ERSN(IRQ_WINDOW_OPEN), \
ERSN(SHUTDOWN), ERSN(FAIL_ENTRY), ERSN(INTR), ERSN(SET_TPR), \
ERSN(TPR_ACCESS), ERSN(S390_SIEIC), ERSN(S390_RESET), ERSN(DCR),