酒呑ガジェット

〜静かな環境であなたに...こちらは音のでないコンテンツです。〜

【悲報】NVIDIAドライバーに25年物の技術的負債が限界突破…Rust新ドライバー「Nova」誕生の裏事情

【悲報】NVIDIAドライバーに25年物の技術的負債が限界突破…Rust新ドライバー「Nova」誕生の裏事情

Linuxカーネルの歴史における大きな転換点が静かに進んでいる。NVIDIAのGPUドライバーをRust言語でゼロから再構築するプロジェクト「Nova(ノバ)」で、2025年3月には30行未満のスタブドライバーがカーネル本流にマージされた。単にプログラミングが流行だから書き直しているのではなく、GPUハードウェア自体の構造変化と、25年続いた旧ドライバーの技術的負債が詰め込まれて市場をつくった背景を、デザインの新旧以上に、構造的な問題の深さが物語っている。

NVIDIAが本プロジェクトの背景として捉えられているのは、GSP(GPUシステムプロセッサ)と呼ばれる内蔵CPUという存在だ。GSPはGPUチップ内部に組み込まれたRISC-Vベースの制御用プロセッサで、2018年のチューリング世代以降に全モデルに搭載されている。これ以前のアーキテクチャでは、ホストCPU側のドライバーがGPU内部の無数のMMIOレジスターの意味を全て把握し、PCIバス越しに直接操作していた。温度管理、クロック調整、描画やコピーの細かいエンジン制御まで一括管理する方式は、通信待ちやドライバー肥大化の要因となっていた。

この問題を根本から解消するため、NVIDIAは自社ドライバーの中核を成すリソースマネージャー(RM)を、GSP向けのファームウェアとして移植した。GPU内部でファームウェアが直接動く仕組みとなり、初期構成、電力管理、チャネル管理、各大エンジンの制御をファームウェアが一手に担う。さらにNVIDIAは、知的財産である制御の核心部分をファームウェアに留めたまま、2022年5月にホスト側のカーネルモジュールをオープンソース化することに成功した。CPU側ドライバーはPCI初期化やファームウェアの起動・検証を担い、その後は共有メモリのリングバッファを介した部一のIPC通信だけを行えばよい状態になった。Rust再構築の余裕が生まれたのは、この基盤が出そろったからだ。

その果てに残ったのが、旧ドライバーNouveauの技術的負債だ。NVIDIAが仕様書を公開していなかった時代に開発者たちがリバースエンジニアリングで作り上げたこのオープンソースドライバーは、初期のNV04世代から最新のBlackwellまで、互換性が全く異なるGPUを単一のコードベースで支えるため、NVKMとNVIFという複雑な抽象化層を発展させてきた。しかしこの構造はいまや、メサのNVKが要求する重要な「GPU VM」「VM bind」などの新しいメモリ管理方式に対応できない水準にまで複雑化した。古い設計のままではロック階層が破綻し、根本を直すには事実上の作り直しが必要だった。

Rustのロゴ色(オレンジ)とNVIDIAのグリーンが交錯するGPUドライバー開発のイメージ

言語がRustに選ばれた、本当の理由

Rust採用の本質的動機は、GSPファームウェアの従来型の制御APIを持つという、C言語では回避できない問題にある。NVIDIAのオープンGPUカーネルモジュールはカーネルの外で配布され、各ドライバーバージョンが対応するファームウェアバージョンとセットでしか動作しない。さらにGSP RMとの通信に使われるメッセージ構造体は、バージョン535、570、595といった更新のたびに定義が頻繁に変更される。一方、カーネル本流には絶対的な後方互換性のルールがあり、かつてサポートした古いファームウェアを後から切り捨てることはできない。

つまり単一のドライバーが複数世代のAPIを同時維持しなければならない。これをC言語で実装しようとすると、バージョンごとにわずかに異なるヘッダーや構造体フィールドを吸収するため、大量のプリプロセッサマクロを書かざるを得ない。プリプロセッサマクロは実質的な文字列置換であり、型の安全性を保証しないため、人間には保持しきれない「マクロ地獄」に陥るのではないかという指摘が根強く、ハードウェアレジスターの直接操作の範囲も限されている。

対してRustは、2つの決定的な利点を持つ。1つ目はメモリ安全性。使用者後方オブジェクトを解放後も参照する「use-after-free」、「double free」、バッファオーバーフロー、ロック取り忘れといった、カーネル内致命的バグの温床を、所有権と借用チェッカー、ライフタイムの仕組みでコンパイル段階で完全に防げる。事実、カーネル内のGPUドライバーはマルチコア処理や割り込みが同時に絡む過酷な環境で動くため、この特性は極めて重い。2つ目が手続き型マクロによる安全なAPI自動生成。プロジェクト主導者であるRed HatのDanilo Krummrich氏は、Rustのマクロとジェネリクスを組み合わせ、ファームウェアバージョン別の構造体をコンパイル時に自動生成する設計を考案した。実行時に読み込まれたGSPファームウェアのバージョンを判別し、適合する型を生成することで、ドライバー本体からは単一のクリーンなインターフェースとして扱えるという仕組みだ。

