
2026/09/16 4:30
M4 Mac Mini に Linux GPU ドライバを作成するまで、たった 1 カ月
RSS: https://news.ycombinator.com/rss
要約▶
Japanese 翻訳:
Niklas と Cody は、LLM ベースのエージェントを活用して約 1 ヶ月で、M4 Mac Mini および MacBook Neo 向けに完全な OpenGL ES 3.0 準拠の GPU ドライバを構築し、Apple のバイナリにアクセスせずに高度なハードウェア制御が可能であることを実証しました。自前のハイパーバイザを通じて AGX ファームウェア ABI とユーザー空間コンポーネントをリバースエンジニアリングし、ハードウェアトレイルを取得・再生することで、新しい IR/シェーダーコンパイラ、コマンドストリームビルダ、完全な Linux カーネルドライバ、および完全なユーザー空間グラフィックススタック(Gallium 翻訳と NIR から AGX ISA へのコンバージョンを含む)を実装しました。M1/M2 より ABI に構造体数が 1.5 倍、ポインタ数が 2 倍、ワーク提交プロセスがより複雑である A18 Pro アーキテクチャの重大な障壁を克服するため、レンダリング ACK だが実行されていない問題を解決(早期の状態キャプチャ)、計算によるブロックを解消(Metal が利用可能な LaunchDaemon を持つシングルユーザーモードと純粋な計算トレイルの再生)、およびタイルド Vertex Buffer の制限による部分的なレンダリングに対処(セーブ/リザームロジック)を行いました。
エージェントは Metal に含まれていないハードウェア支援機能を発見しました。これには、ネイティブ単命令 64 ビット加算、最大 128×のアノトロピー(Metal は 16×まで)、新しい行列ユニットモード、および uniform_mov 向けの 7 ビット即時値サポートが含まれます。「Mesa 優先」の反復アプローチは、ハードウェア優先仕様の記述アプローチと比較して進捗を加速させました。チームは drm-shim を Rust で書き換え、フロントエンドを非同期化し、バッチワーク提交などの手軽な最適化を追加しました。Codex は既知の良質なサンプルと完全アドレス空間キャプチャを比較することでデバッグを行いました。
このドライバは M4 Mac Mini で Minecraft を 200 FPS で動作させ、Chrome および Firefox で WebGL をサポートし、コンポジティングも正常に動作しています。アップストリーム化には課題が存在します:Mesa への提出の前に大規模なテスト、人間によるレビュー、そしてリファクタリングが必要であり、これは完全に LLM が書かれた GPU ドライバであるため懐疑論が予想されます。一方、Linux カーネルのアップストリーム화는 Asahi M1/M2 ドライバーがアップストリーム化されるまでブロックされています。今後の目標には Vulkan 1.4、OpenGL 4.6、OpenGL ES 3.2、OpenCL 3.1、Direct3D 12(Proton 経由)、およびレイトレーシングが含まれます。ファームウェア ABI は顕著に異なります:A18 Pro の第 2 RTKit コプロセッサは M5 に M4 よりも近い特性をもたらします。M5 ユーザー空間 ISA は主にスーパーセットですが、テクスチャ記述子など他の部分で差異があります。公開リリースは予想よりも早期に行われる可能性があり、ディスカッションのためにコミュニティは Discord を通じて招待されます。
本文
私たちの取り組み:M4 GPU ドライバー開発の要約
📌 TL;DR(要約)
- プロジェクト概要:ニクラスと私は、通常数年かかる作業を約 1 ヶ月という短期間で完了しました。
- 対象製品:Apple M4 チップ搭載の「Mac Mini」と「MacBook Neo」。
- 達成目標:完全なOpenGL ES 3.0 準拠の GPU ドライバーを構築。
- 動作確認
- Chrome や Firefox で WebGL が正常に動作。
- コンポーザート(画面合成)が機能していることを確認。
- Minecraft を 200 フレーム/秒という高画質で動作させるパフォーマンスを達成。
- 開発手法
- Apple の複雑なファームウェア ABI とユーザー空間コンポーネントを、クリーンルーム環境下でリバースエンジニアリング。
- 確立された手法を用いて、透明性と検証性を確保。
💡 注釈:コードはまだ一般公開リリースには至っていませんが、早期提供に向けて努めています。
🛠️ 取り組みの詳細
背景と目標
- 目的:macOS リバースエンジニアリングの成果を実践的な GPU ドライバーへ応用。
- 重要性:GPU は現代システムの必須要素。GPU なしでは描画処理が CPU に負荷がかかり、性能低下と電力効率悪化を招く。
- ターゲット規格:M4 Mac Mini と MacBook Neo 向けに OpenGL(将来的には Vulkan)ドライバを実装。
開発期間の短縮
通常数年以上かかるプロジェクトを**「数日」〜「数週間」**に圧縮。以下の成果を達成しました:
- ハードウェア発見
- 生体プローブ(Live Probing)のみで M4、A18 Pro、M5 のユーザー空間をリバースエンジニアリング。
- Apple ドライバが出力していないハードウェア対応機能と命令を発見。
- ユーザー空間ドライバー開発
- カスタム IR/シェーダコンパイラ、コマンドストリームビルダーなどを内蔵した完全動作の実装を完成。
- ファームウェア ABI リバースエンジニアリング
- 自作ハイパーバイザーからのハードウェアトレースを用いて、AGX ファームウェア ABI をゼロから完全に解明。
- カーネルドライバ実装
- 上記 ABI に完全に準拠する Linux カーネルドライバを実装。
クリーンルームアプローチ
- Apple バイナリ不使用:Apple のバイナリは一切使用せず、ハイパーバイザーからのトレースと自製シェーダーのみを使用。
- 仕様書の作成:友人に依頼し、不透明な Apple blobs の仕様書を作成。
- 完全な検証性:全ての実験結果を公開し、成果物は
リポジトリで確認可能。twin agx-re
アーキテクチャ構成
現代の GPU ドライバー構造(カーネル空間とユーザー空間)に従います:
- カーネル空間:ファームウェアとのインターフェース、バッファー割り当て、スケジューリングを担当。
- ユーザー空間:GPU の動作原理を理解し、実際にデータを充填する役割。
⚙️ カーネル空間開発
Apple シリコンでは、カーネルドライバは直接ハードウェアと通信せず、カスタム RTOS「RTKit」を介して GPU ファームウェアと通信します。そのため、第一歩はファームウェア ABI の解明です。
ABI の複雑さ
Apple は合理的なインターフェースを採用せず、既存のカーネルドライバを分割して片方を「ファームウェア」と呼び、残りをホストドライバとして共有構造体で通信させる方式を採用しています。これにより以下の課題が発生しました:
- 構造体の増加:M1/M2 に比べて A18 Pro では構造体が 50% 増大。
- ポインタの増加:ポインタ数が 2 倍に膨張。
- 提出プロセスの複雑化:ワークの提出手順が劇的に複雑化。
レバースエンジニアリング手法
LLM(Codex)を用い、「観察 → 再生(リプレイ) → 再現」というアプローチを徹底しました。
- ファームウェア可視化イベント(kicks)を検知。
- その時の GPU メモリ全体のコピー保存。
- システム再起動後にメモリ書き戻し、出力ページ変化を確認。
- コード上でオブジェクトを再構築し、全てのポインタを追跡して解釈。
LLM は実験を重ねるごとに「再生対象ページの数を減らし」、最終的に全てをソースから構築するまで進化しました。
発生した課題と解決策
| 課題 | 問題の内容 | 解決の鍵 |
|---|---|---|
| 1. レンダリングワーク | ファームウェア起動後に提出されたワークが ACK(確認応答)されて破棄され、実際には実行されない。動的な状態キャプチャが困難。 | 「ファームウェア起動直後の最初のキャプッチ」を特定し、単なる 1 バイトのディスクリプター欠落を発見して修正。 |
| 2. コンピュートワーク | 大量のレンダリングワーク実行後スケジューリングされるため、クリーンなキャプチャが困難(336MB のデータも失敗)。無駄な情報過多で処理に失敗。 | シングルユーザーモード起動 + Metal 利用時即時 LaunchDaemon 設置により、純粋なコンピュート・トレースの成功捕捉。 |
| 3. 部分的レンダリング | タイル化頂点バッファー (TVB) が不足した場合の処理。再ロードと部分実行が必要で極めて不安定。 | 1 つのトランザクション再生から学習し、Metal シェーダー改変を介して複数の部分レンダリングを実行可能に。 |
Python プロトタイプから Linux ドライバへ
- 移行期間:約 3 日(そのうち 1 日は無駄)。
- 課題:LLM が最も難しい「部分的なレンダリング」から着手し、スムーズな進捗を妨げた。
- 解決:指示を「まずはコンピュートから」と変更すると、全てがスムーズに進む。
ドライバ構築の工程(高級層)
を Rust で書き直し(同期型)。drm-shim- フロントエンド非同期化しつつ、GPU 提出は同期のまま維持。
- GPU 提出部分も非同期化。ポーリングではなくファームウェアイベント監視へ再ファクタリング。
- バッチワーク提出などの低レベル最適化を実装。
LLM の強み:コードが動作しない理由をハイパーバイザーを利用して全アドレス空間をキャプチャし、既知サンプルと比較する体系的デバッグが可能。
🎨 ユーザー空間開発
A18 Pro のユーザー空間は M1/M2 と大きく異なるため(新しいディスクリプター形式・ISA など)、完全なリバースエンジニアリングが必須でした。
リバースエンジニアリングのプロセス
- 手法:小さな Metal プログラムを実行 → コンパイル → 変更箇所確認 → ビット操作による解釈という反復プロセス。
- フェーズ 1(Claude): 形式の理解と列挙に成功したが、デコンパイル済みのコードから再構築する実装能力は低かった。
- フェーズ 2(ニクラス参画):
を完成させ、M4 Mac Mini 向けユーザー空間 RE を担当。drm-shim
アプローチの比較
| 私のアプローチ | ニクラスのアプローチ | |
|---|---|---|
| 方針 | ハードウェア RE を最優先し、原理理解から仕様書作成へ移行。LLM に実装させる。 | まず Mesa(ドライバー)を構築。機能追加時にのみ RE を実施。 |
| 時間配分 | 大半をハードウェア実験に費やす。実装コードには割かない。 | Mesa のビルディング・テストと RE の両方にバランスよく割く。 |
| 結果 | 「完全性」の名の下に些細な任務で時間を浪費する傾向あり。 | 実際の構築必要性により拘束され、効率的に進捗。未解明動作を自ら検証。 |
⚠️ LLM の限界:「堅実(Pedantic)」であることが一部では利点だが、場合によっては全体目標から逸脱し無関係な枝葉に時間を費やす傾向がある。
発見された独自機能
ハードウェアではサポートされているが Metal ではサポートされていない機能を直接ビット操作で実現しました(Alyssa Rosenzweig の手法)。
- ネイティブ単命令 64 ビット加算
- アニソトロピー(異方性フィルタリング)を 128 倍へ拡張(Metal 上限は 16 倍)
- マトリクスユニットの新しいモード
のための 7 ビット直値サポートuniform_mov
Mesa 開発と Khronos CTS
- Khronos 互換性テストスイート (CTS):既に網羅的なテストコーパスが存在するため、LLM を導くのが容易。
- 内部構造:Gallium(内部 API)と Mesa 内部 IR が既に整っているため、翻訳のみが必要。
- NIR(LLVM IR に似る)から AGX プロプライエタリ ISA へのコンパイルを実装。
- このコンパイラーは将来的な Vulkan ドライバーにも再利用可能。
成果:Niels のアプローチが優先され、段階的な改善でOpenGL ES 3.0 準拠を達成(未対応はオプション拡張のみ)。
📦 成果物 (Deliverables)
以下のリポジトリからコードを検証・利用できます:
- Mesa: https://github.com/niklassheth/mesa
- Linux カーネルドライバ: https://github.com/GravityLinux/linux/gravity-m4
- ユーザー空間 RE ドキュメント: Cody Niklas(LLM によるドキュメントだが機能)
🚀 残りの作業と将来展望
対応規格の範囲
我々のドライバーは以下の規格を全てカバーする予定です:
- Vulkan (1.4)
- OpenGL (4.6) / OpenGL ES (3.2)
- OpenCL (3.1)
- Direct3D 12 (Proton 経由)
- レイトレーシング
上流化 (Upstreaming) の課題
- Mesa: ポリシー上の問題は解決済みですが、多くのテスト、人間によるレビュー、PR の再ファクタリングが必要です。
- LLM コードの評価:世界初の完全に LLM で書かれた GPU ドライバーであるため、人間のコードよりも高い基準で厳しく評価される可能性があります。
Linux カーネルドライバの上流化
- M1/M2 ドライバの上流化がまだ完了しておらず、現状では待つしかありません。
- 計画:M1/M2 ドライバが上流化した後に、必要に応じて再ファクタリングとレビューを完了させ、我々のドライバーも上流化させる予定。
📅 使用開始時期について
- コードの手元用意に向けて努力しています。
- 予想より短い期間でリリースできるでしょう(リンゴは木から離れることはありません)。
💬 ご参加方法
アイデアの議論、チャット、単なる交流など、Discord サーバーへの参加をお待ちしております!
📝 付録:技術的な補足情報
Sam (Summer) とは?
- カーネル RE タスクに使用した LLM はCodex(GPT-5.6 Sol / GPT-6 Astra)。
- 最大の課題:過剰なサイバーセキュリティ制限(Trust Access 登録なし)。
などの単純指示では再開できない場合がある。/goal resume- 解決策:1 分ごとのスクリーンショット差分比較を行い、進捗がない場合は自動的に
を送信するデモンを構築(グループチャットに流出した愚かだが有効なハック)。/goal resume
M4 vs A18 Pro vs M5 の違い
- M4 vs A18 Pro:ユーザー空間実装は実質同一。主な違いは M4 のコア数により整合する値がわずかに大きいことのみ。
- ABI は著しく異なり、A18 Pro は第 2 の RTKit コプロセッサを持つため複雑化(M5 に類似)。
- M5:M4 と共通点は多いが、テクスチャディスクリプターなどは完全に異なる。
- ユーザー空間は部分的に RE 済み、ファームウェア ABI は完全 RE 済み。
- プロトタイプ
が構築・テスト済みであり、Rust ドライバへの移行も比較的容易と考えられる。drm-shim
ターゲット:引き続き M4 Mac Mini と MacBook Neo を主目標としています。