kernel-2.6-KVM内核模块源码分析

  • KVM基于内核的虚拟机 在2007年2月被导入Linux 2.6.20核心中。散步内核不同顶层目录下
    • 主要包括两个目录:virt和arch/x86/kvm
      • virt包含内核中非硬件体系架构相关的部分如IOMMU、中断控制等
      • arch/x86很明显arch就是跟体系相关。KVM不单单支持x86,还支持PowerPC、MIPS等
  • 在此之前都是单模块,以色列开发人员搞得,就是个内核模块单目录

早期源码获取-不建议

下载目录:https://sourceforge.net/projects/kvm/files/?source=navbar

1532478632446.png

这里要分清不同目录

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

获取kvm目录中最早期的源码

1532479038159.png

这时候还是单模块+补丁的形式打进内核。最原始的源码,这,只能说我能找到的最原始的源码了。早期包含的源码很少,明显可以看到。找原始内核版本编译一下试试。

  1. root@ubuntu16x64:~/github/learn-kvm/src/2006-11-02# tree
  2. .
  3. ├── kvm-module
  4. ├── debug.c
  5. ├── debug.h
  6. ├── include
  7. └── linux
  8. └── kvm.h
  9. ├── Kbuild
  10. ├── kvm.h
  11. ├── kvm-kmod.spec
  12. ├── kvm_main.c
  13. ├── Makefile
  14. ├── mmu.c
  15. ├── paging_tmpl.h
  16. ├── vmx.h
  17. ├── x86_emulate.c
  18. └── x86_emulate.h
  19. ├── kvm-module-1.tar.gz
  20. ├── libkvm
  21. ├── bootstrap.lds
  22. ├── emulator
  23. ├── flat.lds
  24. ├── kvmctl.c
  25. ├── kvmctl.h
  26. ├── main.c
  27. ├── Makefile
  28. └── test
  29. ├── bootstrap.S
  30. ├── cstart64.S
  31. ├── cstart.S
  32. ├── irq.S
  33. ├── memtest1.S
  34. ├── print.h
  35. ├── print.S
  36. ├── sieve.c
  37. ├── simple.S
  38. ├── stringio.S
  39. ├── vm.c
  40. └── vm.h
  41. ├── libkvm-1.tar.gz
  42. └── qemu-kvm-1.patch
  43. 6 directories, 34 files

1532479279694.png

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

1532479916852.png

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

1532479953247.png

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

1532483071789.png

  • 很尴尬,老版本无法编译。可能当时源码本身不完善吧。需要点技术支持。抛弃,直接上2.6.30。

找个差不多的版本就可以编译成功

1532480355432.png

1532483358083.png

  • 这里踩坑,其实直接从linux 2.6.20源码中获取kvm相关目录就行了,没必要分开,但是如果要研究早期的kvm源码,就得是单独得了

2.6.20内核源码获取

  1. git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git -b linux-2.6.20.y

下载完成后可以看到所有分支以及当前所处分支,学好git至关重要

  1. root@ubuntu16x64:~/kernel/linux-stable# git branch -a
  2. * linux-2.6.20.y
  3. linux-4.2.y
  4. remotes/origin/HEAD -> origin/master
  5. remotes/origin/linux-2.6.11.y
  6. remotes/origin/linux-2.6.12.y
  7. remotes/origin/linux-2.6.13.y
  8. remotes/origin/linux-2.6.14.y
  9. remotes/origin/linux-2.6.15.y
  10. remotes/origin/linux-2.6.16.y
  11. remotes/origin/linux-2.6.17.y
  12. remotes/origin/linux-2.6.18.y
  13. remotes/origin/linux-2.6.19.y
  14. remotes/origin/linux-2.6.20.y
  15. remotes/origin/linux-2.6.21.y
  16. remotes/origin/linux-2.6.22.y
  17. remotes/origin/linux-2.6.23.y
  18. remotes/origin/linux-2.6.24.y
  19. remotes/origin/linux-2.6.25.y
  20. remotes/origin/linux-2.6.26.y
  21. remotes/origin/linux-2.6.27.y
  22. remotes/origin/linux-2.6.28.y
  23. remotes/origin/linux-2.6.29.y
  24. remotes/origin/linux-2.6.30.y
  25. remotes/origin/linux-2.6.31.y
  26. remotes/origin/linux-2.6.32.y
  27. remotes/origin/linux-2.6.33.y
  28. remotes/origin/linux-2.6.34.y
  29. remotes/origin/linux-2.6.35.y
  30. remotes/origin/linux-2.6.36.y
  31. remotes/origin/linux-2.6.37.y
  32. remotes/origin/linux-2.6.38.y
  33. remotes/origin/linux-2.6.39.y
  34. remotes/origin/linux-3.0.y
  35. remotes/origin/linux-3.1.y
  36. remotes/origin/linux-3.10.y
  37. remotes/origin/linux-3.11.y
  38. remotes/origin/linux-3.12.y
  39. remotes/origin/linux-3.13.y
  40. remotes/origin/linux-3.14.y
  41. remotes/origin/linux-3.15.y
  42. remotes/origin/linux-3.16.y
  43. remotes/origin/linux-3.17.y
  44. remotes/origin/linux-3.18.y
  45. remotes/origin/linux-3.19.y
  46. remotes/origin/linux-3.2.y
  47. remotes/origin/linux-3.3.y
  48. remotes/origin/linux-3.4.y
  49. remotes/origin/linux-3.5.y
  50. remotes/origin/linux-3.6.y
  51. remotes/origin/linux-3.7.y
  52. remotes/origin/linux-3.8.y
  53. remotes/origin/linux-3.9.y
  54. remotes/origin/linux-4.0.y
  55. remotes/origin/linux-4.1.y
  56. remotes/origin/linux-4.10.y
  57. remotes/origin/linux-4.11.y
  58. remotes/origin/linux-4.12.y
  59. remotes/origin/linux-4.13.y
  60. remotes/origin/linux-4.14.y
  61. remotes/origin/linux-4.15.y
  62. remotes/origin/linux-4.16.y
  63. remotes/origin/linux-4.17.y
  64. remotes/origin/linux-4.2.y
  65. remotes/origin/linux-4.3.y
  66. remotes/origin/linux-4.4.y
  67. remotes/origin/linux-4.5.y
  68. remotes/origin/linux-4.6.y
  69. remotes/origin/linux-4.7.y
  70. remotes/origin/linux-4.8.y
  71. remotes/origin/linux-4.9.y
  72. remotes/origin/master