余談だが、初期のNova実装は、unsafe(安全チェックの無効化)領域をコード内にわずか0行で実装したとされる。秘密はカーネルcommon crateによる抽象化の徹底で、PCIバスやレジスター読み書きなど低レベルで危険な操作はすべて共通部品の内部に閉じ込められている。ドライバーがレジスターに書き込む際は、アドレス範囲の境界チェックを抽象化層が自動で行い、範囲外ならコンパイルエラーとして止まる。デバイスがアンバインドされた後のメモリ参照もコンパイル時に防げるため、他のドライバー開発者は安全な部品を組み合わせるだけで新規ドライバーを書けるという構造だ。

一方、カーネル領域外の階層であるNova coreからは、DRM(グラフィックス向けLinux標準インターフェース)とVFIO/VGPU managerという2つのモジュールが接続される。前者はゲームやユーザー空間ドライバー向けのグラフィックス支持で、後者は1つの物理GPUを仮想マシンに分割して割り当てるVFIO用だ。コアが隔離されているおかげで、クラウドやデータセンターではホストOS側に巨大なグラフィックスコードを置かず、最小限のコアとVFIOだけを動かす構成が可能になる。ホストカーネルを安全に保つという観点から、サーバー用途への展開が最も即効性のある目的地とされる。

それでも魔法ではなく、課題も残る

たしかにRustは強力な言語だが、万能ではない。本来防げるのはuse-after-freeや二重解放、ロック取り忘れといったCPU側のメモリ安全性の問題に限られる。一方で、GPUのDMAエンジンがページングテーブルの設定ミスでホストの物理メモリを破壊するバグ、非公開ファームウェアそのもののエラー(サスペンド復帰時のハートビート停止でXID 79が発生するなど)、複数ロックの取得順序不当deadlockが起きる設計上のロック問題は、Rustでも防ぐことができない。さらにパフォーマンス面では、Rustのゼロコスト抽象化が「C以上の追加コストがかからない」ことを意味するだけで、ゲームFPSやAI計算がどう伸びるかは実際のハードウェアクロック制御とシェーダーコンパイラ最適化に依存する。ただし過度な期待はNGだ。現時点でNovaは実ベースのベンチマークデータが存在せず、性能論というより構造化の革新が本質とされている。

また、カーネル本流側の文化摩擦も残る。CのサブシステムのAPIを変えると上層のRustコードが壊れる、読めない開発者の負担が増えるという懸念が継続し、Rust開発の牽引役が非技術的対立に疲弊して辞任した事例もある。それでも、NVIDIA本社のエンジニアが共同メンテナーとして椅子に着き、Blackwell世代の初期段階の回線接続コードを直接投稿する時代となった。ハードウェアがOSに嘘の値を返すことまで想定して防御する抽象化設計が生まれており、この「ドライバーの再定義」は今後の業界全体に影響を及ぼしそうだ。

ネットの反応

Blackwellに対応したドライバの初期verは酷かったし妥当な判断だと思うけど、AIが発展してきたからか最近マジで基幹的なドライバやソフトがどんどんRust化されてきてるよなぁ

linuxのドライバはkernelのバージョン依存なので、nvidia公式のパッケージを使用してもkernelとのミスマッチが発生して面倒なんですよね。kernelに統合されると便利なのですが

これなんでnvidiaは既に自社ドライバあるのにコミュニティ主導のドライバに協力してるんだろな

今の革ジャンがLinuxゲーマーの為に動く事はないだろうね、すべてはAIデータセンターの為だけ

リーナス「Nvidia🖕」時代の負債だな

え。作り直すのですか。

RUSTで書いたからといって安定性が向上しまくり、落ちなくなるわけではありません。逆に作り替えによってよからぬバグを引き込むため、半導体をバージョンの区切りとして、専用ドライバーを出していた方が安定します

それ以前に、NVIDIAは今のAI需要という循環取引を作り出して、IT製品の価格をおかしくした方を、どうにかして欲しいですね

なんだLinuxの話か

儲かってお金が余っているから、じゃないですね。

AIの所感

見た目は「言語を替えた」だけのニュースに見えるが、実際の争点はハードウェア側の統合だ。GSPという内蔵CPUが登場したことで、ファームウェアとの通信が標準化され、言語を替える前提条件がようやく整った。25年間の複雑化の責めを負ってきた旧ドライバーの行き詰まりと表裏一体だが、それでもNVIDIA社員がカーネル本流のメンテナーとして参加し、統合 ドライバーを走らせる道を用意したのは純粋に大きな進歩だ。一方で、Rustの導入で防げるバグと防げないバグの境界は、今後のLinux運用者に「言語立国」の幻想を捨てさせる教材になる。ドライバー開発の未来は着実にRust寄りへ移ろうとしている。ただし完成までの道のりは長く、一般ユーザーが体感できるのは数年先になるだろう。

-パソコン