10月24日、pbxscience.comが「Linux 7.4 Brings About 17,000 Lines of Rust Code, but the Real Story Is the Infrastructure」と題した記事を公開した。Linux 7.4カーネルに統合される約17,000行のRustコードの内訳と、その本質がドライバではなくインフラ整備にある点について詳しく論じている。
「Linux 7.4に17,000行のRust」——この数字だけ見れば、Linuxカーネルへのrust移行が大きく前進したように聞こえる。だが実態はやや異なる。その大部分は新機能の追加ではなく、依存ライブラリの更新と開発者向け抽象化の整備だ。地味に聞こえるが、これこそがRust for Linuxの現在地をよく表している。
Rust for Linuxは、2022年にLinux 6.1で公式にカーネルへ取り込まれたプロジェクトで、メモリ安全性が求められるカーネルコードをRustで記述できる環境を整えることを目標としている。その後もバージョンを重ねるごとに対応範囲が広がり、Linux 7.x系に至った現在は「使える環境を作る」フェーズから「使いやすくする」フェーズへと軸足が移りつつある。主要メンテナーのMiguel OjedaがLinux 7.4のマージウィンドウに向けて送付したプルリクエストが、今回の記事で詳しく紹介されている。
「17,000行」の大部分はライブラリ更新
最大の変更は、Zerocopyクレートの8バージョン分の更新だ。Zerocopyは、生バイト列と構造化された型の間を安全に変換するためのトレイトとマクロを提供するライブラリで、デバイスやハードウェア定義のバイナリ形式を扱うカーネルコードには欠かせない。CPUやハードウェアはメモリ上のデータ配置に厳格なルール(アライメント)を要求することが多く、不用意な型変換はデータ破損や不正なメモリアクセスを招く。Zerocopyが提供する型制約を使えば、こうしたリスクをunsafeコードを書かずに回避できる。
ただしこれは、カーネル全体のセキュリティが突然向上するといった話ではない。重要な依存ライブラリを最新に保ち、将来の機能追加に耐えられる土台を作る保守作業だ。行数の多さはここに由来しており、「新しいドライバが大量に増えた」という印象とは切り離して読む必要がある。
新モジュール:memとratelimit
Rustカーネルクレートにはmemとratelimitという2つのモジュールが追加された。
ratelimitはカーネルで古くから使われる技法で、同一エラーが繰り返し発生した際にログが溢れるのを防ぐ仕組みだ。これをRustから慣用的なインタフェースで呼び出せるようにするのがこのモジュールの役割である。新しいOS機能を追加するのではなく、カーネルがすでに持つ仕組みをRust開発者が自然に使えるよう抽象化するというアプローチで、今回の変更全体の方向性をよく表している。memモジュールも同様の思想に基づき、メモリ操作に関する安全な薄い抽象層を提供する。
pin-initの強化:自己参照構造体を安全に扱う
pin-initはRust for Linuxが独自に使用するクレートで、メモリ上の固定アドレスに配置されなければならないオブジェクトの初期化を担う。今回のアップデートでは次の2点が追加された。
- タプル構造体のサポート:フィールドを位置で参照する構造体への対応
- 自己参照構造体の安全な初期化:オブジェクトが自身への参照を持つ場合、移動によってその参照が無効になるリスクがある。ピン留めと適切に設計された初期化APIを組み合わせることで、このような低レベルのパターンを扱いやすくする
カーネルの低レベルデータ構造では自己参照パターンが頻出するため、この改善は実際のドライバ開発で即座に効く変更だ。
proc_macro_spanで開発者体験を改善
今回のプルリクエストはRustの不安定機能であるproc_macro_spanも有効化する。これにより手続きマクロ(procedural macro)がより正確なソース位置情報を報告できるようになり、エラー発生時に開発者が問題箇所を特定しやすくなる。
カーネルのRustコードはバインディング生成や複雑な関係の表現にマクロを多用するため、エラーメッセージの精度向上は実際の開発時間の短縮に直結する。この機能は不安定版であるため、カーネルビルドが独自のツールチェーン要件を持つという現状とも整合している。
メインのプルリクエスト以外にも動きがある
Linux 7.4のRust関連の変更は、このプルリクエストだけではない。NVIDIAのNovaドライバのアップデートやRust DRMインフラの整備が、それぞれ別のサブシステムのプルリクエストとして並行して進んでいる。
Linuxの開発はサブシステム単位で管理されるため、共有インフラとドライバの実装は別々にレビュー・マージされる。両者は相互に作用する関係にあり、共通の抽象化がドライバを書きやすくし、実際のドライバ開発が抽象化の不備を露わにする。この往復こそが、Rust for Linuxの成熟を地道に進める構造だ。
行数の多さより、何を何のために変えたかを問うのがこのリリースの読み方だ。Zerocopyの更新、新モジュールの追加、pin-initの強化、診断の改善——いずれも地味だが、これらの積み重ねがRustでドライバを書くコストを着実に下げていく。スケールより先に共通基盤を固めるというRust for Linuxの戦略は、このリリースにも一貫して見て取れる。
詳細はLinux 7.4 Brings About 17,000 Lines of Rust Code, but the Real Story Is the Infrastructureを参照していただきたい。