window 显示驱动开发-线性伸缩空间段

线性伸缩空间段类似于线性内存空间段。 但是,伸缩空间段只是地址空间,不能容纳位。

若要保存位,必须分配系统内存页,并且必须重定向地址空间范围以引用这些页面。 内核模式显示微型端口驱动程序(KMD)必须实现 DxgkDdiBuildPagingBuffer 函数,以便DXGK_OPERATION_MAP_APERTURE_SEGMENT和DXGK_OPERATION_UNMAP_APERTURE_SEGMENT操作类型来处理重定向,并且必须按 Display Miniport Driver Driver Driver 的 DriverEntry 中所述公开此函数。 Dxgkrnl 使用要重定向的地址空间范围和引用已分配的物理系统内存页的 MDL 调用 DxgkDdiBuildPagingBuffer 。

KMD 通常通过编程页表(对于视频内存管理器(VidMm)未知)来实现地址空间范围的重定向。

驱动程序必须在DXGK_SEGMENTDESCRIPTOR结构的 Flags 成员中设置 Aperture 位字段标志,以指定线性伸缩空间段。 驱动程序还可以设置以下位字段标志来指示其他段支持:

  • CpuVisible 指示该段是 CPU 可访问的。
  • CacheCoherent 指示该段与段重定向到的页面的 CPU 保持缓存一致性。

下图显示了线性光圈空间段的可视表示形式。

 1. 核心特性

特性说明
虚拟地址空间仅为地址范围,不包含实际内存(需动态映射物理页)。
动态重定向通过 DxgkDdiBuildPagingBuffer 将虚拟地址绑定到系统内存页(MDL 描述)。
CPU 默认可见通常用于 CPU 频繁访问的资源(如动态缓冲区)。
缓存一致性可选通过 CacheCoherent 标志保持 CPU-GPU 缓存同步

 2. 段描述符配置(DXGK_SEGMENTDESCRIPTOR)

(1) 基础配置

DXGK_SEGMENTDESCRIPTOR Segment = {.Flags       = DXGK_SEGMENT_FLAGS_APERTURE, // 声明为光圈段.BaseAddress = 0x10000000, // 虚拟地址起始.Size        = 0x20000000, // 512MB.SegmentId   = 2, 
};

(2) 可选标志

标志作用适用场景
DXGK_SEGMENT_FLAGS_CPU_VISIBLE允许 CPU 访问(通常默认启用)CPU-GPU 共享数据
DXGK_SEGMENT_FLAGS_CACHE_COHERENT强制缓存一致性避免手动刷新缓存(如 ARM GPU)

示例(缓存一致的线性光圈段):

{.Flags       = DXGK_SEGMENT_FLAGS_APERTURE | DXGK_SEGMENT_FLAGS_CACHE_COHERENT,.BaseAddress = 0x30000000,.Size        = 0x10000000, // 256MB.SegmentId   = 3,
}

3. 内存映射流程

(1) 分配虚拟地址范围

  • 应用程序请求内存(如 ID3D12Resource 创建)。
  • VidMm 选择伸缩段,分配虚拟地址(GPU VA)。

(2) 物理页绑定(重定向)
VidMm 调用 DxgkDdiBuildPagingBuffer,传入:

  • 操作类型:DXGK_OPERATION_MAP_APERTURE_SEGMENT(映射)或 UNMAP(解除映射)。
  • MDL(Memory Descriptor List):描述系统内存物理页。
  • 虚拟地址范围:需绑定的 GPU VA。

KMD 实现重定向:

  • 编程 GPU 页表,将 GPU VA 映射到 MDL 中的物理页。
  • 若启用 CACHE_COHERENT,需配置 GPU 缓存策略。

代码示例(映射操作):

