概要
- Apple Silicon 向けにOpenGL ES 3.0対応GPUドライバを約1ヶ月で開発
- AGXファームウェアABI とユーザースペースの逆アセンブルが主な課題
- Hypervisor を活用したクリーンルームリバースエンジニアリング手法を採用
- カーネルドライバ と ユーザースペースドライバ の両方を自作
- Chrome/FirefoxのWebGL動作 や Minecraft 200fps 動作を実現
M4 Mac Mini/MacBook Neo向けGPUドライバ開発の舞台裏
- OpenGL ES 3.0完全準拠 のGPUドライバを約1ヶ月で開発
- 通常は数年かかる作業を大幅短縮
- Chrome/FirefoxのWebGL や Minecraft 200fps 動作を確認
- AGX(Apple GPU)ファームウェアABI とユーザースペースの複雑な仕様を逆アセンブル
- クリーンルーム手法 による透明性と検証性の確保
- Appleバイナリには一切依存せず、ハードウェアトレースと自作シェーダのみ利用
- 必要なApple blobはブラックボックスとして扱い、外部による文書化を利用
- 成果物と実験内容を公開 し、検証可能性を担保
カーネルスペースでの課題とアプローチ
- Apple Silicon ではカーネルドライバが直接ハードウェアと通信せず、 RTKit 上のGPUファームウェアと通信
- ファームウェアABIの解析 が最初の難関
- Appleはカーネルドライバを半分に分割し、片方をファームウェアに、もう片方をカーネルに配置
- 共有メモリ構造体にはファームウェア管理フィールドとホスト管理フィールドが混在
- M1/M2と比べてA18 Pro(M4)ABIはさらに複雑化
- 構造体数1.5倍、ポインタ数2倍、ワーク送信プロセスも複雑
- リバースエンジニアリング手法
- macOSの動作を観察・再現し、ハイパーバイザーでメモリ状態をキャプチャ・リプレイ
- 逐次的な実験で必要なオブジェクトやポインタ構造を解析
- 主な問題点と解決策
- レンダー作業のキャプチャ :ファームウェア起動直後の状態をキャプチャすることで解決
- コンピュート作業のキャプチャ :GUIを無効化し、Metalプログラムで最小限のトレースを取得
- パーシャルレンダー :TVB容量不足時の部分描画処理の再現と自動化
- Linuxカーネルドライバ移植
- PythonプロトタイプからRustによるdrm-shim実装
- 非同期フロントエンドへの書き換え、ファームウェアイベントによるワーク管理
- バッチ処理などの最適化も実施
ユーザースペースでのリバースエンジニアリング
- A18 Proユーザースペース はM1/M2と大きく異なる設計
- 新しいディスクリプタ形式、新ISA、Metal向け設計
- リバースエンジニアリングの流れ
- 小さなMetalプログラムを作成・実行、ビット単位で変化を観察
- コマンドストリームやディスクリプタ、ISAの解析
- LLM(Claude)活用
- Metalプログラムの逆アセンブル・アセンブル、ディスクリプタ解析
- ただし、独自のプログラム生成やISA理解は難航
- チーム開発
- drm-shim開発者Niklasが合流し、ユーザースペース解析を加速
技術的・運用的な工夫
- クリーンルーム実装 の徹底
- Appleバイナリやコードを一切参照せず、ハードウェア挙動と自作ツールのみで解析
- ハイパーバイザー を用いた動的トレースと比較
- メモリ空間の完全キャプチャと既知の良好サンプルとの比較によるデバッグ
- LLM(Codex/Claude)による自動化・補助
- コード生成、デバッグ、トレース解析などに積極活用
- 部分的な失敗や戦略ミスもあったが、全体として大幅な効率化を実現
今後の展望と公開状況
- エンドユーザー向けリリース に向けたブラッシュアップを進行中
- Vulkan対応 も今後の目標
- agx-reリポジトリ に実験・成果物を公開し、オープンな開発体制を維持