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

视频内存管理器 (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 中的视频内存不能映射到用户空间,也不能被任何特定进程独占。 这样做违反了虚拟内存的基本规则,即要求系统上运行的所有进程都可以访问所有内存。