NTSTATUS DxgkDdiBuildPagingBuffer(DXGKARG_BUILDPAGINGBUFFER* pArgs) {if (pArgs->Operation == DXGK_OPERATION_MAP_APERTURE_SEGMENT) {// 获取 MDL 中的物理页PHYSICAL_ADDRESS physAddr = MmGetMdlPfnArray(pArgs->pMdl)[0];// 编程 GPU 页表ProgramGpuPageTable(pArgs->VirtualAddress, physAddr);}return STATUS_SUCCESS;
}

4. 典型应用场景

(1) 动态顶点/索引缓冲区
需求:CPU 每帧更新数据,GPU 读取。

配置:

{.Flags       = DXGK_SEGMENT_FLAGS_APERTURE | DXGK_SEGMENT_FLAGS_CACHE_COHERENT,.BaseAddress = 0x20000000,.Size        = 0x08000000, // 128MB
}

(2) 分页资源(Pageable Resources)
需求:按需加载大型纹理。

流程:

  • 初始分配虚拟地址(不绑定物理页)。
  • 访问时触发缺页中断,VidMm 调用 DxgkDdiBuildPagingBuffer 动态映射。

(3) 多 GPU 共享资源

  • 需求:数据在多个 GPU 间迁移。
  • 优势:虚拟地址固定,仅需更新物理页映射。

5. 驱动开发注意事项

(1) 页表管理

  • GPU 页表独立于 CPU:需驱动自行维护 GPU MMU(内存管理单元)的页表。
  • TLB 一致性:映射/解除映射后,需无效化 GPU TLB(如通过 DXGK_INVALIDATE_TLB)。

(2) 性能优化

  • 批处理映射操作:合并多次映射请求,减少 GPU 上下文切换。
  • 避免过度分片:尽量分配连续物理页(减少页表项数量)。

(3) 错误处理

  • 物理页不足:返回 STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER。
  • 非法虚拟地址:验证 VirtualAddress 是否在段范围内。

6. 与线性内存空间段的对比

特性线性光圈空间段线性内存空间段
物理内存动态绑定系统内存页直接分配显存
地址转换需 GPU 页表映射直接访问(无转换)
CPU 访问默认支持需显式启用 (CPU_VISIBLE)
性能较低(转换开销)高(零开销)
适用场景CPU 频繁写、分页资源高性能渲染目标

7. 可视化表示

GPU 虚拟地址空间:
0x10000000 ┌───────────────────────┐ ← 光圈段起始(BaseAddress)│   Virtual Range       │ │   (No Physical Memory)│ ├───────────────────────┤ ← 映射操作后│   Mapped to           │ │   System Memory (MDL) │ ← 物理页动态绑定
0x30000000 └───────────────────────┘ ← 段结束

8. 总结

线性伸缩空间段 = 虚拟地址 + 动态物理页绑定,适用于需灵活内存管理的场景。

关键驱动实现:

  • 处理 DXGK_OPERATION_MAP_APERTURE_SEGMENT/UNMAP 操作。
  • 维护 GPU 页表,确保地址转换正确。

优势:

  • 支持 CPU 高效读写。
  • 实现按需分页和资源共享。

通过合理使用伸缩段,驱动程序可以在保证功能性的同时,优化复杂应用场景下的内存利用率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cadence 高速系统设计流程及工具使用三

5.8 约束规则的应用 5.8.1 层次化约束关系 在应用约束规则之前,我们首先要了解这些约束规则是如何作用在 Cadence 设计对象上的。Cadence 中对设计对象的划分和概念,如表 5-11 所示。 在 Cadence 系统中,把设计对象按层次进行了划分&#…

ScaleTransition 是 Flutter 中的一个动画组件,用于实现缩放动画效果。

ScaleTransition 是 Flutter 中的一个动画组件,用于实现缩放动画效果。它允许你对子组件进行动态的缩放变换,从而实现平滑的动画效果。ScaleTransition 通常与 AnimationController 和 Tween 一起使用,以控制动画的开始、结束和过渡效果。 基…

深入解析:如何基于开源p-net快速开发Profinet从站服务

一、Profinet协议与软协议栈技术解析 1.1 工业通信的"高速公路" Profinet作为工业以太网协议三巨头之一,采用IEEE 802.3标准实现实时通信,具有: 实时分级:支持RT(实时)和IRT(等时实时)通信模式拓扑灵活:支持星型、树型、环型等多种网络结构对象模型:基于…

m个n维向量组中m,n的含义与空间的关系

向量的维度与空间的关系&#xff1a; 一个向量的维度由其分量个数决定&#xff0c;例如 ( n ) 个分量的向量属于 Rn空间 。 向量组张成空间的维度&#xff1a; 当向量组有 ( m ) 个线性无关的 ( n ) 维向量时&#xff1a; 若 ( m < n )&#xff1a; 这些向量张成的是 Rn中的…

excel大表导入数据库

前文介绍了数据量较小的excel表导入数据库的方法&#xff0c;在数据量较大的情况下就不太适合了&#xff0c;一个是因为mysql命令的执行串长度有限制&#xff0c;二是node-xlsx这个模块加载excel文件是整个文件全部加载到内存&#xff0c;在excel文件较大和可用内存受限的场景就…

Python 爬虫基础入门教程(超详细)

一、什么是爬虫&#xff1f; 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称网页蜘蛛&#xff0c;是一种自动抓取互联网信息的程序。爬虫会模拟人的浏览行为&#xff0c;向网站发送请求&#xff0c;然后获取网页内容并提取有用的数据。 二、Python爬虫的基本原…

Spring Security 深度解析:打造坚不可摧的用户认证与授权系统

Spring Security 深度解析&#xff1a;打造坚不可摧的用户认证与授权系统 一、引言 在当今数字化时代&#xff0c;构建安全可靠的用户认证与授权系统是软件开发中的关键任务。Spring Security 作为一款功能强大的 Java 安全框架&#xff0c;为开发者提供了全面的解决方案。本…

【物联网】基于树莓派的物联网开发【1】——初识树莓派

使用背景 物联网开发从0到1研究&#xff0c;以树莓派为基础 场景介绍 系统学习Linux、Python、WEB全栈、各种传感器和硬件 接下来程序猫将带领大家进军物联网世界&#xff0c;从0开始入门研究树莓派。 认识树莓派 正面图示&#xff1a; 1&#xff1a;树莓派简介 树莓派…

第21节:深度学习基础-激活函数比较(ReLU, Sigmoid, Tanh)

1. 引言 在深度学习领域,激活函数是神经网络中至关重要的组成部分 它决定了神经元是否应该被激活以及如何将输入信号转换为输出信号 激活函数为神经网络引入了非线性因素,使其能够学习并执行复杂的任务 没有激活函数,无论神经网络有多少层,都只能表示线性变换,极大地限…

Fiori学习专题三十:Routing and Navigation

实际上我们的页面是会有多个的&#xff0c;并且可以在多个页面之间跳转&#xff0c;这节课就学习如何在不同页面之间实现跳转。 1.修改配置文件manifest.json&#xff0c;加入routing&#xff0c;包含三个部分&#xff0c;config,routes,targets; config &#xff1a; routerC…

【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?

在“HarmonyOS NEXTAI大模型打造智能助手APP(仓颉版)”课程里面&#xff0c;有学员提到了这样一个问题&#xff1a; 鸿蒙的主推开发语言不是ArkTS吗&#xff0c;本课程为什么使用的是仓颉编程语言&#xff1f; 这里就这位同学的问题&#xff0c;统一做下回复&#xff0c;以方便…

Booth Encoding vs. Non-Booth Multipliers —— 穿透 DC 架构看乘法器的底层博弈

目录 &#x1f9ed; 前言 &#x1f331; 1. Non-Booth 乘法器的实现原理&#xff08;也叫常规乘法器&#xff09; &#x1f527; 构建方式 ✍️ 例子&#xff1a;4x4 Non-Booth 乘法器示意 &#x1f9f1; 硬件结构 ✅ 特点总结 ⚡ 2. Booth Encoding&#xff08;布斯编码…

GET请求如何传复杂数组参数

背景 有个历史项目&#xff0c;是GET请求&#xff0c;但是很多请求还是复杂参数&#xff0c;比如&#xff1a;参数是数组&#xff0c;且数组中每一个元素都是复杂的对象&#xff0c;这个时候怎么传参数呢&#xff1f; 看之前请求直接是拼接在url后面 类似&items%5B0%5D.…

iOS App 安全性探索:源码保护、混淆方案与逆向防护日常

iOS App 安全性探索&#xff1a;源码保护、混淆方案与逆向防护日常 在 iOS 开发者的日常工作中&#xff0c;我们总是关注功能的完整性、性能的优化和UI的细节&#xff0c;但常常忽视了另一个越来越重要的问题&#xff1a;发布后的应用安全。 尤其是对于中小团队或独立开发者&…

A* (AStar) 寻路

//调用工具类获取路线 let route AStarSearch.getRoute(start_point, end_point, this.mapFloor.map_point); map_point 是所有可走点的集合 import { _decorator, Component, Node, Prefab, instantiate, v3, Vec2 } from cc; import { oops } from "../../../../../e…

深度解析动态IP业务核心场景:从技术演进到行业实践

引言&#xff1a;动态IP的技术演进与行业价值 在数字化转型加速的今天&#xff0c;IP地址已从单纯的网络标识演变为支撑数字经济的核心基础设施。动态IP作为灵活高效的地址分配方案&#xff0c;正突破传统认知边界&#xff0c;在网络安全防护、数据价值挖掘、全球业务拓展等领…

MySQL 性能调优:从执行计划到硬件瓶颈

MySQL 性能调优&#xff1a;从执行计划到硬件瓶颈 一、性能调优的宏观视角与核心挑战 在数字化浪潮下&#xff0c;企业数据量呈指数级增长&#xff0c;MySQL 作为主流关系型数据库&#xff0c;面临着巨大的性能压力。某电商平台日均订单量突破千万&#xff0c;高峰期数据库响…

开源数字人框架 AWESOME - DIGITAL - HUMAN:技术革新与行业标杆价值剖析

一、项目核心价值:解锁数字人技术新境界 1. 技术普及:降低准入门槛,推动行业民主化 AWESOME - DIGITAL - HUMAN 项目犹如一场技术春雨,为数字人领域带来了普惠甘霖。它集成了 ASR、LLM、TTS 等关键能力,并提供模块化扩展接口,将原本复杂高深的数字人开发流程,转化为一…

robotframe启动ride.py

我的双击ride.py会自动用pycharm打开&#xff0c;变成代码文件 解决方法&#xff1a;定位到ride.py所在文件夹&#xff08;在anaconda的scripts里面&#xff09;&#xff0c;文件夹上方输入cmd 再输入该命令即可

怎样简单实现不同数据库的表间的 JOIN 运算

数据分析涉及不同业务系统时就要做跨库计算&#xff0c;而表间 JOIN 是最麻烦的&#xff0c;很多数据库都不具备这样的能力&#xff0c;用 Java 取数再计算又太复杂。用 esProc 完成跨库 JOIN 会简单很多。 数据与用例 车辆管理系统&#xff08;DB_Vehicle&#xff09;保存了…