Windows 图形显示驱动开发-WDDM 2.0 -GpuMmu 寻址方式

在 GpuMmu 模型中,GPU 有自己的内存管理单元 (MMU),用于将每进程 GPU 虚拟地址转换为物理地址。

每个进程都有单独的 CPU 和 GPU 虚拟地址空间,这些空间使用不同的页表。 视频内存管理器(VidMm)管理所有进程的 GPU 虚拟地址空间。 VidMm 还负责分配、扩展、更新、确保驻留和释放页表。 GPU MMU 使用的页表的硬件格式对于 VidMm 来说是未知的,并通过设备驱动程序接口 (DDI) 进行抽象封装。 抽象支持多级级别转换,包括固定大小的页表和可调整大小的根页表。

尽管 VidMm 负责管理 GPU 虚拟地址空间及其基础页表,但 VidMm 不会自动将 GPU 虚拟地址分配给分配。 这一责任落在用户模式驱动程序 (UMD) 身上。

VidMm 为 UMD 提供两个主要服务:

内存分配和解除分配。 UMD 可以通过现有 Allocate 回调分配视频内存,并通过现有 Deallocate 回调释放该内存。 Allocate 返回一个指向 VidMm 分配的句柄给 UMD。 GPU 引擎可以在此句柄上运行。 此类分配专门指物理视频内存,GPU 引擎可以通过分配列表访问和处理这些内存。

GPU 虚拟地址空间管理。 对于在虚拟模式下运行的引擎,必须先将 GPU 虚拟地址显式分配给内存分配,然后才能进行虚拟化访问。 为此,VidMm 提供 UMD 服务来保留或释放 GPU 虚拟地址,并将特定分配范围映射到进程的 GPU 虚拟地址空间。 这些服务很灵活,允许 UMD 精细控制进程 GPU 虚拟地址空间。 UMD 可以决定为某个分配指定特定的 GPU 虚拟地址,或者让 VidMm 自动选取可用地址,并可能指定一些最小和最大 GPU 虚拟地址的约束条件。 单项分配可以有多个与之关联的 GPU 虚拟地址映射,并且向 UMD 提供服务以实现图块资源协议。

同样,在链接的显示适配器配置中,UMD 可以将 GPU 虚拟地址显式映射到特定的分配实例。 对于每个映射,UMD 可以选择是映射到自身还是映射到特定的对等 GPU。 在此模型中,分配中分配的 CPU 和 GPU 虚拟地址是独立的。 UMD 可以决定在两个地址空间中保持它们相同,或使它们保持独立。

GPU 虚拟地址通过 DDI 接口以固定 4 KB 页面粒度进行逻辑化管理。 GPU 虚拟地址可以引用驻留在内存段或系统内存中的内存分配。 系统内存以 4 KB 物理粒度进行管理,而内存段在驱动程序选择时以 4 KB 或 64 KB 进行管理。 所有 VidMm 分配都对齐,并调整大小为驱动程序选择的页面大小的整数倍。

对无效范围的 GPU 虚拟地址的访问将导致访问冲突,并终止导致访问错误的上下文和/或设备。 为了从这种故障中恢复,VidMm 会启动引擎重置;如果不成功,则会升级为适配器范围的超时检测恢复 (TDR)。

下图演示了 GpuMmu 模型:

相关推荐
小此方1 小时前
Re:Linux系统篇(四十六)信号篇·四:一文串联操作系统底层:时钟中断、内核态切换、系统调用与 Linux 信号处理全解析
linux·驱动开发·信号处理
Echo_cy_2 天前
基于ZYNQ-7000的Ethernet驱动配置
linux·驱动开发·嵌入式硬件·fpga开发·ethernet·zynq
sukalot3 天前
windows网络适配器驱动开发-为多个 Windows 版本生成 WiFiCx 驱动程序
windows·驱动开发
TE-茶叶蛋4 天前
Spec-Driven Development(规范驱动开发)
驱动开发
云栖梦泽5 天前
Camera驱动开发与应用开发中的零拷贝与DMA
linux·驱动开发·嵌入式硬件
脱胎换骨-军哥5 天前
C++ 嵌入式编程实例:从寄存器操作到底层驱动开发
开发语言·c++·驱动开发
智者知已应修善业5 天前
【使用D触发器74HC175实现0001 0011 0111 1111 1110 1100 1000的循环彩灯电路。】2025-4-28
驱动开发·经验分享·笔记·硬件架构·硬件工程
新元代码6 天前
SDD+TDD 双驱动开发模式实战指南
驱动开发
mk0157 天前
20V输入,12V 3A输出 效率96%DCDC降压芯片
驱动开发·单片机·硬件工程·智能硬件·pcb工艺
mounter6257 天前
跨越鸿沟:从内核驱动开发到超大规模云端生产环境的思考
linux·驱动开发·linux kernel·kernel