Windows 图形显示驱动开发-WDDM 3.2-本机 GPU 围栏对象(七)

围栏排队操作的 CPU 时间戳

鉴于以下情况,让 UMD 记录这些 CPU 时间戳没有什么好处:

  • 可以在 GPU 执行包括命令列表的命令缓冲区之前几分钟记录命令列表。
  • 这几分钟可能与同一命令缓冲区中的其他同步对象不同步。

将 CPU 时间戳包含在 UMD 向 GPU 写入的日志缓冲区的指令中是有代价的,因此 CPU 时间戳不包含在日志条目有效负载中。

相反,运行时或 UMD 可以在记录命令列表时发出带有 CPU 时间戳的本机围栏排队 ETW 事件。 因此,工具可以通过组合来自该新事件的 CPU 时间戳和来自日志缓冲区条目的 GPU 时间戳来构建围栏排队和已完成事件的时间线。

发出信号或取消阻止围栏时 GPU 上的操作顺序

UMD 必须确保在构建命令列表指示 GPU 发出信号/取消阻止围栏时保持以下顺序:

  • 将新围栏值写入围栏 GPU VA/CMP VA。
  • 将日志有效负载写入相应的日志缓冲区 GPU VA/CMP VA。
  • 如有必要,引发本机围栏信号中断。

此操作顺序确保当中断引发到 OS 时,Dxgkrnl 看到最近的日志条目。

允许日志缓冲区溢出

GPU 可以通过覆盖 OS 尚未看到的条目来溢出日志缓冲区。 它通过递增 WraparoundCount 来执行此操作。

当 OS 最终读取日志时,它可以通过将日志标头中的新 WraparoundCount 值与其缓存的值进行比较来检测是否发生了溢出。 如果发生溢出,OS 有以下回退选项:

  1. 为了在发生溢出时取消阻止围栏,OS 会扫描所有围栏,并确定哪些等待程序被取消阻止。
  2. 如果启用了跟踪,OS 可以在跟踪中发出标志,以通知用户事件丢失。 此外,启用跟踪后,OS 首先会增加日志缓冲区的大小,以防止首次溢出。

UMD 没有必要在处理日志缓冲区条目时实现回压支持。

日志缓冲区时间戳为空或重复

在一般情况下,Dxgkrnl 期望日志条目中的时间戳单调递增。 但是,在某些情况下,后续日志条目的时间戳为零或与以前的日志条目相同。

例如,在具有链接显示适配器的方案中,LDA 中的链接适配器之一可以跳过围栏写入操作。 在这种情况下,其日志缓冲区条目的时间戳为零。 Dxgkrnl 处理此类情况。 也就是说, Dxgkrnl 从不期望给定日志条目的时间戳小于上一个日志条目的时间戳;即,时间戳永远不会倒退。

相关推荐
Hacker_LaoYi2 小时前
Windows server网络安全
windows·安全·web安全
cainiaojunshi2 小时前
仿Manus一
windows·microsoft
xiatian_win1232 小时前
本地部署 OpenManus 保姆级教程(Windows 版)
人工智能·windows
菜鸟康3 小时前
Linux网络编程——UDP网络通信的简单实现
java·linux·windows
ぃ扶摇ぅ3 小时前
Windows系统编程项目(四)窗口管理器
windows
小灰灰__4 小时前
windows环境DBGPT0.7.0安装部署说明
windows
扛枪的书生4 小时前
Windows 提权-内核利用_2
windows·渗透·kali·提权
故事与他6454 小时前
CTFHub-上传文件
android·ide·windows·web安全·网络安全·android studio·xss
千羽星弦6 小时前
Jenkins在Windows上的使用(二):自动拉取、打包、部署
运维·windows·jenkins