从头开始了解和使用Hypervisor(第1部分)

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
{
 UNICODE_STRING usDosDeviceName;
 DbgPrint("DrvUnload Called rn");
 RtlInitUnicodeString(&usDosDeviceName, L"/DosDevices/MyHypervisor");
 IoDeleteSymbolicLink(&usDosDeviceName);
 IoDeleteDevice(DriverObject->DeviceObject);
}
AssemblyFunc1和AssemblyFunc2是定义为内联x64汇编代码的两个外部函数。
我们的驱动程序需要注册一个设备,以便我们可以通过用户模式代码与虚拟环境进行通信,另一方面,我定义了使用PnP Windows驱动程序函数的DrvUnload,你可以轻松卸载驱动程序并删除设备,然后重新加载并创建一个新设备。以下代码会负责创建新设备:
 RtlInitUnicodeString(&usDriverName, L"/Device/MyHypervisor");
 RtlInitUnicodeString(&usDosDeviceName, L"/DosDevices/MyHypervisor");
 NtStatus = IoCreateDevice(pDriverObject, 0, &usDriverName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDeviceObject);
 if (NtStatus == STATUS_SUCCESS)
 {
  pDriverObject->DriverUnload = DrvUnload;
  pDeviceObject->Flags |= IO_TYPE_DEVICE;
  pDeviceObject->Flags &= (~DO_DEVICE_INITIALIZING);
  IoCreateSymbolicLink(&usDosDeviceName, &usDriverName);
 }
如果你使用的是Windows,则应禁用驱动程序签名强制执行以加载驱动程序,这是因为Microsoft禁止任何未经验证的代码在Windows内核(Ring 0)中运行。
为此,请按住Shift键并重新启动计算机。你应该看到一个新窗口,然后:
1.单击高级选项;
2.在新窗口中,单击“启动设置”。
3.单击重新启动。
4.在“启动设置”屏幕上,按7或F7以禁用驱动程序签名;

通过注册表启用Windows调试消息,这样你就可以通过SysInternals DebugView获得DbgPrint()结果。
只需执行以下步骤:
1.在regedit中,添加一个密钥:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Debug Print Filter
接着,添加一个名为IHVDRIVER的DWORD值,其值为0xFFFF。重新启动计算机,你就可以开始了。
不过在重新开始之前,你需要了解一些基本概念:
1.虚拟机监控器(VMM):VMM充当主机,并完全控制处理器和其他平台硬件,VMM能够保留对处理器资源,物理内存,中断管理和I/O的选择性控制。
2.客户软件(Guest Software):每个虚拟机(VM)是一个客户软件环境。
3.VMX根操作和VMX非根操作:VMM将以VMX根操作运行,而客户软件将以VMX非根操作运行。
4.VMX转换:VMX根操作和VMX非根操作之间的转换。
5.VM条目:转换为VMX非根操作。
6.扩展页表(EPT):一种现代机制,它使用第二层将客户物理地址转换为主机物理地址。
7.VM退出:从VMX非根操作转换为VMX根操作。
8.虚拟机控制结构(VMCS):是内存中的数据结构,每个虚拟机仅存在一次或者更精确地说,每个VCPU[虚拟CPU]只存在一次,而由VMM管理。随着不同VM之间执行上下文的每次更改,将为当前VM重启VMCS,从而使用VMCS定义VM的虚拟处理器和VMM控制客户软件的状态。
VMCS包含六个逻辑组:
1.客户状态区域:处理器状态已保存到VM退出处的客户状态区域中,并已加载到VM条目中;
2. 主机状态区域:从VM上的主机状态区域加载的处理器状态;
3.VM执行控制字段:在VMX非root用户操作中控制处理器操作的字段;
4. VM退出控制字段:控制VM退出的字段。
5. VM条目控制字段:控制VM条目的字段。
6.VM退出信息字段:只读字段,用于接收有关VM退出的信息,描述VM退出的原因和性质。
详见下图:

不用担心这些字段,我将在后面的文章中对它们中的大多数进行清楚的解释,只要记住VMCS结构在不同版本的处理器之间是不同的即可。
VMX指令
VMX引入了以下新指令。
1.INVEPT:使EPT衍生的翻译无效
2.INVVPID:基于VPID的翻译无效
3. VMCALL:调用VM监控器;
4. VMCLEAR:清晰的虚拟机控制结构;
5. VMFUNC:VM调用函数;
6.VMLAUNCH:启动虚拟机;
7. VMRESUME:重启虚拟机;
8.VMPTRLD;指向虚拟机控制结构的载荷指针;
9.VMPTRST:存储指向虚拟机控制结构的指针;
10. VMREAD:从虚拟机控制结构读取字段;
11. VMREAD:将字段写入虚拟机控制结构;
12.VMXOFF:退出VMX操作;
13.VMXON:输入VMX操作;
VMM软件的运行周期

以下各项概述了VMM及其客户软件的生命周期以及它们之间的交互:
1.软件通过执行VMXON指令进入VMX操作;
2.然后,使用VM条目,VMM可以将客户虚拟机变成VM(一次一个)。 VMM使用指令VMLAUNCH和VMRESUME来影响VM条目,它使用VM退出重新获得控制权。
3.VM退出到VMM指定的入口点的传输控制。 VMM可以采取适合于VM退出原因的操作,然后可以使用VM条目返回到VM。
4.最终,VMM可能会自我关闭并退出VMX操作,它通过执行VMXOFF指令来实现。
接下来,我将说明如何使用上面创建的工具在计算机上启用VMX。
Intel结构和常量(包括VT-x标头)
在本部分中,我们将学习检测处理器对虚拟机监控器的支持,然后简单地配置基本内容以启用VMX和进入VMX操作,以及有关Window Driver Kit(WDK)的更多内容。

上一页  [1] [2] [3] [4] [5] [6]  下一页