源码目录

  • virt/kvm目录
    • kvm独立于平台处理器体系,提供了一些公用的方法和公用的数据结构
  • arch/x86/kvm目录
    • kvm主要目录,头文件+代码+intel模块+amd模块
  • include/linux目录
    • kvm参数定义
  • arch/x86/include/asm/kvm目录
    • 宏定义,全局变量
  1. root@ubuntu16x64:~/kernel/linux-stable# ll virt/kvm/
  2. 总用量 168K
  3. drwxr-xr-x 3 root root 4.0K 8 13 11:02 ./
  4. drwxr-xr-x 3 root root 4.0K 8 13 11:02 ../
  5. drwxr-xr-x 2 root root 4.0K 8 13 11:02 arm/
  6. -rw-r--r-- 1 root root 5.4K 8 13 11:02 async_pf.c
  7. -rw-r--r-- 1 root root 1.1K 8 13 11:02 async_pf.h
  8. -rw-r--r-- 1 root root 4.2K 8 13 11:02 coalesced_mmio.c
  9. -rw-r--r-- 1 root root 875 8 13 11:02 coalesced_mmio.h
  10. -rw-r--r-- 1 root root 23K 8 13 11:02 eventfd.c
  11. -rw-r--r-- 1 root root 5.8K 8 13 11:02 irqchip.c
  12. -rw-r--r-- 1 root root 734 8 13 11:02 Kconfig
  13. -rw-r--r-- 1 root root 82K 8 13 11:02 kvm_main.c
  14. -rw-r--r-- 1 root root 6.2K 8 13 11:02 vfio.c
  15. -rw-r--r-- 1 root root 250 8 13 11:02 vfio.h
  1. root@ubuntu16x64:~/kernel/linux-stable# ls arch/x86/kvm
  2. . 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
  3. .. cpuid.c i8254.c ioapic.c irq.c Kconfig lapic.h mmu.c mtrr.c pmu.c svm.c vmx.c
  4. assigned-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
  1. root@ubuntu16x64:~/kernel/linux-stable# ll include/linux/kvm*
  2. -rw-r--r-- 1 root root 32K 8 13 11:02 include/linux/kvm_host.h
  3. -rw-r--r-- 1 root root 260 8 13 11:02 include/linux/kvm_para.h
  4. -rw-r--r-- 1 root root 1.6K 8 13 11:02 include/linux/kvm_types.h
  1. root@ubuntu16x64:~/kernel/linux-stable# ll arch/x86/include/asm/kvm*
  2. -rw-r--r-- 1 root root 15K 8 13 11:02 arch/x86/include/asm/kvm_emulate.h
  3. -rw-r--r-- 1 root root 133 8 13 11:02 arch/x86/include/asm/kvm_guest.h
  4. -rw-r--r-- 1 root root 35K 8 13 11:02 arch/x86/include/asm/kvm_host.h
  5. -rw-r--r-- 1 root root 3.3K 8 13 11:02 arch/x86/include/asm/kvm_para.h

Makefile分析

1534146781196.png

  1. ccflags-y += -Iarch/x86/kvm
  2. CFLAGS_x86.o := -I.
  3. CFLAGS_svm.o := -I.
  4. CFLAGS_vmx.o := -I.
  5. KVM := ../../../virt/kvm
  6. kvm-y += $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o \
  7. $(KVM)/eventfd.o $(KVM)/irqchip.o $(KVM)/vfio.o
  8. kvm-$(CONFIG_KVM_ASYNC_PF) += $(KVM)/async_pf.o
  9. kvm-y += x86.o mmu.o emulate.o i8259.o irq.o lapic.o \
  10. i8254.o ioapic.o irq_comm.o cpuid.o pmu.o mtrr.o
  11. kvm-$(CONFIG_KVM_DEVICE_ASSIGNMENT) += assigned-dev.o iommu.o
  12. kvm-intel-y += vmx.o pmu_intel.o
  13. kvm-amd-y += svm.o pmu_amd.o
  14. obj-$(CONFIG_KVM) += kvm.o
  15. obj-$(CONFIG_KVM_INTEL) += kvm-intel.o
  16. obj-$(CONFIG_KVM_AMD) += kvm-amd.o

END