系统分页进程

大多数分页操作发生在系统分页进程的上下文中。 唯一的例外是来自 UpdateGpuVirtualAddress 回调的页表更新,该回调在特殊配套上下文中发生,呈现时同步发生。

DirectX 图形内核使用系统分页过程来执行分页操作,例如:

  • 系统和本地图形处理单元 (GPU) 内存之间的传输分配
  • 使用模式填充分配
  • 更新页表
  • 将分配映射到光圈段
  • 刷新翻译旁观缓冲区

分页进程有自己的 GPU 虚拟地址空间、GPU 上下文和直接内存访问 (DMA) 缓冲区 (称为分页缓冲区) 。 它有自己的页表,这些表固定在物理内存中,仅在电源转换期间才被逐出。

分页进程的虚拟地址空间具有预定义的布局,在适配器初始化期间初始化,每次内存内容因电源转换而丢失时都会初始化。

显示系统分页过程中虚拟地址空间与物理地址空间之间的关系的关系图。

DirectX 图形内核初始化根页表中足够的页表和页表条目,以覆盖 1 GB 虚拟地址空间。 暂存区域用于将传输和填充操作期间的分配临时映射到分页进程虚拟地址空间。 如果分配不适合虚拟地址暂存区域,则传输操作将以区块方式完成。

为分页过程创建系统根页表分配。 其内容在初始化期间设置,除非) 电源转换后,否则永远不会 (更改。

系统进程的页表分为两个部分:

将创建 一个系统页表 ,该表将 暂存区域页表 反映到系统进程的地址空间中。 这允许系统进程修改暂存区域页表,并根据需要从暂存区域映射/取消映射内存。 页表的内容在适配器初始化期间设置,永远不会更改。 暂存区页表页表条目用于将分配映射到分页过程的虚拟地址空间。 它们在初始化期间初始化为 无效 ,稍后将用于分页操作。 分页过程的页表在适配器初始化和开机事件期间通过 UpdatePageTable 分页操作进行初始化。 对于这些操作, PageTableUpdateMode 将强制 CPU_VIRTUAL ,并且必须使用 CPU 立即完成 (不应) 使用分页缓冲区。

所有其他进程的页表条目汇报使用驱动程序指定的 PageTableUpdateMode 完成。 这些更新是在分页过程的上下文中完成的。

设置的完成方式如下:

  1. 创建根页表分配和较低级别的页表分配,以涵盖 1 GB 的地址空间。
  2. 分配将提交到内存段。
  3. 向驱动程序发出多个 UpdatePageTable 分页操作以初始化页表条目。

作为分页进程虚拟地址空间初始化的示例,让我们考虑以下参数的情况:

  • 页面大小为 4096 字节
  • 分页进程虚拟地址空间为 1 GB
  • 页表条目大小为 4 个字节

在这种情况下,我们需要一个由以下组成的 2 级转换方案:

  • 一个系统根页表
  • 一个系统页表
  • 255 临时区域页表

下图显示了如何基于根页表的位置和物理内存中的页表初始化页表。 请注意,物理地址仅作为图示提供。 页表包含 4 MB 的地址空间。 因此,系统页表涵盖所有暂存区域页表。 暂存区域从 4 MB 虚拟地址开始。

如你所看到的,虚拟地址范围从 0 到 4095 将无效。

说明 2 级转换方案中页表初始化过程的关系图。