Support for 64KB pages
为了支持64KB的页面,WDDM v2提供了两种类型的叶页表。一种支持4KB的页表项,另一种支持64KB的页表项。这两种页表的都覆盖了同样的虚拟地址范围,所以一个支持4KB页面的页表拥有的页表项数量是一个支持64KB页面的页表的16倍。
64KB页面页表的大小被定义在DXGK_GPUMMUCAPS::LeafPageTableSizeFor64KPagesInBytes中。
UpdatePageTable 操作有一个标志DXGK_UPDATEPAGETABLEFLAGS::Use64KBPages代表了这个页表的类型是被更新过的。
WDDM v2支持下面的两种操作模式:
- 一级页表的页表项可以指向4KB类型页表或64KB类型页表。
- 一级页表的页表项可以同时指向4KB类型页表和64KB页表。这是"dual PTE"模式。
XGK_GPUMMUCAPS::DualPteSupported能力表示了是否支持dual PTE 模式。VMM基于三点来选择页面的大小,资源的对齐方式,GPU内存段的属性,和GPU内存段的类型。一个资源是否被映射到64KB的页面中,取决于资源的对齐方式和大小是否是64的整数倍,以及资源resident所在的内存段是否支持64KB页面。
Single PTE mode
这种模式下一级页表的页表项可以指向4KB类型的页表,或者是64KB类型的页表。
DXGK_PTE::PageTablePageSize字段只应该在一级页表(之前叫页面目录)的页表项里被使用。这个字段告诉KMD页表对应的类型(是使用64KB或4KB)。
VMM在如下情况中位一段虚拟地址选择使用64KB类型的页表:
- 只有64KB对齐的资源被映射到这段虚拟地址上
- 所有所有Allocation映射范围的内存段支持64KB的页面
当虚拟地址范围被64KB页面映射时,而以上两个条件不满足的时候(例如, 一个allocation被提交到了系统内存段中),VMM就会将64KB类型页表切换成4KB类型页表。
当一个页表只有64KB页表项时,一个页表项需要指向一个4KB页面时(例如,一个Allocation被移到了系统内存中),这个页表就会被变成只使用4KB页表项的页表。
下面说明了这个转换过程:
1.进程的所有上下文都被挂起
2.已经存在的所有页表项都被更新为指向4KB的页面,驱动会收到 UpdatePageTable 的换页操作。
3.指向页表的一级页表项将被更新新的页面大小(PageTablePageSize = DXGK_PTE_PAGE_TABLE_PAGE_4KB).驱动将会收到 UpdatePageTable换页操作。
4.进程所有的上下文都会唤醒。
当一个页表只有4KB页表项而页表项的数量是0时,这个页表将被转换成64KB的页表。
下面说明了这个转换过程:
1.进程的所有上下文都被挂起
2.已经存在的页表项被更行位指向64KB的页面。驱动将收到 UpdatePageTable 换页操作。
3.指向页表的一级页表项会被更新更新的页面大小(PageTablePageSize = DXGK_PTE_PAGE_TABLE_PAGE_64KB)。驱动将会收到 UpdatePageTable换页操作。
4.进程所有的上下文都会唤醒。
为了避免平凡的切换页表的类型,驱动会将小的allocation打包(PS:这个打包的意思可能是放在一起)。
Dual PTE mode
在DualPTE模式的一级页表的页表项可能同时指向4KB页表和64KB页表。
在一级页表的页表项中指针都有一个Valid标志,但是0级页表中覆盖同样一段64KB页面地址范围的页表项不能同时被设置位Valid。
当被64KB的页表项覆盖的一个Allocation被放置在64KB页面大小的内存段中时,这个64KB的页表项会变为invalid,对应的4KB的也表项会变为Valid。
下图展示了存在被0级页表覆盖的同一段虚拟地址上的一个4KB的Allocation和一个64KB对齐的Allocation,并且这个内存段都支持64KB页面。