applegpu逆向路线图:Apple G13 GPU架构还有哪些未解之谜等待攻克
【免费下载链接】applegpuApple G13 GPU architecture docs and tools项目地址: https://gitcode.com/gh_mirrors/ap/applegpu
applegpu 是一个针对Apple G13 GPU 架构(即 M1 SoC 内置的图形芯片)的开源逆向工程(reverse engineering)项目。它不只是"逆向"——而是边逆向边产出成果:一份持续更新的架构文档、一个 GPU 反汇编器、一个汇编器,以及一个指令级模拟器。对想研究 Apple 芯片、GPU 指令集分析或 Metal 着色器二进制格式的人来说,这是目前最完整的"地图"。
applegpu 是什么?G13 逆向工程的四大核心工具
| 工具 | 入口文件 | 作用 |
|---|---|---|
| 反汇编器 | disassemble.py | 把 GPU 机器码翻译成可读汇编(项目最有用的部分) |
| 汇编器 | assemble.py | 手写汇编并生成机器码,常用于构造测试用例 |
| 模拟器 | applegpu.py(CoreState类) | 在软件中逐条执行指令、维护寄存器状态,用于和真实硬件对拍 |
| 硬件测试 | hwtest.py | 在 Apple Silicon 真机上跑指令,与模拟器结果比对 |
💡 这套组合拳的精髓在于闭环验证:模拟器实现一条指令 → 硬件测试在真机上执行同一条指令 → 状态一致才算通过。测试框架会把自己编译的 shader 写进 Metal 二进制存档里(metallib_replacer.py负责替换,hwtestbed/目录下的 C/C++ 助手程序负责在 GPU 上执行并回传缓冲区和耗时,协议定义见hwtestbed/protocol.h)。
# 反汇编一段 GPU 二进制 python3 disassemble.py code.bin # 在 M 系列芯片上跑硬件测试 python3 hwtest.py路线图已攻克:Apple G13 指令集解码框架
从 架构参考文档(由genhtml.py生成,docs.html为成品)可以看到,以下谜团已经揭开:
- 指令编码结构:变长指令(2~12 字节)按操作码匹配字段,
applegpu.py中instruction_descriptors列表就是解码核心; - 指令族覆盖:Move、整数算术、移位/位域、位操作、浮点运算(含 FMA,
fma.py专门解析融合乘加)、Flow Control、Select、SIMD Group / Quad Group、内存与栈等; - 系统寄存器含义:如
core_index、simdgroup_index_in_threadgroup、active_thread_index_in_quadgroup等,在applegpu.py顶部的SR_NAMES表中逐一命名; - 色彩空间细节:
srgb.py还原了 sRGB 查找表。
文档中每一条指令都配有逐位编码图——已确认的比特标注字段名,未知的标注为?。这张"比特地图"本身就是逆向进度的可视化仪表盘。
未解之谜清单:Apple G13 GPU 还有哪些盲区
之谜一:流控制尚不完整——模拟器为什么不敢"跳"
README 明确写道:"There's no flow control yet"(模拟器还没有流控制支持)。applegpu.py中虽已定义BranchOffsetDesc、StackAdjustmentDesc等分支相关字段描述,且文档收录了 Flow Control 与 Execution Mask Stack 指令族,但模拟器执行跳转、调用、掩码栈压弹的完整逻辑尚未闭环。分支语义(回边、栈深度、异常路径)仍是待验证的重头戏。
之谜二:编码表里的每一个?比特
生成器(genhtml.py)会把未解析比特渲染成灰底?。这些散落在各指令编码图中的未知位,可能是保留字段、也可能是尚未发现的修饰标志(如 cache 提示位,项目用APPLEGPU_CRYPTIC环境变量控制其显示方式)。"消掉一个?"是贡献者最容易上手的逆向任务。
之谜三:异步内存流水线的时序规则
device_load/device_store/wait等异步指令在反汇编输出中随处可见(如 README 示例里device_load ... lsl 1后紧跟wait 0)。但"等待到底在等谁、乱序窗口多大、何时触发冒险"这类时序规则,硬件测试目前只能证明"行为一致",难以写成完备的时序文档。
之谜四:测试覆盖率的"盲区"
作者在 README 中坦承测试是"scattershot"(散弹式):有些指令测试详尽,有些只是为了让别的测试跑通才存在,且很难看出哪些行为已被覆盖。他的实用建议是"故意改坏实现,看测试会不会红"——这暗示仍存在未被任何测试盯住的角落。
之谜五:G13 与后续芯片的差异
项目标题锁定的是G13(M1)。M1 Pro/Max、M2 及之后芯片的 GPU 是否有新增指令、修改编码,完全不在当前覆盖范围内——这是"Apple M1 GPU 逆向"通往更广阔战场的一扇门。
新手上手指南:3 步加入 Apple GPU 逆向
第 1 步:获取代码(无需克隆仓库即可阅读;参与开发建议克隆)
git clone https://gitcode.com/gh_mirrors/ap/applegpu第 2 步:跑通反汇编器
任何 Mac/Linux 上都能运行,只需 Python 3:python3 disassemble.py code.bin。想在线体验 Metal 着色器 → G13 汇编的转换流程,可看compiler_explorer.py及其调用的compiler_explorer_tools/(metal-compile-tool.m编译、metal-archive-extractor.cpp从 Mach-O 存档中提取着色器二进制)。
第 3 步:在 Apple Silicon 上跑硬件测试
python3 hwtest.py会自动编译hwtestbed/Makefile对应的 C 助手;想手动重编译可用make -C hwtestbed -j8。更轻松的玩法是python3 hwtestbed.py <shader code>——直接在真 GPU 上执行自己写的一小段指令。
给贡献者的路线图建议
按投入产出比排序,以下三个方向最值得攻克:
- 补齐模拟器流控制:对照硬件测试输出,实现分支与掩码栈语义,打通 README 中"no flow control" 的缺口;
- 猎杀
?比特:挑一条指令的未知字段,用assemble.py构造变体输入 +hwtest.py观察行为差异,是最经典的逆向实验方法; - 补全测试矩阵:针对
hwtest.py中覆盖薄弱的指令补用例,并尝试自动化"覆盖度可视化"。
总结:applegpu 项目用反汇编器、模拟器与真机对拍三件套,把 Apple G13 GPU 的黑盒剥开了大半——指令编码、寄存器语义、ALU 与内存行为都已被文档化。而流控制闭环、编码表中的未知比特、异步内存时序、测试覆盖率盲区与多代芯片差异,构成了这张逆向路线图上的五大待攻克谜团。无论你是 GPU 架构爱好者还是逆向工程新手,这里都有一条清晰的上手路径。
【免费下载链接】applegpuApple G13 GPU architecture docs and tools项目地址: https://gitcode.com/gh_mirrors/ap/applegpu
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考