CPU host aperture
对于32位的独立GPU,其并不支持大小可变的BAR,当改变Frame Buffer BAR的大小时会失败。WDDM v2将提供一种替代机制,通过这种机制独立GPU的VRAM也能够被有效的访问。而对于支持可编程BAR地址空间的GPU,一种新的CPU Host Aperture功能被引入到WDDM v2中,进一步的抽象了这个特性。
暴露一个CPU host aperture时,KMD给每一个段填充新的DXGK_CPUHOSTAPERTURE 能力结构体用来支持CPU host aperture,这个结构体定义了CPU host aperture的大小,这点允许驱动保留一些BAR用作内部使用。页面大小和内存Segment的GPU页面大小相同。
KMD暴露了两个新的DDI接口来管理BAR的地址空间, DxgkDdiMapCpuHostAperture 和 DxgkDdiUnmapCpuHostAperture。
CPU host aperture背后的页面内存被驱动管理以及在驱动初始化的初期阶段建立。 DxgkDdiMapCpuHostAperture 和 DxgkDdiUnmapCpuHostAperture 这两个接口被期望在枚举段之后马上就能执行,并且在VMM初始化期间被用于将CPU虚拟地址映射到页面目录以及在适配器初始化期间映射CPU虚拟地址到系统换页进程页表。
当CPU需要访问内存段时,VMM会预留在CPU host aperture中的页面,并且同通过CPU host aperture映射内存段。这个过程如下图所示:
在LDA的配置下,这个结构除了下面几点不同外,其他与上面介绍的基本类似。
- Default 或 LinkMirrored 资源永远都被映射到GPU0上。
- linkInstanced 资源拥有的虚拟地址的范围是AllocationSize*NumberOfGPUInLink。这段地址关联到资源的不同的部分,并且被映射到不同的GPU上。
如下所示: