Using Memory Segments to Describe the GPU Address Space
在VMM能够管理GPU的地址空间之前,小端口驱动必须以内存段的形式向VMM描述GPU的地址空间。小端口驱动创建内存段来泛化(generalize)和虚拟化VM资源。驱动程序能够根据硬件支持的内存类型来配置内存段(例如, Frame Buffer, System Memory Aperture).
驱动初始化时,驱动必须返回给VMM内存段类型的列表来描述内存资源应该怎样被VMM来管理。驱动会在DxgkDdiQueryAdapterInfo中指定其支持的内存段类型的数量以及描述每个段的类型。驱动使用DXGK_SEGMENTDESCRIPTOR描述每个段。详见Initializing Use of Memory Segments.
之后,内存段的数量以及类型就不会改变了。VMM会确保每个进程都能公平的共享任何一个段的资源。VMM会独立的管理所有段而不会造成段之间重叠。因此,VMM会分配给应用相当数量的一个段资源,而不会考虑是否已经拥有其他的段中的资源。
驱动会给每一个内存段分配段描述符。之后当VMM请求创建视频资源并渲染的时候,驱动就会识别这些支持请求段,以及指定让VMM优先使用的段。详见Specifying Segments When Creating Allocations
驱动不需要指定GPU内存段中所有可用的内存资源。但是驱动必须制动所有进程在系统中运行时用到的并被VMM管理的全部内存资源。例如VS的microcode就被实现为GPU地址空间中的固定功能管线,但是并不在VMM的管理之下(也就并不是内存段的一部分)。因为microcode对所有进程总是可用并且绝不可能在两个进程之间出现资源竞争的情况。但是VMM必须为例如Vertex Buffer,Texture, render Target以及应用指定的Shader code从一个驱动内存段中分配VM资源,因为这些资源类型一定是对所有进程都可用的。
下图显示了驱动程序如何配置GPU地址空间内存段。
NOTE:视频内存管理器中隐藏的视频内存不能映射到用户空间中,也不能只对任何特定进程可用。这样做违反了虚拟内存要求系统上运行的所有进程都能够访问所有内存这条基本规则