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被提交到换页进程上下文中准备执行。

GpuMmu Example Scenarios(MSDN翻译)

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)。

5.VMM调用 DxgkDdiBuildPagingBuffer 以及TransferVirtual命令来完成传输操作。

6.换页buffer被提交到了GPU,并在换页进程上下文中执行。

GpuMmu Example Scenarios(MSDN翻译)

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中,并在换页进程上下文中执行。

GpuMmu Example Scenarios(MSDN翻译)

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时,初始化这些页表资源。

相关文章: