- KVM模块
- KVM模块是KVM虚拟机的核心,主要功能是初始化CPU硬件,打开虚拟化模式,将虚拟客户机运行在虚拟机模式下,并对其运行提供一定的支持
- KVM在Intel的CPU运行为例
内核被加载时,KVM模块会先初始化内部的数据结构
准备完成后,KVM模块检测系统当前的CPU,打开CPU控制寄存器CR4中的虚拟化模式开关,并通过执行VMXON指令将宿主机操作系统(含KVM模块本身)置于虚拟化模式中的根模式
KVM模块创建特殊设备文件/dev/kvm并等待来自用户空间的命令
用户空间的应用程序QEMU和KVM模块相互配合,进行虚拟机的创建和运行 - 2中的虚拟机创建,可以理解为KVM为某个特定的虚拟客户机(用户空间程序创建并初始化)创建对应的内核数据结构。同时KVM还会返回一个文件句柄来代表创建的虚拟机。针对文件句柄的IOCTL调用对虚拟机做相应的管理
- KVM模块与用户空间QEMU的通信接口主要是一系列针对特殊设备文件的IOCTL调用
- 针对虚拟处理器最重要的IOCTL调用是“执行虚拟处理器”,用户空间准备好的虚拟机在KVM模块的支持下,被置于虚拟化模式的非根模式下,开始执行二进制指令。非根模式下,所有敏感的二进制指令都会被处理器捕捉到,处理器在保存后自动切换到根模式,有KVM决定下一步处理
- 内存的虚拟化也是由KVM模块实现的
KVM/QEMU的内存管理
因为KVM/QEMU在linux中作为一个进程运行,所以分配内存调用malloc()和mmap()函数。当虚拟机申请1GB的物理内存时,KVM/QEMU执行malloc(1<<30),从宿主机上分配1GB虚