初めに #
最近、Rust が Linux カーネルに利用され始めているという話をよく見かけます。
従来の Linux カーネルは C 言語で実装されていますが、メモリ管理に起因する脆弱性が多く発生しているのが現状です。
脆弱性データベース「cvedetails.com」によると、こうしたメモリ関連の問題は長年にわたり増加傾向にあります。
2025 年に報告された Linux カーネルの脆弱性のうち、実に95%以上がバッファオーバーフロー(Overflow)またはメモリ破損(Memory Corruption)に分類されている状況となっております。
Rust では、所有権やライフタイムといった仕組みにより、バッファオーバーフロー や Use-after-free のような C 言語で発生しやすいバグをコンパイル時に検出することが可能となっています。
そのため、これらの脆弱性を設計段階で防ぐ手段として有効なのではないかと多くの開発者から期待されています。
とはいえ多くの情報が「Rust 対応が進んでいる」「今後拡大していく」といった方針や計画に関するニュース記事が中心となっており「実際にどこで Rust が使われているのか」「何が Rust で書かれているのか」についての情報は多くありません。
そこで今回は、Linux カーネルのソースコードをもとに、Rust が実際にどのような機能として実装されているのか初心者向けにご紹介します。
アーカイブファイルの取得 #
初めに、Linux カーネルのソースコードを公式サイトより取得します。
今回は 2025年12月時点の最新安定版である v6.18.1 を使用します。
それでは以下のように wget コマンドを実行して、ソースコードを取得します。
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.18.1.tar.xz
ダウンロードが完了すると、次のような出力が表示されます。
`linux-6.18.1.tar.xz' に保存中
linux-6.18.1.tar.xz 100%[================================================================>] 147.14M 185MB/s 時間 0.8s
2025-12-15 19:36:44 (185 MB/s) - `linux-6.18.1.tar.xz' へ保存完了 [154284200/154284200]
ファイルの展開 #
ダウンロードしたアーカイブファイルは .tar.xz 形式の圧縮ファイルになっておりそのままでは確認できません。
そのため、以下のコマンドを実行し圧縮ファイルの展開を行います。
tar -xf linux-6.18.1.tar.xz
展開が完了すると、カレントディレクトリ内に linux-6.18.1/ というディレクトリが作成されます。
この中にカーネル全体のソースコードが展開されており、各コンポーネントやドライバ、ドキュメントなどが含まれております。
Rustファイルの抽出 #
展開したソースコードの中から、find コマンドを実行し Rust で書かれているファイル(.rs 拡張子)を検索します。
find ./linux-6.18.1 -type f -name "*.rs" 2>/dev/null
実行結果(一部抜粋)は以下のとおりとなります。
./linux-6.18.1/drivers/android/binder/allocation.rs
./linux-6.18.1/drivers/android/binder/context.rs
./linux-6.18.1/drivers/android/binder/deferred_close.rs
./linux-6.18.1/drivers/android/binder/defs.rs
./linux-6.18.1/drivers/android/binder/error.rs
./linux-6.18.1/drivers/android/binder/freeze.rs
./linux-6.18.1/drivers/android/binder/node.rs
このように、Rust は現時点で主に一部のドライバやサブシステム、そしてサンプル群などに限定的に導入されていることがわかります。
| カテゴリ名 | 種別 | パス |
|---|---|---|
| Android Binder | ドライバ | drivers/android/binder/ |
| rnull | ドライバ | drivers/block/rnull/ |
| rcpufreq | ドライバ | drivers/cpufreq/ |
| NOVA/DRM | ドライバ | drivers/gpu/drm/nova/ |
| TYR/DRM | ドライバ | drivers/gpu/drm/tyr/ |
| NOVA Core | ドライバ | drivers/gpu/nova-core/ |
| PHY ネットワーク | ドライバ | drivers/net/phy/ |
| カーネル内部機能 | サブシステム | rust/kernel/ |
| Rustインフラ構成 | サブシステム | rust/(直下)および scripts/ |
| Rustサンプル実装 | サンプル | samples/rust/ |
Rust実装の割合はどのくらい? #
ここでは、Rustファイル(.rs)と従来のC言語ファイル(.c)のソースコード文字数を比較し、大まかな導入割合を確認してみます。
「どのくらいの規模で Rust が導入されているのか?」を知る手がかりとして、コードの量からその割合を見ていきます。
C言語の文字数 #
まずは従来通りカーネル実装の主軸である C 言語のファイル(.c)から、文字数を集計してみます。
$ find ./linux-6.18.1 -type f -name "*.c" -exec cat {} + | wc -m
703370520
結果は 703,370,520 文字となっており、Linux カーネルの中核を担っていることが数値からも分かります。
長年の開発・保守によって蓄積された膨大なコードベースが、いまも C 言語によって維持されているという実態がこの数字に表れています。
Rust言語の文字数 #
次に、Rust で記述されたソースコード(.rs)の文字数を集計してみます。
$ find ./linux-6.18.1 -type f -name "*.rs" -exec cat {} + | wc -m
2386394
結果は 2,386,394 文字となりました。
次の項目にて割合を計算していきます。
割合計算 #
最後に、集計した .rs ファイルと .c ファイルの文字数から、全体に占める割合を算出してみます。
$ python3 -c 'print("Rust: {:.2f}%, C: {:.2f}%".format(2386394/(2386394+703370520)*100, 703370520/(2386394+703370520)*100))'
Rust: 0.34%, C: 99.66%
この結果から、Linux カーネル全体において 99% 以上が C 言語で記述されており、Rust は全体の 0.5% にも満たない状況であることがわかりました。
今後は対象領域の拡大に伴い Rust の比率が増加していくものと思われます。
具体的な実装箇所の紹介 #
Rust が実際に使われている部分を、カーネルサブシステムとドライバからそれぞれ 1 つずつ取り上げて簡単に見てみます。
サブシステム(基盤コード) #
Rust 向けのカーネル機能は rust/kernel/ 以下に集約されており、メモリ管理や同期、デバイスモデル、ファイルシステムなど多岐にわたるコンポーネントが Rust で実装されています。
これらは Rust 製のモジュールやドライバから呼び出して利用することができます。
たとえば、メモリ管理関連のコードは以下のように配置されています。
rust/kernel/
├── mm.rs
└── mm/
├── mmput_async.rs
└── virt.rs
mm.rs は、メモリ管理機能を利用するための**「入り口」**となるファイルとなります。
もともと C 言語で書かれているカーネルのメモリ管理機能を、Rust から安全に扱えるように橋渡し(ラップ)する役割を担っています。
ここでは、プロセスのアドレス空間や仮想メモリ領域などを表す構造体や、それらを操作するためのインターフェースが定義されています。
Android Binder(ドライバ) #
drivers/android/binder/ 以下には、Android 向けの Binderドライバ が配置されており、多くの機能が Rust にて実装されています。
$ ls linux-6.18.1/drivers/android/binder/
Makefile defs.rs node.rs process.rs rust_binder_events.h stats.rs
allocation.rs error.rs page_range.rs range_alloc rust_binder_internal.h thread.rs
context.rs freeze.rs page_range_helper.c rust_binder.h rust_binder_main.rs trace.rs
deferred_close.rs node page_range_helper.h rust_binder_events.c rust_binderfs.c transaction.rs
この機能は、Android プラットフォームにおけるプロセス間通信の基盤として動作するドライバとなります。
例えば transaction.rs では、ユーザープロセスから送信されたトランザクション要求を受け取り、対象プロセスに処理を転送する際の制御ロジックやデータ構造が実装されています。
まとめ #
Linux カーネルへの Rust 導入は、従来の C 言語ベースの実装に対する安全性・保守性の課題を補完する取り組みとして、注目を集めています。
実際に v6.18.1 のカーネルソースを確認したところ、Rust はまだ全体の 0.5% 未満の規模にとどまっているものの、すでに複数のサブシステムやドライバに実用的な形で組み込まれていました。
特に、rust/kernel/ 以下にはドライバなどが利用可能な共通基盤が整備されており、実際のドライバなどでも Rust が活用されています。
現在は既存機能の置き換えや一部領域での実装が中心ですが、今後新たなドライバや仕組みを追加する際には、Rust が採用されるケースも増えてくるかもしれません。
最後までご覧いただき、ありがとうございました。