zoukankan      html  css  js  c++  java
  • 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),如果开启不成功,则直接释放内存。

          

     

  • 相关阅读:
    Java JMX 监管
    Spring Boot REST(一)核心接口
    JSR 规范目录
    【平衡树】宠物收养所 HNOI 2004
    【树型DP】叶子的颜色 OUROJ 1698
    【匈牙利匹配】无题II HDU2236
    【贪心】Communication System POJ 1018
    【贪心】Moving Tables POJ 1083
    Calling Extraterrestrial Intelligence Again POJ 1411
    【贪心】Allowance POJ 3040
  • 原文地址:https://www.cnblogs.com/onetrainee/p/12121100.html
Copyright © 2011-2022 走看看