VT开启前的检测与开启

Posted onetrainee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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),如果开启不成功,则直接释放内存。

      技术图片

 

 

以上是关于VT开启前的检测与开启的主要内容,如果未能解决你的问题,请参考以下文章

请问如何开启HT???我开启后进不了系统!

系统在没有开启Hyper-v时通过检测工具检测到的是cpu支持虚拟化,但是在开启并安装后检测到的就不支持了。

VT在BIOS内已开启,但CPU-v显示未开启

联想l460怎么开启vt???

WSL2 BIOS已经开启了VT-x 但windows内安装显示不支持

在虚拟机中开启VT功能