Windows 图形显示驱动开发-CPU 内存调节和64KB 页面支持

news/2025/2/22 1:29:25

对于 32 位 OS 离散图形处理单元 (GPU) 不支持可调整大小的 BAR,或者当调整帧缓冲区 BAR 的大小失败时,Windows 显示驱动程序模型 (WDDM) v2 将提供一种替代机制,通过该机制可以有效地访问离散 GPU VRAM。 对于支持可编程 BAR 地址空间的 GPU,WDDM v2 中引入了新的 CPU 主机内存调节功能来抽象该功能。

内存调节

公开 CPU 主机内存调节时,内核模式驱动程序会为每个支持 CPU 主机内存调节的段填充新的 DXGK_CPUHOSTAPERTURE 上限结构。 这定义了 CPU 主机内存调节的大小,这允许驱动程序保留一些 BAR 供内部使用。 页大小与内存段的 GPU 页相同。

然后,内核模式驱动程序公开两个新的设备驱动程序接口, (DDI) 来管理 BAR 地址空间,尤其是 DxgkDdiMapCpuHostAperture 和 DxgkDdiUnmapCpuHostAperture。

CPU 主机内存调节后面的页表的内存由驱动程序管理,并在驱动程序初始化期间提前设置。 DxgkDdiMapCpuHostAperture 和 DxgkDdiUnmapCpuHostAperture 预期在段枚举后立即正常运行,并在视频内存管理器初始化期间使用,以在适配器初始化期间将 CPU 虚拟地址映射到系统分页进程的页目录和页表。

当需要 CPU 访问内存段时,视频内存管理器会保留 CPU 主机 Aperture 中的页,并通过它映射内存段页。 下面对此做了演示。

在链接的显示适配器配置中,除以下内容外,内容看起来类似。

默认 或 LinkMirrored 分配始终映射到 GPU0。
LinkInstanced 分配的虚拟地址范围为 AllocationSize*NumberOfGPUInLink ,这些地址范围与映射到不同 GPU 的分配的各个部分相关联。
下图说明了这一点:

 64KB 页面支持

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

支持 4 KB 页表条目的叶页表 (PTE) ;
支持 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 页表的 PTE 指向 4 KB 页表或 64 KB 页表;
  • 级别 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 页表:

  • 只有 64 KB 的对齐分配映射到该范围;
  • 映射到范围的所有分配的内存段支持 64 KB 页;

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

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

完成转换的方式如下:

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

无法从具有 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 页的段。


http://www.niftyadmin.cn/n/5861492.html

相关文章

数据库配置文件

达梦数据库 修改dm.ini中的COMPATIBLE_MODE4,然后重启数据库 vi /dm8/data/DAMENG/dm.ini人大金仓数据库 修改kingbase.conf中的sql_mode‘’,然后重启数据库 vi /opt/package/Kingbase/ES/V8/data/kingbase.conf

[数据结构]单链表详解

目录 一、顺序表的问题及思考 二、单链表的实现 1.结构体内容的定义(typedef struct SListNode) 2.链表的打印(void SLTPrint(SLTNode* phead)) ​编辑3.链表的尾插(void SLPushBack(SLTNode* phead, SLTDataType…

设计模式教程:外观模式(Facade Pattern)

1. 外观模式的定义 外观模式属于结构型设计模式,它定义了一个高层接口,使得子系统的接口变得更加简单。外观模式通过将子系统复杂的逻辑隐藏在一个外部的接口(外观类)中,简化了客户端与子系统之间的交互。 外观模式的…

learngit git常用指令

learngit & git常用指令 目录 learngit & git常用指令1.add && commit2.status && diff3.log && reset && reflog4.Repositoty(版本库)5.checkout6.rm7.github(push && rm)8.clone9.branch && switch && merg…

硬件学习笔记--46 电能表影响量试验梳理

目录 1.电流和电压电路中的谐波影响试验 1)电流和电压电路中谐波——第5次谐波试验 2)电流和电压电路中谐波——方顶波波形试验 3)​​​​​​​电流和电压电路中谐波——尖顶波波形试验 4)​​​​​​​电流和电压电路中谐…

打造高效的Web Scraper:Python与Selenium的完美结合

在数据驱动的时代,招聘信息不仅是求职者和企业之间的重要桥梁,更是洞察各行业动态的关键数据来源。BOSS直聘作为领先的招聘平台,其丰富的职位信息不仅吸引了大量用户,还为大数据分析师提供了宝贵的行业动态分析素材。然而&#xf…

AutoDock CrankPep or ADCP进行蛋白质多肽对接

需求描述 使用AutoDock CrankPep or ADCP进行蛋白质多肽对接 硬件及系统配置 自用电脑型号如下: 电脑:Precision Tower 7810 (Dell Inc.) CPU : Intel Xeon CPU E5-2686 v4 2.30GHz GPU: NVIDIA GeForce GTX 1070 Linux版本&a…

ue5 Arch vis AI traffic system 车辆系统添加不同种类的车

一、前置条件 资源包拥有二、步骤 添加第二辆车 在父级蓝图底下创建子级蓝图 打开子级蓝图 替换骨骼网格体 创建动画蓝图,骨骼选择该骨骼网格体的骨骼 连接动画蓝图 添加动画蓝图 添加资源包