zoukankan      html  css  js  c++  java
  • 第10章:VT 技术(简单了解+EPT 机制)

    VMM:Virtual Machine Monitor,虚拟机监控器。也称为 “Hypervisior”,特权层(Ring -1),能够监控操作系统的各种行为。
    VMX:Virtual Machine Extension,虚拟机扩展。是 CPU 提供的一种功能。
    VMCS:Virtual-Machine Control Structure,虚拟机控制结构,一块内存区域。
    APIC:Advanced Programmable Interrupt Controller 高级可编程中断控制器,硬件设备
    MSR:Model Specific Register,一组64位寄存器,通过 RDMSRWRMSR 进行读写操作。命名以 IA32_ 为前缀,一系列用于
    控制 CPU 运行、功能开关、调试、跟踪程序执行、监测 CPU 性能等方面的寄存器

    CR0-CR3:控制寄存器。

    CR0:控制处理器操作模式和状态

    CR1:保留不用

    CR2:导致页面错误的线性地址

    CR3:页目录表物理内存基地址

    VMX 功能启用时,CPU 模式分为 Root 和 non-Root 模式。只有 VMM 可以使用 Root 模式, 操作系统使用 non-Root 模式。

    上图中 Guest 0 和 Guest 1 都是虚拟机,没有 VMXOFF指令,就一直处于 #VMExit 和 #VMEntry 的循环中。

    记住一点,所有的虚拟操作都是以真实机为主体进行的。

     创建一个典型的 VT 技术 HyperVisior 步骤:

    · 分配 VMXON 区域和 VMCS 控制块

    · 填写 VMCS 控制块,用于控制要监控什么特权指令等等一系列操作。

    · 调用 VMXLaunch 指令启动虚拟机

    · 当产生 VMExit 时间后调用 VMExitProc 函数处理

    要进入 VT ,需要打开 VMX 操作模式,即使用相关的指令。 

    开启:VMXON -> VMXClear -> VMPTRLD -> VMWrite -> VMLaunch

    关闭:VMXOFF

    VMXON:开启 VMX 模式,可以执行后续的虚拟化相关指令。
    VMXOFF:关闭 VMX 模式,后续虚拟化指令的执行都会失败。
    VMLAUNCH:启动 VMCS指向的虚拟机 Guest OS。
    VMRESUME:从 Hypervisor 中恢复虚拟机 Guest OS 的执行。
    VMPTRLD:激活一块 VMCS,修改处理器当前 VMCS 指针为传入的 VMCS 物理地址。
    VMCLEAR:使一块 VMCS 变为非激活状态,更新处理器当前 VMCS 指针为空。
    VMPTRST:将 VMCS 存储到指定位置。
    VMREAD:读取当前 VMCS 中的数据。
    VMWRITE:向当前 VMCS 中写入数据。
    VMCALL:Guest OS 和 Hypervisor 交互指令,Guest OS 会产生 #VMExit 而陷入 Hypervisor。
    INVEPT:使 TLB 中缓存的地址映射失效。
    INVVPID:使某个 VPID 所对应的地址映射失效。

     一个 VMCS 就代表一个虚拟操作系统,当 VMPTRLD 指令装载 VMCS 后,就不能直接使用内存操作函数了,而需要使用上面提到的函数。

    VMCS 是一个非常复杂的结构,只需要关注关键的参数即可。

    在产生 #VMExit 事件时,如果出现问题,系统会发生 VMX Abort 事件。对于一个已经激活的 VMCS,Abort 事件并不会导致 VMCS 数据区被修改。VMX 退出原因指示器会指出发生 VMX Abort 事件的原因,逻辑处理器也会因此进入关闭状态。

    VMCS 数据结构

    1.虚拟机状态域 Guest-State Fields

    #VMEntry 时,即虚拟操作系统运行时,从这个区域加载处理器状态信息。#VMExit 时,处理器状态信息保存在这个区域。

    这个区域包含了很多信息,比如各种寄存器,通用寄存器和其它类型的寄存器(MSR、GDTR.....)的部分域,处理器状态信息(处理器状态、可中断状态、VMCS 指针、PDPTE....)

    2.宿主机状态域 Host-State Fields

    #VMExit 时,处理器状态信息从该域加载,恢复 VMM 的执行。域中存储的所有信息都与寄存器相关。例如部分 MSR、段寄存器、IDTR、GDTR...

    3.虚拟机执行控制域 VM-Execution Control Fields

    可以设置各种退出条件,控制 processor 在虚拟机中的行为,哪些事件会导致 #VMExit,设置 I/O 访问、MSR 寄存器访问、CR3 事件、异常等等事件,一共26个字段。

    4. 虚拟机 VMEntry 控制域 VMEntry Control Fields

    包含两部分:VM-Entry Controls for MSRs 和 Event Injection(interruption-information field,exception error code,instruction length 都是 32 bit)

    规定了发生 #VMEntry 后的一系列操作,VMware 软件实现硬件虚拟化会用到。

    5.虚拟机 VMExit 控制域 VM-Exit Control Fields

    包含两部分:VM-Exit Controls For MSRs 和 VM-Exit Controls。前者指定哪些 MSRs 被存储和装载,后者指定 VM-Exit 后的操作。

    6.虚拟机VM-Exit 信息域 VM-Exit Information Fields

    只读区域。描述最近 VM-Exit 退出的详细原因。在某些情况下,还会有虚拟机的 Linear Address、Physical Address、Interruption Information、Interruption Error Code、IDT 向量化信息和错误码 

    EPT 机制

    这篇文章给了我莫大的启发:5. EPT机制_李海伟-CSDN博客

    上面的一部分是虚拟地址到物理地址的转化,下面一部分是 GPA 到 HPA 的转化。EPT 机制即是实现 GPA -> HPA 。GPA 和 HPA 都存储在内存上,只是寻址的方式不同罢了

    EPT:Extended Page Table,扩展页表

    EPTP:Extended-Page-Table Pointer,扩展页表指针

    EPT PML4T:EPT Page Map Level 4 Table , EPT PML4E 是其表项  L4

    PDPT:Page-Directory-Pointer Table , PDPTE 是其表项  L3

    PDT:Page-Directory Table , PDE 是其表项 L2

    PT:Page Table , PTE 是其表项 L1

    GPA:Guest-Physical Address,虚拟机物理地址

    HPA:Host-Physical Address,真实机物理地址

    EPT MMU:一块专门的用作硬件虚拟化的硬件

    EPT 机制与 Intel CPU 上的分页机制几乎一模一样,互通的。

    首先从大体上明白一点:首先通过 EPTP 可以找到 EPT PML4 :

    1. 当页面选择是 4KB 时,通过4级转换找到一个 4Kb 大小的页面, EPT PML4 ——> PDPTE ——> PDE ——> PTE ——> Page(4KB)

    2. 当页面选择是 2MB 时,通过2级转换找到一个 2MB 大小的页面,EPT PML4 ——> PDPTE ——> PDE ——> Page(2MB)

    3. 当页面选择是 1G 时,通过2级转换找到一个 1G 大小的页面,EPT PML4 ——> PDPTE ——> Page(1G)

    最后通过一个偏移值找到最终的 HPA 

     

    其次,在 IA32 文档中规定, 物理地址的位数最大只有 48 bits ,最多只有4级查找

    首先从大体上明白一点:首先通过 EPTP 可以找到 EPT PML4 :

    ①当页面选择是 4KB 时,通过4级转换找到一个 4Kb 大小的页面, EPT PML4 ——> PDPTE ——> PDE ——> PTE ——> Page(4KB)

    ②当页面选择是 2MB 时,通过2级转换找到一个 2MB 大小的页面,EPT PML4 ——> PDPTE ——> PDE ——> Page(2MB)

    ③当页面选择是 1G 时,通过2级转换找到一个 1G 大小的页面,EPT PML4 ——> PDPTE ——> Page(1G)

    最后通过一个偏移值找到最终的 HPA 

    首先要了解各个结构的定义,只需要关心目前所需要的位即可

    N 是由处理器支持的物理地址宽度决定的,可以通过 CPUID 查询到支持的长度。

    若后面不再找表,而是直接映射地址(1G),则 Bit 7 置 1;置 0 则继续索引,后面的表同理。

    下面再来看详细的步骤(假设已经得到一个 GPA 地址 X,且 N = 48):

    1. EPTP 存储在 VMCS 中,可以查找到。通过 EPTP 的 51:12 位,可以查找到 PML4T 的 HPA,再通过 X 中的 47:39 位定位到具体的条目(PLM4E)。因此得到的最终的 HPA 地址如下:

    — Bits  63:52 都是 0

    — Bits 51:12 来自于 EPTP 的 12:51 位

    — Bits 3:11 来自于 X 的 47:39 位,29 因此有 512个条目

    — Bits 2:0 都是 0

    以上组成的地址(64位)即可索引到真实机物理地址上存储的 PLM4E。

    2.  PML4E 中的 51:12 不能映射地址,只能表示 PDPT 的实际物理地址。和第一步的方法相同,其实际的物理是:

    — Bits  63:52 都是 0

    — Bits 51:12 来自于 PML4E 的 51:12 位

    — Bits 3:11 来自于 X 的 38:20 位

    — Bits 2:0 都是 0

    以上组成的地址(64位),即可索引到真实机物理地址上存储的 PDPTE。

    3. PDPTE 中的 51:12 既可以映射 1G 的页,也可以继续向下索引,若直接映射地址则

    — Bits 63:52 are all 0.

    — Bits 51:30 are from the PDPTE.

    — Bits 29:0 are from the X(GPA).

    可找到 1GB 大小的页地址。若继续向下索引则

    — Bits 63:52 are all 0.

    — Bits 51:12 are from the PDPTE.

    — Bits 11:3 are bits 29:21 of the X.

    — Bits 2:0 are all 0.

    以上所组成的64位地址,可以找到 PDE 在真实机上存储的物理地址。

    4. PDE 和第三步一样,继续找下一个或者直接映射 2MB 的页

    — Bits 63:52 are all 0.

    — Bits 51:12 are from the  PDE.

    — Bits 11:0 are from the X(GPA).

    以上所组成的64位地址,可找到 2MB 大小的页地址。若继续向下索引则

    — Bits 63:52 are all 0.

    — Bits 51:21 are from the PDE.

    — Bits 20:0 are from the X.

    以上所组成的64位地址,可以找到 PTE 在真实机上存储的物理地址。

    5. PTE 只能映射一个 4KB 的页

    — Bits 63:52 are all 0.

    — Bits 51:12 are from the EPT PTE.

    — Bits 11:0 are from the X.

     以上所组成的64位地址即可访问到 4KB 的页在实际物理地址中的位置。

    总结:

  • 相关阅读:
    POJ 3352&&3177 (割边 && 边双连通分量)
    .net程序员的盲点(二):两个“属性”引起的歧异
    .net程序员的盲点(一):参数修饰符ref,out ,params的区别
    .net程序员的盲点(一):参数修饰符ref,out ,params的区别
    args argc argv 的意思以及英文缩写
    .net程序员的盲点(一):参数修饰符ref,out ,params的区别
    .net程序员的盲点(一):参数修饰符ref,out ,params的区别
    .net程序员的盲点(一):参数修饰符ref,out ,params的区别
    args argc argv 的意思以及英文缩写
    args argc argv 的意思以及英文缩写
  • 原文地址:https://www.cnblogs.com/Rev-omi/p/14063037.html
Copyright © 2011-2022 走看看