接前一篇文章:
本文内容参考:
《 QEMU /KVM》 源码 解析与应用 —— 李强,机械工业出版社
《深度探索 Linux 系统 虚拟化 原理与实现》—— 王柏生 谢广军, 机械工业出版社
特此致谢!
三、KVM模块初始化介绍
2. KVM模块初始化
KVM模块的初始化主要包括初始化CPU与架构无关的数据、以及设置与架构相关的虚拟化支持。以Intel CPU为例,Intel Software Developer Manuals(Intel SDM)31.5列出了开启和关闭VMM的步骤。VMM只有在CPU处于保护模式并且开启分页时,才能进入VMX模式。下面简单总结一下开启VMX模式需要做的事情。
1) 使用CPUID检测CPU是否支持VM X。如果CPUID.1:ECX.VMX[bit 5] = 1,则表示CPU支持VMX。
2) 检测CPU支持的VMX的能力 ,这是通过读取与VMX能力相关的MSR寄存器完成的。典型的寄存器包括表示基本VMX能力信息的IA32 VMX BASIC、以及表明VMCS区域中VM-execution相关域能够设置值的IA32_VMX_PINBASED_CTLS和IA32_VMX_PROCBASD_CTLS。
3) 分配一段4KB对齐的内存作为VMXON区域 ,其大小是通过读取IA32_VMX_BASICMSR寄存器得到的。
4) 初始化VMXON区域的版本标识 。这个标识也是通过MSR寄存器报告的。
5) 确保当前CPU运行模式的CR0寄存器符合进入VMX的条件 。如CR0.PE=1、CR0.PG=1,其它需要满足的设置通过IA32_VMX_CR0_FIXED0和IA32_VMX_CR0_FIXED1寄存器报告。
6) 通过设置CR4.VMXE为1来开启VMX模式 。其它CR4需要满足的设置,通过IA32_VMX_CR4_FIXED0和IA32_VMX_CR4_FIXED1寄存器报告。
7) 确保IA32_FEATURE_CONTROL寄存器被正确设置 。其锁定位(位0)为1,这个MSR寄存器通常由BIOS编程。
8) 使用VMXON区域的物理地址作为操作数调用VMXON指令 。指令完成后,如果RFLAGS.CF=0,则表示VMXON指令执行成功。
进入VMX模式之后,在VMX root的CPL=0时执行VMXOFF,RFLAGS.CF和RFLAGS.ZF均为0则表示CPU关闭了VMX模式。
更多内容请看下回。