Rustでカーネルモジュール
先日、C言語、アセンブリ以外でカーネルモジュールが書けるようになるというニュースがありました。
Rustというプログラミング言語でカーネルを記述できるようになります。
ということで、カーネルモジュールをお試しで書いてみました。
いくつか、超えるべきハードルがありますので、説明します。
超えるべきハードル
RustでLinuxカーネルを書くための環境作りをやっていきます。
Rust for Linuxのクイックスタートに書いてある通りです。
さて、いくつかやるべきことがあります。
- Rust用カーネルをダウンロードする
- LLVM, clangのインストール
- rustのツールのインストール
どうやるかは順に説明します。
Rust用カーネルをダウンロードする
Linuxの6.1からRust用カーネルがサポートされるそうです。
2022/11/29時点で最新は6.0なので、Linuxカーネルをgitで取ってくる必要があります。これが時間かかりました。
※時間がたてば6.1がリリースされディストリビューション配布のカーネルになるはずです。
# apt install git $ mkdir ~/rust-linux $ cd ~/rust-linux $ git clone https://github.com/Rust-for-Linux/linux.git
以下、git cloneしたソースで作業します。
$ cd linux
2022/12/14追記
ついにLinux 6.1が2022/12/11(アメリカ時間)にリリースされました。
最新機能を試したいときは上記のようにrust-linuxからとってくる方がよいですが、そうでない方はメインラインからとってくればよいことになります。
The Linux Kernel ArchivesでLatestを取得してください。
$ wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.tar.xz $ tar xvf linux-6.1.tar.xz $ cd linux-6.1
LLVM, clangのインストール
Debian testingではaptでインストールするだけです。
# apt install llvm libclang-dev
2022/11時点ではUbuntuやDebian stableではaptでインストールできませんので、llvmのビルドをやってください。こちらです。これをやるよりは、Debian testingをインストールする方が楽だと思いますが。
※時間がたてば、安定なディストリビューションで採用されるはずです。
rustのツールのインストール
Rustをインストールしていなければ、インストールしてください。
# apt install curl $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh $ exec bash
以下でRustのHello Worldをやってます。
>>> HelloWorldへの道 Rust編 Windows上のプログラミング環境構築
rustc
次に、rustcのバージョンを合わせます。
$ rustup override set $(scripts/min-tool-version.sh rustc)
rust-src
Rust標準ライブラリのためのソースをダウンロードします。
$ rustup component add rust-src
bindgen
bindgenをインストールします。
$ cargo install --locked --version $(scripts/min-tool-version.sh bindgen) bindgen
Rust用カーネルのビルド
configをどこからか持ってきてください。私は別のソースで事前にコンパイルしていたので、それを使います。
事前に他カーネルでビルドするのは以下で。
>>> はじめてのLinuxカーネルのビルド方法 手順と気を付けること
$ cp ~/kernel/linux-source-6.0/.config . #ここは人それぞれ $ make oldconfig $ make menuconfig
General Seup -> Rust supportをチェックできればOKです。
チェックできない場合(選択肢が出てこない場合もある)は、/rustで検索して、依存するものが正しいかを確認します。
私の場合は、MODVESIONSがnのはずがyだったので、/MODVESIONSを検索してEnable loadable module suport でModule versioning support のチェックをはずしました。
正しく設定を合わせればGeneral Seup -> Rust supportが登場します。チェックしてください。
念のため、以下でRust用カーネルをビルドできるかを確認します。
$ make LLVM=1 rustavailable
何かエラーが出たら対応してください。
以下でカーネルをビルドしてインストールです。
$ make LLVM=1 # make modules_install # make install
再起動できたら成功です。uname -rで確認してください。
カーネルモジュールを作ってみる
最後に、Rustでカーネルモジュールを作ってみます。
Sampleがsamples/rustにありますので覗いてみてください。
$ make menuconfig
として、Kernel Hacking -> Sample kernel code -> Rust samplesでビルドしたいカーネルモジュールをチェックします。
下記は、Minimalをチェックしているところです。
再びビルドします。
$ make LLVM=1 # make modules_install
rust_minimalを動作させる
rust_minimalを動作させてみましょう。
カーネルモジュールの情報を見てみる。
# modinfo rust_minimal
カーネルモジュールをインストールしてみる。
# modprobe rust_minimal
minimalはdmesgにメッセージを出すだけのカーネルモジュールですのでdmesgで確かめてください。
# dmesg |grep rust
また、モジュールがあるかどうかは以下でも確かめることができます。
# lsmod | grep rust # cat /proc/modules | grep rust
まとめ
Rust用Linuxカーネルをビルドして、Rustのカーネルモジュールのサンプルを作ってみました。
まだまだ先進機能ですので、ややこしい準備がありましたが、楽しめましたか?
今日からあなたもカーネルハッカーです。楽しんでいきましょう。
コメント