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

          

     

  • 相关阅读:
    JVM如何执行方法调用
    JVM如何实现反射
    JVM是如何处理异常的
    Java类加载
    windows-Kafka安装
    Google Eventbus简单使用
    队列c#版
    python 元类

    Spring Mvc 笔记二之异常和文件上传
  • 原文地址:https://www.cnblogs.com/onetrainee/p/12121100.html
Copyright © 2020-2023  润新知