Driver protection
与每个VA一起,VMM允许独立硬件提供商(IHVs)来定义与特殊VA相关联的驱动/硬件保护(i.e. 页表项编码)。可以把驱动保护看作是页表项中的额外的位,而这些内容对于VMM是不可知的,而对于驱动需要对其进行控制并且能够让GPU用最佳的方式来访问。
NOTE:驱动保护是可选的,在任何不需要该功能的平台上可以被设置为0。
当映射或预留一段GPUVA范围时,驱动可能指定一个64位的驱动保护值。这个被指定的驱动保护在初始化这段VA对应的页表项的时候会被VMM使用。特别是在每一个调用 BuildPagingBuffer接口进行DXGK_OPERATION_UPDATE_PAGE_TABLE操作对应VA时驱动保护会被传回给驱动。
在使用不同的驱动保护时,多个VA可以被映射到同一个allocation。这些不同VA对对应的页表项会使用合适的驱动保护进行更新。
驱动保护只被应用在0级页表项上,而其他等级的页表项会被设置为0。
Paging and unique driver protection
当将一个allocation换页进出内存段的时候,VMM将从系统设备VA空间里指定一个临时VA,目的是传输Allocation的内容。当创建临时映射f的时候,关联这个Allocation的驱动保护是模糊的,因为可能存在着多个映射关系关联着不同的进程地址空间与不同的驱动保护。因为这个原因,VMM会被用于换页而创建的系统设备映射默认都指定驱动保护为0。
当驱动保护被指定关联一个VA时,驱动能够通过设置唯一的数据位来改变这种行为。
#define D3DGPU_UNIQUE_DRIVER_PROTECTION 0x8000000000000000ULL
当这个位被设置时,VMM会强制映射到同一Allocation的地址范围使用相同而驱动保护值,否则这个映射请求将因为STATUS_INVALID_PARAMETER而失败。
一个被使用唯一驱动保护映射的Allocation地址范围范围(allocation range),就不能再被其他不同的驱动保护值再次映射。这种情况下唯一能改变这个保护的方式是只映射而不访问(PS:不知道理解对不对,映射不访问有什么用?)。
被不唯一的驱动保护值映射的Allocation范围能够被其他的保护值再次映射。
当Allocation 有使用唯一驱动保护值映射的虚拟地址范围的Allocation换出(evict)时。为了这些虚拟地址范围能与合适的驱动保护映射而不存在歧义,VMM建立启动进程映射映射。
下面图示Allocation用不同驱动保护与一个Allocation映射的例子:
在进程换页操作时Allocation会被成块拷贝:
1.与驱动保护0一起拷贝Allocation范围[0,A1]
2.与驱动保护P1一起拷贝Allocation范围[A1,A2]
3.与驱动保护0一起拷贝Allocation范围[A2,A4]
4.与驱动保护P4一起拷贝Allocation范围[A4,A5]
5.与驱动保护0一起拷贝Allocation范围[A5,Size]
当Allocation被换出时换页进程页表项会被设置一个驱动保护值而这个Allocation被提交时会被设置另一个不同的值是可能的。在VA映射被更新之后驱动应该刷新Allocation的数据。例如,当Allocation当前映射的保护值设置M1,UMD调用UpdateGpuVirtualAddress 接口映射时设置为M2.在映射的M2被应用之前,Allocation能够被VMM移出。使用M2映射被使用之后,这个Allocation又被提交了回来。现在这个存在与本地内存段(显卡内内存)Allocation的内容可能与之前的不一样了。
Tiled Resources
对于Tiled资源,当保留一段VA范围的时候驱动保护值被指定。UMD调用 UpdateGpuVirtualAddress 将继承这个VA的驱动保护当前值。