kernel-2.6-KVM内核模块源码分析
- KVM基于内核的虚拟机 在2007年2月被导入Linux 2.6.20核心中。散步内核不同顶层目录下
- 主要包括两个目录:virt和arch/x86/kvm
- virt包含内核中非硬件体系架构相关的部分如IOMMU、中断控制等
- arch/x86很明显arch就是跟体系相关。KVM不单单支持x86,还支持PowerPC、MIPS等
- 主要包括两个目录:virt和arch/x86/kvm
- 在此之前都是单模块,以色列开发人员搞得,就是个内核模块单目录
早期源码获取-不建议
下载目录:https://sourceforge.net/projects/kvm/files/?source=navbar

这里要分清不同目录
- kvm-kmod里面存放不同内核版本的kvm功能模块,仅包含kvm功能模块,不包含其它内核内容
- qemu-kvm其实就是支持kvm的改版qemu
- kvm是更早之前,没有加入内核模块的kvm,单独的内核模块和qemu-kvm补丁
- 剩下的两个是客户端驱动,半虚拟化用到
获取kvm目录中最早期的源码

这时候还是单模块+补丁的形式打进内核。最原始的源码,这,只能说我能找到的最原始的源码了。早期包含的源码很少,明显可以看到。找原始内核版本编译一下试试。
root@ubuntu16x64:~/github/learn-kvm/src/2006-11-02# tree.├── kvm-module│ ├── debug.c│ ├── debug.h│ ├── include│ │ └── linux│ │ └── kvm.h│ ├── Kbuild│ ├── kvm.h│ ├── kvm-kmod.spec│ ├── kvm_main.c│ ├── Makefile│ ├── mmu.c│ ├── paging_tmpl.h│ ├── vmx.h│ ├── x86_emulate.c│ └── x86_emulate.h├── kvm-module-1.tar.gz├── libkvm│ ├── bootstrap.lds│ ├── emulator│ ├── flat.lds│ ├── kvmctl.c│ ├── kvmctl.h│ ├── main.c│ ├── Makefile│ └── test│ ├── bootstrap.S│ ├── cstart64.S│ ├── cstart.S│ ├── irq.S│ ├── memtest1.S│ ├── print.h│ ├── print.S│ ├── sieve.c│ ├── simple.S│ ├── stringio.S│ ├── vm.c│ └── vm.h├── libkvm-1.tar.gz└── qemu-kvm-1.patch6 directories, 34 files

- 用最新的内核编译报错,这,用哪个内核版本合适呢?2006年Linux版本多少?

- 根据Makefile中的rpm判断应该是红帽系列,找个2006年的红帽子

http://mirror.nsc.liu.se/centos-store/4.4/isos/i386/

- 很尴尬,老版本无法编译。可能当时源码本身不完善吧。需要点技术支持。抛弃,直接上2.6.30。
找个差不多的版本就可以编译成功


