Windows 图形显示驱动开发-WDDM 2.4功能-GPU 半虚拟化(十二)

DxgkDdiQueryAdapterInfo 更新

DXGKARG_QUERYADAPTERINFO 结构已更新,以包括以下字段以支持半虚拟化:

  • 添加了 Flags 成员,允许 Dxgkrnl 指示以下内容:
  1. 它将 VirtualMachineData 设置为指示调用来自 VM。
  2. 它将 SecureVirtualMachine 设置为表示 VM 在安全模式下运行。
  • 添加了 hKmdProcessHandle,这允许驱动程序在处理源自来宾 VM 的查询时识别和使用主机端的正确进程上下文。

DxgkDdiEscape 更新

hKmdProcessHandle 成员被添加到 DXGKARG_ESCAPE 结构中,以允许驱动程序在处理来自来宾虚拟机的转义时,识别并使用主机端的正确进程上下文。

VirtualMachineData 标志被添加到 D3DDDI_ESCAPEFLAGS 结构中,以指示 DxgkDdiEscape 是从虚拟机调用的。

物理访问 GPU 分配

目前,驱动程序不会实现对分配的物理访问。 驱动程序必须支持 GpuMmu。

WDDM 2.5 DDI 更新

对于 WDDM 2.5,为了支持半虚拟化,还需要进行以下 DDI 更改。

由 KMD 主机发出来宾事件信号

当 KMD 需要对 UMD 创建的事件发出信号时,会出现一些没有虚拟化的情况。 若要在使用半虚拟化时处理此类情况,主机上的 KMD 需要向客户机中创建的事件发送信号。 为此添加了 DxgkCbSignalEvent 回调。 KMD 还可以使用此回调来发出主机进程的事件信号。

支持虚拟机中 UMD 提供的句柄

某些驱动程序回调接受 UMD 传递的 Dxgkrnl 分配或资源句柄,例如:

  • DxgkCbAcquireHandleData
  • DxgkCbReleaseHandleData
  • DxgkCbGetHandleData
  • DxgkCbGetHandleParent

主机上的调用必须在调用 DxgkDdiXxx 函数的同一线程上下文中进行。

例如,假设在没有虚拟化的情况下,KMD 在调用 D3DKMTEscape 的用户模式线程的上下文中调用 DxgkCbAcquireHandleData,该线程调用 DxgkDdiEscape。

UMD 在虚拟机中运行时,它只知道来宾分配句柄,并且无法将此类句柄传递给 KMD,因为 KMD 在主机中运行。 来宾中的 UMD 会调用 D3DKMTEscape,而主机中的 KMD 会接收相应的 DxgkDdiEscape 调用。 KMD 需要在此线程的上下文中调用 DxgkCbAcquireHandleData。

为了能将来宾分配/资源句柄转换为相应的主机句柄,添加了 D3DDDI_ESCAPEFLAGS::DriverKnownEscape 驱动程序转义标志。

在调用 D3DKMTEscape 并设置 DriverKnownEscape 标记时:

  • 将 D3DKMT_ESCAPE::Type 设置为 D3DKMT_ESCAPE_DRIVERPRIVATE。
  • 将 D3DKMT_ESCAPE::pPrivateDriverData 设置为指向已知的驱动程序转义结构,该结构在下一节中定义。 每个结构都以 D3DDDI_DRIVERESCAPETYPE 值开头。

如果未使用虚拟化,则转换后的句柄与输入句柄相同。

定义了以下已知的驱动程序转义字符。

  • D3DDDI_DRIVERESCAPE_TRANSLATEALLOCATIONEHANDLE
  • D3DDDI_DRIVERESCAPE_TRANSLATERESOURCEHANDLE

以下代码片段演示如何使用 DriverKnownEscape 标志。

复制代码
D3DDDI_DRIVERESCAPE_TRANSLATEALLOCATIONEHANDLE Command = {};
    Command.EscapeType = D3DDDI_DRIVERESCAPETYPE_TRANSLATEALLOCATIONHANDLE;
    Command.hAllocation = hAlloc;
    D3DKMT_ESCAPE Args = {};
    Args.hAdapter = hAdapter;
    Args.Flags.DriverKnownEscape = TRUE;
    Args.Type = D3DKMT_ESCAPE_DRIVERPRIVATE;
    Args.pPrivateDriverData = &Command;
    Args.PrivateDriverDataSize = sizeof(Command);
    Status = D3DKMTEscape(&Args);

WDDM 2.6 DDI 更新

从 WDDM 2.6(Windows 10 版本 1903 开始),为半虚拟化支持进行了以下更新:

  1. 驱动程序可以在虚拟机中使用 DXGK_ALLOCATIONINFOFLAGS::ACCESSEDPHYSICALLY 标志。 在 WDDM 2.6 之前,驱动程序无法在虚拟机中使用此标志,并且此标志的分配创建失败。
  2. UMD 可以在虚拟机中使用 Pfnd3dkmtUpdateallocationproperty。 在 WDDM 2.6 之前,此调用将失败。
相关推荐
kakakahahahaha2 小时前
Windows C盘空间不足的安全清理与迁移流程
windows·电脑·笔记本电脑·软件需求·c盘清理
做咩啊~2 小时前
远程连接提示:身份验证错误,要求的函数不受支持
windows
百事牛科技4 小时前
PPT只读怎么取消?四种情况分别处理
windows·powerpoint
熊明才1 天前
WSL2 网络突然瘫痪(Network is unreachable / 没有 eth0)最短修复指南(2026年9月20日亲测可用)
linux·windows·wsl2
离凌寒1 天前
一、关于linux开发板上移植ubuntu根文件系统并配置桌面环境笔记记录
驱动开发·单片机
临期冰淇淋1 天前
Unisoc 展锐平台Camera摄像头分辨率适配
linux·c语言·驱动开发
Rsingstarzengjx1 天前
第二十八章 Linux 并发与竞争实验
驱动开发·嵌入式硬件·stm32mp157
xbzb1 天前
Windows 启动故障修复知识整理:蓝屏 / 无限重启 / 盘符 X / 无 PE 盘
windows
我命由我123451 天前
Mac 操作系统 - 一些使用记录
运维·windows·学习·系统安全·运维开发·mac·学习方法
ysu_03142 天前
TinyML 模型部署:从 Edge Impulse 到 STM32F103
驱动开发·stm32·嵌入式硬件·mcu·硬件架构·硬件工程·dsp开发