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),如果开启不成功,则直接释放内存。

      

 

posted @ 2019-12-30 18:09  OneTrainee  阅读(2141)  评论(0编辑  收藏  举报