- 这里踩坑,其实直接从linux 2.6.20源码中获取kvm相关目录就行了,没必要分开,但是如果要研究早期的kvm源码,就得是单独得了
2.6.20内核源码获取
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git -b linux-2.6.20.y
下载完成后可以看到所有分支以及当前所处分支,学好git至关重要
root@ubuntu16x64:~/kernel/linux-stable# git branch -a* linux-2.6.20.ylinux-4.2.yremotes/origin/HEAD -> origin/masterremotes/origin/linux-2.6.11.yremotes/origin/linux-2.6.12.yremotes/origin/linux-2.6.13.yremotes/origin/linux-2.6.14.yremotes/origin/linux-2.6.15.yremotes/origin/linux-2.6.16.yremotes/origin/linux-2.6.17.yremotes/origin/linux-2.6.18.yremotes/origin/linux-2.6.19.yremotes/origin/linux-2.6.20.yremotes/origin/linux-2.6.21.yremotes/origin/linux-2.6.22.yremotes/origin/linux-2.6.23.yremotes/origin/linux-2.6.24.yremotes/origin/linux-2.6.25.yremotes/origin/linux-2.6.26.yremotes/origin/linux-2.6.27.yremotes/origin/linux-2.6.28.yremotes/origin/linux-2.6.29.yremotes/origin/linux-2.6.30.yremotes/origin/linux-2.6.31.yremotes/origin/linux-2.6.32.yremotes/origin/linux-2.6.33.yremotes/origin/linux-2.6.34.yremotes/origin/linux-2.6.35.yremotes/origin/linux-2.6.36.yremotes/origin/linux-2.6.37.yremotes/origin/linux-2.6.38.yremotes/origin/linux-2.6.39.yremotes/origin/linux-3.0.yremotes/origin/linux-3.1.yremotes/origin/linux-3.10.yremotes/origin/linux-3.11.yremotes/origin/linux-3.12.yremotes/origin/linux-3.13.yremotes/origin/linux-3.14.yremotes/origin/linux-3.15.yremotes/origin/linux-3.16.yremotes/origin/linux-3.17.yremotes/origin/linux-3.18.yremotes/origin/linux-3.19.yremotes/origin/linux-3.2.yremotes/origin/linux-3.3.yremotes/origin/linux-3.4.yremotes/origin/linux-3.5.yremotes/origin/linux-3.6.yremotes/origin/linux-3.7.yremotes/origin/linux-3.8.yremotes/origin/linux-3.9.yremotes/origin/linux-4.0.yremotes/origin/linux-4.1.yremotes/origin/linux-4.10.yremotes/origin/linux-4.11.yremotes/origin/linux-4.12.yremotes/origin/linux-4.13.yremotes/origin/linux-4.14.yremotes/origin/linux-4.15.yremotes/origin/linux-4.16.yremotes/origin/linux-4.17.yremotes/origin/linux-4.2.yremotes/origin/linux-4.3.yremotes/origin/linux-4.4.yremotes/origin/linux-4.5.yremotes/origin/linux-4.6.yremotes/origin/linux-4.7.yremotes/origin/linux-4.8.yremotes/origin/linux-4.9.yremotes/origin/master
源码目录
- virt/kvm目录
- kvm独立于平台处理器体系,提供了一些公用的方法和公用的数据结构
- arch/x86/kvm目录
- kvm主要目录,头文件+代码+intel模块+amd模块
- include/linux目录
- kvm参数定义
- arch/x86/include/asm/kvm目录
- 宏定义,全局变量
root@ubuntu16x64:~/kernel/linux-stable# ll virt/kvm/总用量 168Kdrwxr-xr-x 3 root root 4.0K 8月 13 11:02 ./drwxr-xr-x 3 root root 4.0K 8月 13 11:02 ../drwxr-xr-x 2 root root 4.0K 8月 13 11:02 arm/-rw-r--r-- 1 root root 5.4K 8月 13 11:02 async_pf.c-rw-r--r-- 1 root root 1.1K 8月 13 11:02 async_pf.h-rw-r--r-- 1 root root 4.2K 8月 13 11:02 coalesced_mmio.c-rw-r--r-- 1 root root 875 8月 13 11:02 coalesced_mmio.h-rw-r--r-- 1 root root 23K 8月 13 11:02 eventfd.c-rw-r--r-- 1 root root 5.8K 8月 13 11:02 irqchip.c-rw-r--r-- 1 root root 734 8月 13 11:02 Kconfig-rw-r--r-- 1 root root 82K 8月 13 11:02 kvm_main.c-rw-r--r-- 1 root root 6.2K 8月 13 11:02 vfio.c-rw-r--r-- 1 root root 250 8月 13 11:02 vfio.h
root@ubuntu16x64:~/kernel/linux-stable# ls arch/x86/kvm. assigned-dev.h emulate.c i8259.c iommu.c irq.h lapic.c mmu_audit.c mmutrace.h pmu_amd.c pmu_intel.c tss.h x86.h.. cpuid.c i8254.c ioapic.c irq.c Kconfig lapic.h mmu.c mtrr.c pmu.c svm.c vmx.cassigned-dev.c cpuid.h i8254.h ioapic.h irq_comm.c kvm_cache_regs.h Makefile mmu.h paging_tmpl.h pmu.h trace.h x86.c
root@ubuntu16x64:~/kernel/linux-stable# ll include/linux/kvm*-rw-r--r-- 1 root root 32K 8月 13 11:02 include/linux/kvm_host.h-rw-r--r-- 1 root root 260 8月 13 11:02 include/linux/kvm_para.h-rw-r--r-- 1 root root 1.6K 8月 13 11:02 include/linux/kvm_types.h
root@ubuntu16x64:~/kernel/linux-stable# ll arch/x86/include/asm/kvm*-rw-r--r-- 1 root root 15K 8月 13 11:02 arch/x86/include/asm/kvm_emulate.h-rw-r--r-- 1 root root 133 8月 13 11:02 arch/x86/include/asm/kvm_guest.h-rw-r--r-- 1 root root 35K 8月 13 11:02 arch/x86/include/asm/kvm_host.h-rw-r--r-- 1 root root 3.3K 8月 13 11:02 arch/x86/include/asm/kvm_para.h
Makefile分析

ccflags-y += -Iarch/x86/kvmCFLAGS_x86.o := -I.CFLAGS_svm.o := -I.CFLAGS_vmx.o := -I.KVM := ../../../virt/kvmkvm-y += $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o \$(KVM)/eventfd.o $(KVM)/irqchip.o $(KVM)/vfio.okvm-$(CONFIG_KVM_ASYNC_PF) += $(KVM)/async_pf.okvm-y += x86.o mmu.o emulate.o i8259.o irq.o lapic.o \i8254.o ioapic.o irq_comm.o cpuid.o pmu.o mtrr.okvm-$(CONFIG_KVM_DEVICE_ASSIGNMENT) += assigned-dev.o iommu.okvm-intel-y += vmx.o pmu_intel.okvm-amd-y += svm.o pmu_amd.oobj-$(CONFIG_KVM) += kvm.oobj-$(CONFIG_KVM_INTEL) += kvm-intel.oobj-$(CONFIG_KVM_AMD) += kvm-amd.o
