KVM模块是KVM虚拟机的核心部分。主要功能:初始化cpu硬件,打开虚拟化模式,将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。
KVM的初始化过程:
KVM是基于硬件的虚拟化,cpu必须支持VT。当KVM模块被加载时,KVM模块会先初始化内部数据结构;
(KVM的内核部分是作为可动态加载内核模块运行在宿主机中的,其中一个模块是和平台无关的实现虚拟化核心基础架构的KVM模块,另一个是硬件平台相关的kvm_intel模块。)
KVM检测当前系统的cpu,确保cpu支持虚拟化;
打开CPU控制寄存器CR4中的虚拟化模式开关,并通过执行VMXON指令将宿主机操作系统置于虚拟化模式中的根模式;
KVM模块创建特殊设备文件/dev/kvm 并等待来自用户空间的命令。
之前说过,KVM不负责任何模拟的过程,接下来创建和运行将是一个用户空间的程序(QEMU)和KVM模块互相配合的过程。
KVM与QEMU通过暴露在用户空间的/dev/kvm设备交互,通过ioctl调用。
创建虚拟机的过程可以理解为KVM为了某个特定的虚拟客户机(用户空间程序创建并初始化)创建对应的内核数据结构。同时返回一个文件句柄表示创建完成的虚拟机。
针对返回的句柄,就可以继续通过ioctl对其操作和管理:创建用户空间虚拟地址和客户机物理地址及真是内存物理地址的映射关系;创建vCPU(以句柄的形式返回,再对其使用ioctl调用,就可以对虚拟机的vcpu进行管理了)。
虚拟机的运行:
用户空间准备好的虚拟机在KVM模块的支持下,内置于虚拟化模式中的非根模式下,开始执行二进制指令。
在非根模式下,所有敏感的二进制指令都会被处理器捕捉到,处理器在保存现场之后自动切换到根模式下,由KVM决定如何进一步处理(有KVM模块直接处理,或返回用户空间由qemu处理)。
如果想了解简单的原理实现可以看下====>让KVM飞——初识
本章关于内存和设备的虚拟化将整理扩展单贴到KVM分类。
下一章中主要讲述的是《构建KVM环境》,暂不介绍,感兴趣的可以买本书仔细阅读下。