在一个月内为 M4 Mac Mini 构建 OpenGL ES 3.0 Linux GPU 驱动
TL;DR
Cody Ho 和 Niklas 在大约一个月内为 M4 Mac Mini 和 MacBook Neo 构建了一个可用的 OpenGL ES 3.0 Linux 驱动,证明了大型语言模型辅助的逆向工程可以取代多年的手动工作。
项目概述
- 目标: 为 Apple 芯片 GPU(M4、A18 Pro、M5)在 Linux 上创建一个符合标准的 OpenGL ES 3.0 驱动(未来支持 Vulkan)。
- 时间线: 约 4 周的高强度工作,远短于通常需要数年的新 GPU 驱动开发周期。
- 关键成果: Chrome/Firefox 的 WebGL 演示正常运行,Minecraft 达到 200 fps,同时生成了完整的 Linux 内核驱动和用户空间栈。
- 方法论: 使用虚拟机捕获硬件 trace 的洁净室逆向工程,结合 LLM(Codex、GPT-5.6 Sol、GPT-6 Astra)进行 ABI 发现、代码生成和系统性调试。
逆向工程固件 ABI(内核空间)
- Apple 的模型: GPU 运行自定义 RTOS(RTKit),并通过共享内存 ABI 暴露接口,而非直接硬件寄存器。
- 复杂性: A18 Pro 的 ABI 比 M1/M2 的 ABI 多出约 1.5 倍的结构体,指针数量翻倍,使其更难解析。
- 方法:
- 实时探测: 使用虚拟机观察 macOS GPU 活动,在固件启动后首次“启动”时捕获整个 GPU 内存状态。
- 重放与精简: 迭代地缩减捕获的状态,仅保留最小必要数据,迫使 LLM 推断结构布局。
- 定向捕获: 对于计算任务,进入单用户模式,尽早启动一个极小的 Metal 计算程序并捕获其 trace。
- 部分渲染: 生成触发 TVB(Tiled Vertex Buffer)溢出的合成工作负载,然后重放并学习保存与恢复协议。
- 成果: 完整描述了 AGX 固件 ABI,发布于
agx-re仓库中,使 Linux 内核驱动能够与 RTKit 通信。
构建 Linux 内核驱动
- 从原型到生产: 一个 Python 原型在三天内用 Rust 重写,遵循现有的
drm-shim设计。 - 关键步骤:
- 将
drm-shim移植到 Rust,构建同步驱动。 - 将前端转换为异步,同时保持 GPU 提交同步。
- 用事件驱动的 fences 替代轮询,这些 fences 与固件通知绑定。
- 添加低级优化,如批处理提交。
- 将
- LLM 的作用: Codex 生成了大部分 Rust 框架,并积极使用虚拟机快照调试不匹配问题,极大加速了开发进程。
用户空间栈(Mesa 集成)
- 硬件优先 vs Mesa 优先: 探索了两种策略:
- 硬件优先(Cody): 彻底逆向指令语义,然后为 LLM 编写规范以实现。
- Mesa 优先(Niklas): 逐步构建 Mesa 驱动,仅在缺少功能时才使用逆向工程。
- 结果: Niklas 的 Mesa 优先方法进展更快,因为它让 LLM 聚焦于具体的驱动目标。
- 关键组件:
- IR/着色器编译器: 自定义编译器,将 Mesa 的 NIR 转换为 AGX ISA,可用于 Vulkan。
- 命令流构建器: 构造固件消耗的缓冲区。
- 功能发现: 识别出未记录的硬件功能,例如原生 64 位加法、128× 各向异性、新的矩阵单元模式,以及
uniform_mov的 7 位立即数。
- 一致性: OpenGL ES 3.0 CTS 通过,仅缺少可选扩展。
交付成果
- Mesa 分支: https://github.com/niklassheth/mesa
- Linux 内核驱动: https://github.com/GravityLinux/linux/tree/gravity-m4
- 用户空间逆向文档:
剩余工作与上游化挑战
- 功能路线图: Vulkan 1.4、OpenGL 4.6、OpenGL ES 3.2、OpenCL 3.1、Direct3D 12(通过 Proton)、光线追踪。
- 上游障碍: Asahi Linux 项目严格执行无 AI 政策;M1/M2 驱动尚未上游,因此 M4 驱动必须等待先例。
- 法律与社区担忧: 一些评论质疑在 LLM 可能训练于专有二进制文件的情况下进行洁净室逆向工程的合法性,并指出作者曾任职于 Apple。
- 需要人工审查: 在任何上游提交前,需进行大量测试、代码审查和重构。
社区反应(Hacker News 精选)
"他们能在这么短时间内做出一个可用的驱动,令人非常印象深刻。我认为这是 LLM 最佳的应用场景之一。" – ndiddy
"由于作者是前 Apple 员工,所有这些工作都受到了玷污。Linux 绝不可能接受这些代码……" – thrwy19940314
"Asahi Linux 最大的痛点是 M3 及更新型号缺乏 GPU 加速。Asahi 的无 AI 政策意味着这项工作无法上游化。" – porphyra
"如果有人担心,现在就可以白盒重实现这个项目。" – getcrunk
"一个此前并非驱动开发者的人能在几周内实现这一点,纯粹令人惊叹。法律问题留给 Linux 基金会的律师们吧。" – SXX
经验教训
- LLM 驱动的逆向工程有效: 大型语言模型可以自主重放捕获的 GPU 状态,推断结构布局,并生成驱动代码,极大缩短逆向工程周期。
- 尽早捕获,保持精简: 最可靠的捕获是在固件启动后立即进行,且包含最小工作负载(例如极小的计算内核)。
- 任务优先级很重要: 在处理更复杂的任务(部分渲染)之前,先让 LLM 实现最简单的缺失功能(计算),能带来更快的整体进展。
- 洁净室纪律: 团队避免使用 Apple 二进制文件,将任何必需的 blob 视为不透明,并公开所有 trace,确保可验证的洁净室流程。
- 社区政策影响采纳: 拥有严格反 AI 立场的项目(如 Asahi Linux)可能拒绝 LLM 生成的代码,即使技术上优秀,也会限制上游潜力。
未来方向
- 更广泛的硬件支持: 将相同方法应用于 M5 及未来 Apple 芯片世代;用户空间代码似乎具有高度可移植性。
- Vulkan 前端: 利用现有的 NIR-to-AGX 编译器实现 Vulkan 驱动,使 Linux 支持现代图形 API。
- 机器学习工作负载: 探索与 PyTorch 或 Metal Performance Shaders 的集成,将 GPU 用于 AI 工作负载。
- 开源治理: 与 Linux 基金会和 Asahi 维护者合作,制定 LLM 辅助驱动贡献的政策。
本文基于 Cody Ho 的博客文章《I Came, I Prompted, I Left Part 2: Building a GPU Driver From Scratch in One Month》以及 Hacker News 上点赞最高的评论。
Sources
相关
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- 项目