如何从 Linux 内核中找到代表屏幕上内容的视频内存区域?

如何从 Linux 内核中找到代表屏幕上内容的视频内存区域?

每天大约 5-20 次,我会遇到由仅在高 I/O 负载下发生的竞争条件引起的短暂视觉故障和 heisenbug。它们从屏幕上消失的速度太快,以至于我无法及时抓住相机,因此我正在寻找/构建一个屏幕截图/屏幕录制工具,该工具在按下热键/快捷键后以尽可能低的延迟进行操作/响应。

至关重要的是,该工具的高响应性需要不受高 I/O 活动(例如 20-40 的 10 秒平均负载)的影响可以忽略不计(理想情况下根本不会)。

PREEMPT_RT关于实时加载和运行 Xorg 以及自制的屏幕截图守护进程,可以进行公平的争论。这会起作用...除了关于实时运行 X 的部分;我实际上确实想在计算机上完成工作。 :)

事实是,我可以放心地在我的计算机上实时运行任何我喜欢的代码,只需将其放入 Linux 内核即可。那么,内核模块时间!!重申我的问题,

如何在 Linux 内核模块中查找、访问和理解代表屏幕上像素的内存区域?

我发现尝试/dev/fb0在 X 运行时读取只会产生黑色图像,因此这显然行不通。

很遗憾https://dri.freedesktop.org/docs/drm/gpu/index.html没有显示任何与帧缓冲区读回明显相关的内容,但我没有使用此 API 的经验,所以我真的不知道我在寻找什么。

我承认可能需要特定于驱动程序的代码(因为内存中不太可能存在代表屏幕上实际内容的与驱动程序无关的规范点),这很好。我目前使用的是基于 Intel-GPU 的机器,我很高兴开始专门为此编写代码。

FWIW,我问了一个措辞不同的版本这个问题是在不到两年前提出的。这个问题只吸引了一条关于 HDCP 的评论,并且从未得到解答,但由于即使在两年后,我仍然每天处理这个问题多达 20 次,所以我再次尝试。

(我当前的方法(scrot由 的热键绑定器启动i3)通常需要长达 20 (!!) 秒的时间才能在经历高 I/O 负载的系统上获取单个屏幕截图。)

相关内容