05_基本框架_VMCS_HostArea

》When Exit event triggered, this setting would response!

1 Host-State Area

相当于 产生中断从虚拟机Guest返回到HOST处理的时候 HOST 的环境

1.1 白皮书上相关介绍

chapter 27 .5 describes VM Exits Loading Host State details or exceptions。

1571810475742[4]

chapter 24.5 describes the Area

1571811214144[4]

 

代码

 
 1 // 设置 HOST 区域
 2 
 3    Vmx_VmWrite(HOST_CR0, Asm_GetCr0());
 4     Vmx_VmWrite(HOST_CR3, Asm_GetCr3());
 5     Vmx_VmWrite(HOST_CR4, Asm_GetCr4());
 6  7     Vmx_VmWrite(HOST_ES_SELECTOR, Asm_GetEs() & 0xFFF8);
 8     Vmx_VmWrite(HOST_CS_SELECTOR, Asm_GetCs() & 0xFFF8);
 9     Vmx_VmWrite(HOST_DS_SELECTOR, Asm_GetDs() & 0xFFF8);
10     Vmx_VmWrite(HOST_FS_SELECTOR, Asm_GetFs() & 0xFFF8);
11     Vmx_VmWrite(HOST_GS_SELECTOR, Asm_GetGs() & 0xFFF8);
12     Vmx_VmWrite(HOST_SS_SELECTOR, Asm_GetSs() & 0xFFF8);
13     Vmx_VmWrite(HOST_TR_SELECTOR, Asm_GetTr() & 0xFFF8);
14 15     Vmx_VmWrite(HOST_TR_BASE, 0x80042000);
16 17     Vmx_VmWrite(HOST_GDTR_BASE, GdtBase);
18     Vmx_VmWrite(HOST_IDTR_BASE, IdtBase);
19 20     Vmx_VmWrite(HOST_IA32_SYSENTER_CS,  Asm_ReadMsr(MSR_IA32_SYSENTER_CS)&0xFFFFFFFF);
21     Vmx_VmWrite(HOST_IA32_SYSENTER_ESP, Asm_ReadMsr(MSR_IA32_SYSENTER_ESP)&0xFFFFFFFF);
22     Vmx_VmWrite(HOST_IA32_SYSENTER_EIP, Asm_ReadMsr(MSR_IA32_SYSENTER_EIP)&0xFFFFFFFF); // KiFastCallEntry
23 24     Vmx_VmWrite(HOST_RSP,   ((ULONG)g_VMXCPU.pStack) + 0x2000);     //Host 临时栈
25 
26     Vmx_VmWrite(HOST_RIP,   (ULONG)VMMEntryPoint); //这里定义我们的VMM处理程序入口
27 》 EXIT 例程
28 
29 void __declspec(naked) VMMEntryPoint(void)
30 
31     // 注意:1. 裸函数里面不要用局部变量;因为使用到ebp;而裸函数不维护,如果手动维护,那么和普通函数有什么却别;
32     //      2. 裸函数 是为了我们更好的控制进来那一刻 寄存器等的 获取、设置
33     //      3. 裸函数 最好不要太冗余;所以 有很多操作的话,最好 另外封装一个函数,在裸函数中调用即可。
34 {
35     // Refresh selector -- >underneath part-- gdtinfo;
36     //do Exchange itself can refresh the VM TLB when selector right ;
37 __asm{
38        mov ax,fs;
39        mov fs,ax;
40 
41        mov ax,gs;
42        mov gs,ax;
43         int 3;
44 
45     }
46 47 
48 }
 

 

 

测试 HOST_State Fields

》成功进入 指定的VM_Exit(就是当前设置的VMMEntryPoint)处理例程中

(因为 最开始VM——Launch 会尝试执行 Guest Area,但是当前我们还没有配置,所以会出错,就会尝试执行VM_Exit到Host 来处理这个异常)

1572070683824[4]

 

 

 

posted @ 2019-10-27 11:09  leibso二狗  阅读(351)  评论(0)    收藏  举报