首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

在一个月内为 M4 Mac Mini 构建 Linux GPU 驱动程序

2026-09-16 1 阅读 约6分钟阅读 ADevWithAnIdea
分享:
字号:
我来了,我提示,我离开第 2 部分:在一个月内从头开始构建 GPU 驱动程序 上一篇博文:https://codyho.dev/blog/hypervisor-macbook-neo/ 我们做了什么 TL;DR:Niklas 和我在大约一个月内为 M4 Mac Mini 和 MacBook Neo 构建了一个完全兼容 OpenGL ES 3.0 的 GPU 驱动程序,这个过程通常需要数年时间。这是在 M4 Mac Mini 上运行 WebGL 的 Chrome 和 Firefox,并进行了工作合成:最重要的是,驱动程序足够快,可以以 200fps 运行 Minecraft:构建此驱动程序涉及对 AGX(Apple 对 GPU 的名称)极其复杂的固件 ABI 和用户空间组件进行逆向工程。这一切都是使用成熟的技术以透明、可验证的洁净室方式完成的。该代码尚未准备好供最终用户使用,但我们希望尽快将其提供给最终用户。我们是如何做到的 之前,我构建了一个虚拟机管理程序来对 macOS 进行逆向工程。现在的目标是真正用它来做一些有用的事情,还有什么比编写 GPU 驱动程序更好的目标呢? GPU 实际上是任何现代系统的必需条件,否则一切都需要由 CPU 渲染,这会慢几个数量级且能效较低。我们的目标是为 M4 Mac Mini 和 MacBook Neo 实现一致的 OpenGL(以及很快的 Vulkan)驱动程序。通常,构建 GPU 驱动程序是一项需要数年时间的工作;我们的目标是在几天内完成。事实证明,几天的时间过于乐观,但几周的时间仍然是一个巨大的进步。在这几周里,我们: 仅使用实时探测对 M4、A18 Pro 和(大部分)M5 用户空间进行逆向工程,发现 Apple 驱动程序未发出的硬件支持的功能和指令 构建了一个完全工作的用户空间驱动程序,包括新的自定义 IR/着色器编译器、命令流生成器和更多组件 使用我之前构建的虚拟机管理程序中的跟踪信息,从头开始逆向工程完整的 AGX 固件 ABI 为所述固件 ABI 实现了完整的 Linux 内核驱动程序在此过程中,我们没有查看任何 Apple 二进制文件,只查看了硬件跟踪(来自我们的虚拟机管理程序)和我们自己构建的着色器。对于用户空间图形 RE,我们小心地将任何所需的 Apple blob 视为不透明对象。我们有一个朋友写了关于这些 blob 的文档,这样我们就可以自己编写一个干净的房间实现(这主要是通过盲目地尝试一些东西直到它起作用而构建的)。我们已经发布了所有实验,以便任何人都可以验证我们工作的出处(请参阅可交付成果下的双胞胎 agx-re 存储库)。这篇博文分为两部分,用户空间和内核空间。这反映了所有现代 GPU 驱动程序中的划分:内核负责与固件连接、分配缓冲区和管理调度,而这些缓冲区的实际内容和正在调度的内容是不透明的。用户空间负责实际了解 GPU 的工作原理并用东西填充这些缓冲区。内核空间 在 Apple Silicon 上,内核驱动程序不直接与硬件交互。相反,它与运行名为 RTKit 的自定义 RTOS 的 GPU 固件进行通信。这意味着内核驱动程序的第一步不是与硬件对话,而是找出固件 ABI。固件 ABI 是迄今为止这个项目中最烦人的部分,因为苹果并没有做出一个合理的具有良好接口的 ABI 的理智的事情,而是本质上采用了一个常规的内核驱动程序,将其切成两半,然后将其中一半放入 AGX 中并称为固件,而内核驱动程序的另一半则使用内存中的共享结构进行通信。这些结构中的许多结构都有固件拥有的字段(我们永远不能修改这些字段,并且我们必须从逆向工程中学习这些字段)与主机控制的字段交错。要了解 ABI 的复杂程度,可以看看 M1/M2 上的共享内存树的样子:Asahi Lina 花费了 12 个小时的时间,在构建 M1/M2 内核驱动程序的过程中费尽心思地解决了所有这些问题,这是一项令人惊叹的技术成就。不幸的是,A18 Pro 固件 ABI(我开始在 MacBook Neo 上进行 RE 工作,后来转向 M4 Mac Mini)比已经非常复杂的 M1 固件 ABI 复杂得多:What the F@!#, Apple。请注意 A18 的特点: 1.5 倍的结构体 两倍的指针 提交工作的过程明显更加复杂 还有许多其他问题给 RE 过程增加了阻力。我确实有一些关于固件 ABI 的文档,但它非常不完整,而且老实说不是很有用。我的方法很简单,基于成功逆向工程 M1/M2 机器的方法:观察 macOS 做了什么,重播它,然后尝试自己做,这是通过虚拟机管理程序实现的。当我向 LLM 描述这种方法时,它非常字面地理解了重放:它所做的第一件事是等待第一个固件可见事件(这些事件称为“kicks”),然后保存整个 GPU 内存状态的副本
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