GpuMmu Example Scenarios
这里列出了更新页表项映射属于一个进程P的Allocation到物理内存的一系列的操作。这里假设页表资源已经resident在GPU的内存段中了。
1.VMM为进程P的根页表资源分配一段在换页进程上下文的虚拟地址。
2.VMM为进程P的页表资源分配一段在换页进程上下文的虚拟地址。
3.VMM调用 DxgkDdiBuildPagingBuffer 以及UpdatePageTable 命令用映射换页进程页表项到进程P的页表和页目录。
4.VMM调用 DxgkDdiBuildPagingBuffer以及FlushTLB(PagingProcessRootPageTable) 命令。
5.VMM调用 DxgkDdiBuildPagingBuffer 以及 UpdatePageTable 命令来使用物理地址信息来填充进程页表项。
6.VMM调用 DxgkDdiBuildPagingBuffer 以及FlushTLB(process P root page table) 命令。
7.换页buffer被提交到换页进程上下文中准备执行。
Transferring allocation content from one location to another
这里列出了一个Allocation内容从一个位置传输到另一个位置(例如从本地内存到系统内存) 的一系列操作。
1.VMM在换页进程虚拟地址Scratch区域中分配一段虚拟内存给源allocation和目标allocation。
2.VMM调用 DxgkDdiBuildPagingBuffer 以及 UpdatePageTable 命令,这些命令映射用于源虚拟地址范围的换页进程页表项到本地GPU内存中的Allocation的物理地址上。
3.VMM调用DxgkDdiBuildPagingBuffer 以及 UpdatePageTable命令,这些命令映射用于目标的虚拟地址的换页进程页表项到系统内存中。
4.VMM调用 DxgkDdiBuildPagingBuffer以及FlushTLB(paging process root page table)。y
5.VMM调用 DxgkDdiBuildPagingBuffer 以及TransferVirtual命令来完成传输操作。
6.换页buffer被提交到了GPU,并在换页进程上下文中执行。
Filling an allocation with a pattern
下面列出了当Allocation需要被填充pattern时所进行的操作流程。
1.VMM在换页进程虚拟地址Scratch区域中给目标Allocation分配一段虚拟地址范围。
2.VMM调用 DxgkDdiBuildPagingBuffer 以及UpdatePageTable命令。这个命令映射用于目的虚拟地址的换页进程页表项。
3.VMM调用 DxgkDdiBuildPagingBuffer 以及 FlushTLB(paging process root page table)命令。
4.VMM调用 DxgkDdiBuildPagingBuffer 以及FillVirtual命令来完成执行填充操作。
5.换页Buffer被提交到GPU中,并在换页进程上下文中执行。
Making an allocation resident in system memory
当D3DKMTMakeResident被调用使Allocation resident时,下面的操作会被执行。假设应用程序进程页表已经resident在内存中了。
在应用程序线程上下文中:
1.分配以及固定(pin)物理系统内存页面给allocation的一段虚拟地址范围(如果这个Allocation时resident在系统内存中).
2.生成用于应用程序设备一个新的换页fence ID。
3.提交 MakeResident 命令到VMM工作线程。
4.返回到应用程序。
在VMM工作线程上下文中:
1.更新应用程序进程页表项。
2.如果Allocation时resident在本地内存段中,就给allocation填充0.
3.提交 SignalSynchronizationObject 命令和换页FenceID一起到调度器。
Initialization of the memory manager control structures
换页进程的初始化
Microsoft DXGK 在图形设备被切换到D0电源设备状态时会初始化换页进程虚拟地址空间。
1.换页进程在 DxgkDdiCreateProcess中被创建。
2.系统设备在 DxgkDdiCreateDevice中创建。在这个方法中KMD能在换页进程地址空间中保留一段的虚拟地址范围。
3.换页进程的页表allocation被创建。
4.页表Allocation被提交到内存段中,这个内存段定义在虚拟地址能力结构中。
5.UpdatePageTable 操作被调用,在其中初始化页表。
客户端进程初始化
当一个新的进程被创建,DXGK将做一下操作:
1.创建最初的一些页表资源
2.当第一个资源从进程中resident时,初始化这些页表资源。