Windows 图形显示驱动开发-WDDM 2.0功能 64KB页面支持

64KB 页面支持

从 WDDM 2.0 (Windows 显示驱动程序模型) 开始,WDDM 提供两种类型的叶页表以支持 64KB 页:

  1. 支持 4 KB 页表条目的叶页表 (PTE) 。
  2. 支持 64 个 PTE 的叶页表。

这两个 PTE 大小涵盖相同的虚拟地址范围,因此 4KB 页的页表的条目数是 64 KB 页表的 16 倍。

64 KB 页表的大小由 DXGK_GPUMMUCAPS::LeafPageTableSizeFor64KPagesInBytes 定义。

UpdatePageTable 操作具有DXGK_UPDATEPAGETABLEFLAGS] (/windows-hardware/drivers/ddi/d3dkmddi/ns-d3dkmddi-_dxgk_updatepagetableflags) ::Use64KBPages 标志,指示要更新的页表的类型。

WDDM 2.0+ 支持两种操作模式:

  1. 级别 1 页表的 PTE 指向 4 KB 页表或 64 KB 页表。
  2. 级别 1 页表的 PTE 同时指向 4 KB 页表和 64 KB 页表。 这称为"双 PTE"模式。 双 PTE 支持由 DXGK_GPUMMUCAPS::DualPteSupported cap 表示。

视频内存管理器根据分配对齐方式、图形处理单元 (GPU) 内存段属性以及 GPU 内存段类型来选择页面大小。 如果其对齐方式和大小是 64 KB 的倍数,并且驻留在支持 64 KB 页的内存段中,则它使用 64 KB 页映射分配

单 PTE 模式

在此模式下,级别 1 页表的 PTE 指向 4 KB 页表或 64 KB 页表。

DXGK_PTE::PageTablePageSize 字段将添加到 DXGK_PTE。 它仅应用于旧术语) 中第 1 级页表 (页目录的 PTE。 此字段使用 64KB 或 4KB 页) 告知内核模式驱动程序相应页表的类型 (。

在以下情况下,视频内存管理器选择对虚拟地址范围使用 64 KB 页表:

  1. 只有 64 KB 的对齐分配映射到该范围。
  2. 映射到范围的所有分配的内存段支持 64 KB 页。

例如,当虚拟地址范围由 64 KB 页映射,并且上述条件 (不再有效时,) 将分配提交到系统内存段,视频内存管理器将从 64 KB 页表切换到 4 KB 页表。

例如,当页表只有 64 KB PTE 且 PTE 需要指向 4KB 页 (时,将分配放置在系统内存中) ,页表将转换为使用 4 KB PTE。

完成转换的方式如下:

  1. 进程的所有上下文都暂停。
  2. 现有 PTE 更新为指向 4KB 页面。 驱动程序将获取 UpdatePageTable 分页操作。
  3. 将更新指向页表的级别 1 PTE,以反映 pageTablePageSize = DXGK_PTE_PAGE_TABLE_PAGE_4KB) (新的页面大小。 驱动程序将获取 UpdatePageTable 分页操作。
  4. 进程的所有上下文都会恢复。

无法从具有 4KB PTE 的页面表转换为具有 64KB PTE 的页面表。

若要防止在不同页表大小之间频繁切换,驱动程序应将少量分配打包在一起。

双 PTE 模式

在此模式下,级别 1 页表的 PTE 可能同时指向 4 KB 页表和 64 KB 页表。

级别 1 页表的条目中的两个指针可能设置了 "有效" 标志,但级别 0 页表中涵盖相同 64 KB 虚拟地址范围的条目不能同时有效。

将 64 KB PTE 涵盖的分配置于页大小为 64 KB 的内存段时,64 KB PTE 将变为无效,相应的 4 KB PTE 将变为有效。

在下图中,4 KB 分配和 64 KB 对齐的分配位于级别 0 页表涵盖的相同虚拟地址范围中,以及支持 64 KB 页的段。

相关推荐
正点原子3 天前
【正点原子Linux连载】 第十章 pinctrl和gpio子系统实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
星马梦缘3 天前
“零一”智能硬件开发挑战赛 宣传稿
驱动开发·智能硬件·活动·培训·科协
小此方4 天前
Re:Linux系统篇(五十四)线程篇 · 七:互斥锁的底层实现原理:从硬件上下文、原子交换指令(Swap)到并发封装实战
linux·运维·驱动开发
芯片设计-曾工5 天前
当精准脉冲遇上清晰视界——CH2205E模块与YL1621的“黄金搭档“
驱动开发·stm32·单片机·51单片机·硬件工程
平凡的小蚂蚁7 天前
Exynos4412-POP-7inLCD裸机开发完整教程(STM32 库风格)
驱动开发·stm32·单片机·嵌入式硬件·嵌入式·硬件工程
小此方7 天前
Re:Linux系统篇(五十二)线程篇 · 五:直击 Linux 内核底层:TCB 与 LWP 一体两面全解析(附自定义线程封装)
linux·运维·驱动开发
胡八一7 天前
虚拟串口com0com安装教程
驱动开发·stm32·单片机
智者知已应修善业7 天前
【三位数字显示计时定时器设计-同步方式】2025-6-30
驱动开发·经验分享·笔记·硬件架构·硬件工程
zhangfeng11338 天前
AI编程范式:从Vibe Coding(氛围编程)向SDD规范驱动开发演进全解析
人工智能·驱动开发·ai编程
JNX_SEMI8 天前
Hi5000Q/H 6.5~75V宽输入——与H5227A完全对等,无缝适配现有电源方案-聚能芯-智芯官方授权一级代理
驱动开发·单片机·嵌入式硬件·物联网·硬件工程