首页
社区
课程
招聘
Intel VT 入门 笔记
2022-10-1 07:45 10677

Intel VT 入门 笔记

2022-10-1 07:45
10677

基于 Hypervisor-From-Scratch
Hypervisor-From-Scratch-Github 源码
Hypervisor From Scratch 文档

 

图片描述
首先检测是否支持VT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 检查是否支持VT
BOOLEAN HvIsVmxSupported()
{
    CPUID Data = { 0 };
    IA32_FEATURE_CONTROL_MSR FeatureControlMsr = { 0 };
 
    // VMX bit
    __cpuid((int*)&Data, 1);
    if ((Data.ecx & (1 << 5)) == 0)
        return FALSE;
 
    FeatureControlMsr.All = __readmsr(MSR_IA32_FEATURE_CONTROL);
 
    // BIOS lock check
    if (FeatureControlMsr.Fields.Lock == 0)
    {
        FeatureControlMsr.Fields.Lock = TRUE;
        FeatureControlMsr.Fields.EnableVmxon = TRUE;
        __writemsr(MSR_IA32_FEATURE_CONTROL, FeatureControlMsr.All);
    }
    else if (FeatureControlMsr.Fields.EnableVmxon == FALSE)
    {
        LogError("Intel VMX feature is locked in BIOS");
        return FALSE;
    }
 
    return TRUE;
}

图片描述

 

DR0-CR4寄存器【链接】
请注意,VMX 操作要求下列位在 VMX 操作中为1: CR0.PE、 CR0.NE、 CR0.PG 和 CR4.VMXE。对 CR0.PE 和 CR0.PG 的限制意味着 VMX 操作只支持分页保护模式。因此, guest 软件不能在非分页保护模式或实地址模式下运行。

 

如何理解EPT呢?
图片描述

 

他就相当于保护模式的内存分页机制9-9-9-9-12
目前x64只用48位进行寻址,其余位无视

 

比如我们想寻找
0x987654321
00000000 00000000 00000000 00001001 10000111 01100101 01000011 00100001
从低到高进行位的分割
无视 9 9 9 9 12
0000000000000000 000000000 000100110 000111011 001010100 001100100001
0 0x26 0x3B 0x54 0x321

 

首先EPTP指向的物理地址 等价与 CR3 页表目录
EPTP + 08 = PML4E
PML4E + 0x26
8 = PDPT
PTPT + 0x3B8 = PDE
PDE + 0x54
8 = PTE

 

取得的PTE指向一块4096大小首地址
PTE + 0x321 = 寻址的地址

1
2
3
4
5
6
7
8
9
10
VT指令
 
__vmx_on                设置Vmon 区域
__vmx_off               关闭Vmx
__vmx_vmclear           清空Vmcs区域
__vmx_vmptrld           设置Vmcs区域
__vmx_vmwrite           写Vmcs
__vmx_vmread            读Vmcs
__vmx_vmlaunch          启动进入VMM
__vmx_vmresume          恢复运行VMM

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞3
打赏
分享
最新回复 (1)
雪    币: 8
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_punpkihu 2023-5-3 18:29
2
0
攒一个,有群吗,想一起学习vt
游客
登录 | 注册 方可回帖
返回