使用内存段描述 GPU 地址空间

一个内存段是指将连续的虚拟地址范围映射到连续的物理地址范围。 它们已在 Windows Vista 中引入。

视频内存管理器 (VidMm) 负责管理 GPU 的地址空间。 在此之前,内核模式显示微型端口驱动程序 (KMD) 必须通过使用内存段将 GPU 的地址空间描述为 VidMm

KMD 创建内存段以概括和虚拟化视频内存资源。 它可以根据硬件支持的存储器类型(例如,帧缓冲区内存或系统内存光圈)配置内存段。

在驱动程序初始化期间,KMD 必须返回描述 VidMm 如何管理内存资源的段类型列表。 KMD 指定了它支持的段类型的数量,并通过响应对其 DxgkDdiQueryAdapterInfo 函数的调用来描述每种段类型。 驱动程序使用 DXGK_SEGMENTDESCRIPTOR 结构描述每个段。 有关详细信息,请参阅初始化内存段的使用

此后,段的数量和类型保持不变。 VidMm

  • 确保每个进程在任何特定段中都能获得公平的资源份额,

  • 独立管理所有段。

段不重叠。 因此,VidMm 可以从一个段分配相当数量的视频内存资源,而不管应用程序从另一个段持有多少资源。

KMD 为每个内存段分配一个段标识符。 稍后,当 VidMm 请求为视频资源创建分配并呈现这些资源时,KMD:

  • 标识支持请求的段。

  • 按顺序指定驱动程序希望 VidMm 使用的段。

有关详细信息,请参阅创建分配时指定段

KMD 不需要在其内存段中指定 GPU 可用的所有视频内存资源。 但是,KMD 必须指定 VidMm 在系统上运行的所有进程中管理的所有内存资源。 例如:

  • 实现固定函数管道的顶点着色器微代码可以驻留在 GPU 地址空间中,但在 VidMm 管理的内存之外(即不是段的一部分)。 此配置是可能的,因为微代码始终可用于所有进程,并且永远不会成为进程之间争用的来源。

  • 对于顶点缓冲区、纹理、呈现目标和应用程序特定的着色器代码等资源,VidMm 必须从驱动程序的内存段之一分配视频内存资源。 这一要求是因为资源类型必须对所有进程公平可用。

下图显示了 KMD 如何从 GPU 地址空间配置内存段的示例。

将 GPU 地址空间划分为内存段的示意图。

图中的数字对应于以下内存段:

  1. CPU 可访问的线性段:此段可由 CPU 访问,并组织为线性地址空间。

  2. 非 CPU 可访问的线性段:该段被组织为线性地址空间,但 CPU 无法访问。 它用于不需要 CPU 访问的资源。

  3. 只读 AGP 光圈段:此段用于对 AGP(加速图形端口)内存进行只读访问。

  4. 光圈段:此段用于通过 AGP 光圈访问的资源。

隐藏框表示 KMD 不向 VidMm 公开的内存段。 隐藏在 VidMm 中的视频内存不能映射到用户空间,也不能被任何特定进程独占。 这样做违反了虚拟内存的基本规则,即要求系统上运行的所有进程都可以访问所有内存。