核心摘要:开发者 Niklas Sheth 与合作者在约一个月内,为 M4 Mac Mini 和 MacBook Neo 构建了一个完全符合 OpenGL ES 3.0 标准的 GPU 驱动。这一过程通常需数年完成。测试显示,Chrome 和 Firefox 在该驱动下能正常渲染 WebGL,且《我的世界》(Minecraft)运行帧率高达 200fps。

该驱动基于对苹果 AGX GPU 固件 ABI 及用户空间组件的逆向工程,全程采用透明、可验证的“净室”技术,未查阅任何苹果专有二进制文件。目前代码尚未面向终端用户发布,但团队正加速推进。

逆向工程策略:Hypervisor 与 LLM 协同

项目旨在利用此前构建的 Hypervisor 进行 macOS 逆向工程,进而开发 GPU 驱动。GPU 驱动是现代系统的关键,否则渲染任务将由 CPU 承担,导致性能与能效大幅下降。团队目标是为 M4 系列设备实现兼容 OpenGL 及后续 Vulkan 的驱动。

尽管初期设定“几天完成”的目标过于乐观,但团队在数周内取得了突破性进展:

  • 仅通过实时探测,逆向解析了 M4、A18 Pro 及部分 M5 的用户空间,挖掘出苹果驱动未公开的硬件功能与指令;
  • 构建了包含自定义 IR/着色器编译器、命令流构建器的完整用户空间驱动;
  • 基于 Hypervisor 追踪数据,从零逆向工程出完整的 AGX 固件 ABI;
  • 实现了适配该 ABI 的 Linux 内核驱动。

整个过程严格遵循净室原则:所有苹果私有组件(blob)均被视为不透明对象,仅通过文档描述其行为,再由团队独立实现。所有实验数据已公开至 agx-re 仓库以供验证。

内核空间:攻克复杂的固件 ABI

在 Apple Silicon 架构中,内核驱动不直接操作硬件,而是通过共享内存结构与运行 RTKit 实时系统的 GPU 固件通信。相较于 M1/M2,A18 Pro 的固件 ABI 复杂度显著增加:结构体数量增加 1.5 倍,指针数量翻倍,工作提交流程更为繁琐。

团队采用“观察-重放-重构”的方法论,并引入 LLM(Codex)辅助逆向工程。LLM 通过保存并重放 GPU 内存状态,逐步解析固件行为。过程中遇到三大挑战:

  1. 动态状态重放:固件启动后的状态难以捕捉。经调整,团队选择在固件启动后的最早阶段进行捕获,迅速定位缺失的描述符。
  2. 计算任务阻塞:常规 GUI 路径中计算任务依赖大量重绘工作,导致捕获数据杂乱。最终方案是在单用户模式下禁用 GUI,直接运行微型 Metal 程序以获取纯净的计算追踪数据。
  3. 部分渲染机制:当图块顶点缓冲区(TVB)不足时,驱动需支持部分渲染及状态保存/恢复。通过修改着色器触发多次部分渲染,LLM 成功学习并重构了这一复杂逻辑。

基于 Python 原型,团队在三天内将其转化为功能齐全的 Linux 内核驱动,包括异步前端重构、GPU 提交异步化及批处理优化。LLM 在此过程中展现了强大的系统化调试能力,能主动利用 Hypervisor 对比地址空间以排查错误。

用户空间:Mesa 优先 vs 硬件优先

A18 Pro 用户空间拥有全新的描述符格式与指令集架构(ISA)。逆向工程分为两阶段:

第一阶段由 Claude 协助,尝试构建反汇编器并枚举所有描述符格式,虽成功实现反汇编与重组,但在理解指令语义以编译任意程序方面进展缓慢。

第二阶段,Niklas 加入并采取“Mesa 优先”策略:以构建 Mesa 图形栈为目标,仅在必要时进行逆向工程。相比之下,作者采用的“硬件优先”策略因过度追求完整性而陷入次要任务。Niklas 的方法效率显著更高,最终实现了完全的 OpenGL ES 3.0 兼容性(可选扩展除外)。

逆向过程中还发现了硬件支持但 Metal 未启用的特性,包括原生单指令 64 位加法、高达 128x 的各向异性过滤(Metal 限制为 16x)等。

交付物与未来规划

目前,Mesa 驱动与 Linux 内核驱动代码已公开。剩余工作包括支持 Vulkan 1.4、OpenGL 4.6、OpenCL 3.1、Direct3D 12(通过 Proton)及光线追踪。

团队计划将驱动上游化,但面临非技术性障碍。由于这是首个主要由 LLM 编写的 GPU 驱动,代码将面临比人类编写代码更严格的审查标准。此外,Linux 内核驱动的上游化依赖于 M1/M2 驱动的先行合并,这一过程可能耗时较长。

关于工具链,作者在内核逆向中使用了 Codex(搭载 GPT-5.6 Sol 及 GPT-6 Astra),并通过编写守护进程自动恢复因网络安全限制中断的会话。尽管存在局限,LLM 在固件 ABI 逆向中的表现证明了其巨大潜力。