VT开启前的检测与开启
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
VT开启前的检测与开启
该部分代码位于:VtCode2 中。
一、VT开启前的检测工作
1)2.2.3 检测CPU是否支持VT:
1> 使用CPUID指令(Intel手册卷2查看该指令):CPUID指令01号功能,返回在ECX的第五位表示VMX,如果VMX=1,则表示CPU已经开启VT功能。
2> 因此使用如代码判断CPU是否支持VT功能。
2)2.3.2.1 IA32_FEATURE_CONTROL寄存器
1> 在MSR中的地址:3AH(Intel手册卷3 23.3 VMX operation中)
2> windbg: rdmsr 3a 显示其为 05h, 101b,第一位lock位锁住,第三位在SMX模式之外执行VMXON(上面Intel手册下面介绍的就是这个)。
3> 因此借助 第3位来监测主板是否开启VT
3)2.3.2.2 CR0与CR4固定位
1> CR0有些位需要进行设置(操作系统已经帮我们设置好了)。
2> CR4寄存器需要开启VMXE位/13位。(Intel手册卷3 2.5 控制寄存器)
虽然说了很多,但本质上讲该位置为1,判断也是如此,因此我们使用如下代码判断VT是否开启。
二、VMXON区域初始化 2.3.3
在Intel卷3 31.5 VMM SetUp 中介绍了VMXON开始需要一块非分页内存,并且记录好其物理地址。
1)我们对每一个核申请一个单独的VMX入口。(注意,这个结构我们日后随着学习的深入会继续补充)
1> VMX入口数据结构
2> 全局变量对每个核定义一个入口(最多128核)
2)VMXOnArea 存放VMCSID的值(参考2.3.3章节说明),然后我们直接来读取smr来赋值。
3)不同核虽然入口不同,但其共同使用一个VMM区域,因此在不同核处理时,其申请同一个内存且赋上物理地址(猜测!!!不负责!!!!!)
书上说明:
实际在每个核中对申请内存的操作:
4)我们设置前面说的CR4的VMXE位/13位,设置好,之后我们也是通过这个位来监测VT是否开启。
之后调用微软提供的IntelApi __vmx_on(),来开启VMXON,如果开启成功则返回零(详情查看msdn),如果开启不成功,则直接释放内存。