Windows 图形显示驱动开发-WDDM 3.0功能- IOMMU DMA 重新映射(一)

embedded/2025/3/14 5:45:31/

概述

直到 WDDM 3.0,Dxgkrnl 仅支持通过 1:1 物理重新映射实现 IOMMU 隔离,这意味着 GPU 访问的逻辑页被转换为相同的物理页码。 IOMMU DMA 重新映射允许 GPU 通过不再以 1:1 映射的逻辑地址访问内存。 相反,Dxgkrnl 能够提供逻辑上连续的地址范围。

Dxgkrnl 对 GPU 施加限制:GPU 必须能够访问所有物理内存才能启动设备。 如果 GPU 的最高可见地址不超过系统上安装的最高物理地址,则 Dxgkrnl 将无法初始化适配器。 即将推出的服务器和高端工作站可以配置超过 1 TB 的内存,突破了许多 GPU 常见的 40 位地址空间限制。 DMA 重新映射用作允许 GPU 在此环境中工作的机制。

在启动时,Dxgkrnl 通过将设备的最高可访问物理地址与系统上安装的内存进行比较来确定是否需要逻辑重新映射。 如有必要,DMA 重新映射用于将 GPU 可见边界内的逻辑地址范围映射到系统上的任何物理内存。 例如,如果 GPU 限制为 1 TB,则 Dxgkrnl 将从 [0, 1 TB) 分配逻辑地址,然后可以通过 IOMMU 映射到系统上的任何物理内存。

逻辑适配器与物理适配器

Dxgkrnl 区分逻辑适配器和物理适配器的概念。 物理适配器代表一个单独的硬件设备,它可能与 LDA 链中的其他设备链接。 逻辑适配器表示一个或多个链接的物理适配器。

每个逻辑适配器创建一个 IOMMU DMA 域,并将其连接到所有链接的物理适配器。 因此,所有物理适配器共享相同的域和相同的物理内存视图。

集成 GPU 与离散 GPU 支持

由于 IOMMU DMA 重新映射对集成 GPU 几乎没有价值,因此,根据定义,集成 GPU 应该已经被设计为访问系统中的所有物理内存,因此在集成部件上实现支持是可选的,但建议这样做。

离散 GPU 必须支持 IOMMU DMA 重新映射,这是 WDDM 3.0 认证的要求。

DDI 更改

为了支持 IOMMU DMA 重新映射,进行了以下 DDI 更改。

驱动程序功能

需要两组驱动器上限来支持线性重新映射:

  1. 驱动程序必须通知 Dxgkrnl 其物理内存限制;即,通过 DXGKQAITYPE_PHYSICAL_MEMORY_CAPS 及其关联的 DXGK_PHYSICAL_MEMORY_CAPS 结构,可以获得其最高可见物理地址。
  2. 驱动程序必须通过 DXGKQAITYPE_IOMMU_CAPS 及其关联的 DXGK_IOMMU_CAPS 结构表示其对 IOMMU 线性重新映射的支持。 通过指示支持,驱动程序指示支持和使用稍后介绍的所有 DDI。

在 Dxgkrnl 通过 DXGKDDI_START_DEVICE 启动设备之前,必须提供这两个上限,以便可以在访问任何内存之前创建设备并将其连接到 IOMMU 域。 只有当设备不引用任何现有物理内存时,才能进行线性重新映射。

独占访问

IOMMU 域的连接和分离速度极快,但目前还不是原子的。 这种情况意味着,在交换到具有不同映射的 IOMMU 域时,不能保证通过 PCIe 发出的事务能够正确转换。

为了处理这种情况,从 Windows 10 版本 1803 (WDDM 2.4) 开始,KMD 必须实现以下 DDI 对,以便 Dxgkrnl 调用:

  • 将调用 DxgkDdiBeginExclusiveAccess,以通知 KMD IOMMU 域切换即将发生。
  • DxgkDdiEndExclusiveAccess 在 IOMMU 域切换完成后调用。

每当设备切换到新的 IOMMU 域时,驱动程序必须确保其硬件保持无提示。 也就是说,驱动程序必须确保在这两次调用之间不会从设备读取或写入系统内存。

在这两个调用之间,Dxgkrnl 做出以下保证:

  • 计划程序已挂起。 所有活动工作负载都被刷新,并且不会向硬件发送或在硬件上计划新的工作负载。
  • 没有进行其他 DDI 调用。

作为这些调用的一部分,驱动程序可以选择在独占访问期间禁用和禁止中断(包括 Vsync 中断),即使没有 OS 的明确通知。


http://www.ppmy.cn/embedded/172422.html

相关文章

PGSQL基本使用

PGSQL基本使用 文章目录 PGSQL基本使用日期转换长度不够补数获取上下行取连续的开始和结束的值 日期转换 格式说明YYYY年MM月DD日hh2424小时制mi分钟ss秒 -- 日期字符串转指定日期字符串 -- 20250101123000 转为 2025-01-01 12:30:00 select to_char(to_timestamp(2025010112…

江科大51单片机笔记【15】直流电机驱动(PWM)

写在前言 此为博主自学江科大51单片机(B站)的笔记,方便后续重温知识 在后面的章节中,为了防止篇幅过长和易于查找,我把一个小节分成两部分来发,上章节主要是关于本节课的硬件介绍、电路图、原理图等理论…

vscode 好用插件

一、通用效率类 1. Auto Rename Tag 在编写 HTML 或 XML 代码时,当你修改一个标签的名称,它会自动同步修改对应的结束标签,节省了手动修改的时间,提高了代码的准确性和编写效率。 2. Bracket Pair Colorizer 为代码中的括号对…

计算机网络--访问一个网页的全过程

文章目录 访问一个网页的全过程应用层在浏览器输入URL网址http://www.aspxfans.com:8080/news/index.aspboardID5&ID24618&page1#r_70732423通过DNS获取IP地址生成HTTP请求报文应用层最后 传输层传输层处理应用层报文建立TCP连接传输层最后 网络层网络层对TCP报文进行处…

大模型语音生成入门(基于cosyvoice)

主要参考资料: 从离散编码到语音生成:深入浅出CosyVoice语音生成大模型: https://www.bilibili.com/video/BV1oS411c76o?spm_id_from333.788.videopod.sections&vd_sourceef5b6d43cf1d4ed823db3e9133e97d2d 目录 语音合成 与 大模型语音生成cosyvoi…

openai-cua-sample-app - 使用计算机的 Agent示例应用

文章目录 一、关于 openai-cua-sample-app概述抽象 二、设置与运行三、CLI 使用运行示例(可选) 四、计算机环境Docker 设置主机环境设置 五、函数调用风险与安全考虑 一、关于 openai-cua-sample-app CUA : Computer Using Agent (CUA) 开始使用 OpenA…

使用websocket,注入依赖service的bean为null

问题:依赖注入失败,service获取不到,提示null 这是参考代码 package com.shier.ws;import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.google.gson.Gson; import com.s…

色板在数据可视化中的创新应用

色板在数据可视化中的创新应用:基于色彩感知理论的优化实践 引言 在数据可视化领域,色彩编码系统的设计已成为决定信息传递效能的核心要素。根据《Nature》期刊2024年发布的视觉认知研究,人类大脑对色彩的识别速度比形状快40%,色…