管理程序可将系统分成多个 VM,并将 Windows Server 2008 的引导实例当作主分区(或根分区),以使其可直接访问各种硬件设备(如磁盘、网络适配器和图形处理器)。管理程序要求根分区执行电源管理并响应硬件即插即用事件。它将截取子分区中启动的硬件设备 I/O 并将其路由到根分区,然后根分区使用标准 Windows Server 2008 设备驱动程序来执行硬件访问。通过这种方式,运行 Hyper-V 的服务器可以充分利用 Windows 对硬件设备的支持。
当将 Windows Server 2008 配置为具有 Hyper-V 服务器角色时,Windows 将把 hypervisorimagelaunchtypeboot 引导配置数据库 (BCD) 设置设为 auto,并将 Hvboot.sys 设备驱动程序配置为在引导过程的前期启动。如果配置了该选项,Hvboot.sys 将使系统做好虚拟化准备,然后将 %Systemroot%\System32\Hvax64.exe 或 %Systemroot%\System32\Hvix64.exe 加载到内存中,具体加载哪个程序取决于系统是实现 AMD-V 虚拟化扩展还是 Intel VT CPU 虚拟化扩展。
加载完成后,管理程序使用虚拟化扩展将自身插入到 Windows Server 2008 中。用户模式的应用程序使用 x64 处理器的 Ring 3 权限级别,而内核模式代码则在 Ring 0 上运行,因此管理程序实际是在概念权限级别 Ring -1 上运行,因为它可控制 Ring 0 上运行的代码的执行环境。
当使用 Hyper-V 管理控制台创建或启动子分区时,它将利用 %Systemroot%\System32\Drivers\Winhv.sys 驱动程序来与管理程序通信,该驱动程序使用公开记录的 hypercall API 来指示管理程序创建指定物理内存大小的新分区和执行特征。根分区中的 VM 服务 (%Systemroot%\System32\Vmms.exe) 为每个子分区创建一个 VM 工作进程 (%Systemroot%\System32\Vmwp.exe) 以管理子分区的状态。
Windows 改善子 VM 操作系统性能的其中一种方法是 Windows Server 2008 和 Windows Vista 都已实现的启发方法(即仅当操作系统运行实现 Microsoft hypercall API 的管理程序时才会激活的代码序列)。通过直接请求管理程序的服务,子 VM 避免了在管理程序必须猜测子操作系统的意图时所产生的虚拟代码开销。
例如,未实现自旋锁(执行底层多处理器同步)启发方法的来宾操作系统将停在一个紧凑循环上旋转以等待其他虚拟处理器释放自旋锁。此旋转可能会阻塞其中一个硬件 CPU,直到管理程序调度第二个虚拟处理器。在启发式操作系统中,自旋锁代码会在将要发生旋转时通过 hypercall 通知管理程序,这样管理程序可以立即调度另一个虚拟处理器并降低不必要的 CPU 使用。
Windows Server 2008 改善 VM 性能的另一种方式是加速 VM 对设备的访问。可通过在子操作系统中安装统称为“VM 集成组件”的一个组件集合来增强性能。
如果运行未安装集成组件的 VM,则子操作系统将为管理程序所提供的模拟设备配置硬件设备驱动程序。当设备驱动程序试图使用硬件资源时,管理程序必须进行干预以便通知根分区,根分区将代表子 VM 操作系统使用标准 Windows 设备驱动程序执行设备 I/O。由于单独的高级 I/O 操作(例如读磁盘)可能包含多个离散的硬件访问,所以它可能导致管理程序和根分区中出现许多称为“截取”的转换。
Windows Server 2008 使用以下三种组件来最小化截取:虚拟机总线驱动程序 (%Systemroot%\System32\Drivers\Vmbus.sys)、虚拟服务客户端 (VSC) 和虚拟服务提供商 (VSP)。当利用受支持操作系统将集成组件安装到 VM 中时,VSC 将取代设备驱动程序的角色,并使用子 VM 中的 Vmbus.sys 驱动程序服务,通过管理程序的 hypercall 和内存共享服务将高级 I/O 请求发送到根分区中的虚拟机总线驱动程序。在根分区中,Vmbus.sys 将请求转发到相应的 VSP,然后它通过根分区的设备驱动程序来启动标准 Windows I/O 请求。

