VM/容器桌面的远程控制
可以使用两种方法将虚拟机(VM)中的桌面内容远程到主机:
- Hyper-V 显示适配器
- 终端会话远程控制
使用 RDP(远程桌面)连接到 VM 时,将使用终端会话远程处理。
Hyper-V 管理器使用 VMConnect 应用程序来显示 VM 桌面。 VMConnect 在两种模式下工作:
- 增强模式,它使用终端会话远程处理。
- 使用 Hyper-V 显示适配器的基本模式。
VM 工作进程和 VM 内存
启动 VM 或容器时,作系统会在主机上创建以下进程:
- VM 工作进程 (vmwp.exe)
- VM 内存进程(vmmem.exe)
Vmwp 包含各种虚拟设备驱动程序,包括 vrdumed.dll、用于半虚拟化图形适配器的驱动程序。
vmmem 进程虚拟地址空间是来宾中 vGPU IO 空间的后备空间。 当访客访问 IO 空间时,生成的物理地址是进入二级转换的入口,该转换使用 vmmem 进程的页表。
在虚拟化环境中,当虚拟机运行时,通常在主机上用户进程的上下文中运行的各种 KMD DDI 调用将在 vmmem 进程的上下文中执行。
Dxgkrnl 为这些进程创建单个 DXGPROCESS(以及相应的 KMD 进程对象),本文中称为 VM 工作进程。 与 DXG VM 工作进程相关的 EPROCESS 为 vmmem。
VM 进程
在来宾 VM 中创建 DXGPROCESS 时,Dxgkrnl 在主机上创建相应的 DXGPROCESS 对象。 本文中此过程称为 VM 进程。 与 DXGPROCESS 关联的 EPROCESS 是 vmmem。
来自 VM 或 VM 分配创建的所有渲染操作都是在 VM 的 DXGPROCESS 上下文中完成的。
出于调试目的,Dxgkrnl 通知 KMD 哪个进程是 vm 工作进程或 DxgkDdiCreateProcess中的 VM 进程。 使用此信息,驱动程序可以将 VM 进程链接到 VM 工作进程。 此信息有助于在多个 VM 运行时进行调试。
驱动程序要求
支持 GPU 半虚拟化的 KMD 需要设置 DXGK_VIDMMCAPS::ParavirtualizationSupported 功能。
用户模式驱动程序(UMD)不应在专用驱动程序数据(指针、句柄等)中使用任何与进程上下文相关的数据。 相反,KMD 在不同的进程上下文中获取主机中的专用数据。
来宾中的 UMD 无法与主机中的 KMD 共享内存。 它必须使用 UMD 中 注册表访问中所述的函数来访问注册表。
当前的半虚拟化实现使用 VM 总线在来宾与主机之间通信。 最大消息大小为 128KB。 目前,Dxgkrnl 不会将信息分块发送。 因此,驱动程序需要限制通过创建对象传递的专用数据的大小。 例如,当 Pfnd3dddiAllocatecb 用于创建多个分配时,总消息大小包括标头、全局专用数据,以及每个分配专用数据的大小乘以分配数。 所有这些信息都需要放入单个消息中。
在全屏模拟模式下运行应用程序
应启用间接显示适配器进行远程控制(默认已启用)。 若要禁用它,请执行以下步骤。
- 开始编辑组策略
- 导航到计算机配置 ->管理模板 ->Windows 组件 ->远程桌面服务 ->远程桌面会话主机 ->远程会话环境
- 打开“使用 WDDM 图形显示驱动程序进行远程桌面连接”项
- 选择“禁用”并选择“确定”
- 重新启动
默认情况下启用对 VM 中全屏应用程序的 DXGI 支持。 若要禁用它,请使用 StagingTool.exe /disable 19316777。
全屏应用程序必须在模拟全屏模式下运行。
为所有 DXGI 应用程序启用 eFSE,并为交换效果转换为 WDDM 2.0 设置最低 WDDM 版本:
- D3DEnableFeature.exe /enable DXGI_eFSE_Enablement_Policy
- D3DEnableFeature.exe /setvariant DXGI_eFSE_Enablement_Policy 7
默认情况下,eFSE 为 D3D9 应用程序启用。
VM 中的 DriverStore
主机上的驱动程序二进制文件位于驱动程序存储 %windir%\system32\drivers\DriverStore\FileRepository<DriverDirectory>。
对于半虚拟化,VM 中的 UMD 二进制文件应位于 %windir%\system32\drivers\HostDriverStore\FileRepository<DriverDirectory>。
主机 KMD 会报告 UMD DLL 的名称,其中包含驱动程序存储空间的完整路径。 例如,c:\windows\system32\DriverStore\FileRepository\DriverSpecificDirectory\d3dumd.dll。
当 VM 请求 UMD 名称时,该名称将转换为 <VmSystemDrive>:\windows\system32\HostDriverStore\FileRepository\DriverSpecificDirectory\d3dumd.dll。