#TL;DR : linux kernelのrepositoryでrustフォルダが掘られた(next branchで)
要約すると以下のようになるっぽい。
- rustはnightly build版が必要になります。nightlyの機能を活用しているので。
- x86-64とarm64がサポートされています。あと、LLVM前提になります。
- driver/charの下にサンプルコードがあるので、気になったら見てください。
- debugするときdemangleで問題になったら、ツール側をどうにかしてください。
まずはこちらをご覧いただきたい…
Linux Kernelのnext-XXXX branchにで…
見慣れないフォルダ!! rust !!! rust !!! rust !!!
確かに昨年、rustのサポートの話でていましたね…
ここから話を見つけました
lwn ( https://lwn.net/ ) に面白い記事ないかなー
↓
↓ twitterでネタ被ってないよね…を簡単に確認
Rustの時代っぽいので,昨日書いたLinux Kernelに入りそうなRustについて軽くまとめた記事を共有しておきます.https://t.co/6qqjsjZ9bM
— ばにらびいんず(鳥) (@n01e0) March 20, 2021
ソースコード読んだ方が楽しいしわかりやすいです.#kernelvm
↓
(ネタ被りということでは、ギリギリセーフかな…? よし翻訳してみよう)
ということで…
さっそく、新しく追加されたRust関係のdocumentを見ていく( https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/Documentation/rust )。
- index.rst
- リンクのためのページなので、これはいいかな…
- quick-start.rst
- 開発に関連するところ!これは読んでおこう!
- docs.rst
- ドキュメンテーションのシステムの話…… 余力があれば読もう(今はいいや)
- coding.rst
- コーディングスタイルの話…… 余力があれば読もう(今はいいや)
- arch-support.rst
- サポートするアーキテクチャの話だけど、情報量ないし、これはいいかな…
quick_start.rst
Quick Start
このドキュメントは、Rustを使ってkernel開発をどうやって始める方法について記載されています。
貴方がRustで作業した経験がある場合、かかる時間は少しだけです。
Requirements: Building
このセクションでは、開発に必要となるツールの入手について説明をします。
これらの要求については、あなたのlinux distributionでは、rustc
, rust-src
, rust-bindgen
等のような名称で有効になっているかもしれません。しかし、書いているときには十分最新のものではない可能性があります(訳注:ここでいう「書く」は、あなたがドライバ/コードを書くという意味と思われます)。
rustc
最新の nightly Rust toolchain ( 少なくとも rustc
) が必要です、例えば nightly-2021-02-20
。我々の目的は安定的なtoolchainをできるだけ用いる事です。しかし、nightly featuresのいくつかに依存もしています。
あなたがrustup
を用いる場合、下記コマンドを実行してください。
rustup toolchain install nightly
あるいは、スタンドアロンのinstallerを取得したり、rustup を下記からインストールしてください。
https://www.rust-lang.org
Rust standard library source
build systemがcore
や``alloc`をクロスコンパイルするために、Rust standard library sourceが必要です。
あなたがrustup
を用いる場合、下記コマンドを実行してください。
rustup component add rust-src
あるいは、もしstandalone installerを使っている場合、あなたのnightly toolchainをインストールしたフォルダの中に、Rust repositoryをcloneすることもできます。
git clone --recurse-submodules https://github.com/rust-lang/rust $(rustc --print sysroot)/lib/rustlib/src/rust
bindgen
bindgen
toolを用いることで、kernelのC sideのbindingがbuild時に生成されます、最新のバージョン、例えば、0.56.0
で作業をするべきです。
インストール方法は以下です(ソースコードからtoolを構築します)::
cargo install --version 0.56.0 bindgen
このツールは、libclang
(LLVM)を使います。これは、kernel内のCコードを理解いするためです。すなわち、最新のLLVMをインストールしておかねばなりません。また、kernelをコンパイルするときには、CC=clang
あるいはLLVM=1
をつけることになります。
Requirements: Developing
このセクションでは、開発に必要となるツールの取得方法について説明します。もしkernelをbuildすることしかしないのであれば、これらは必要にはなりません。
rustfmt
rustfmt
toolは、C bindingの生成を含む、Rust kernel codeすべてに対する自動フォーマットに用いられるツールです(詳細については、rust_coding(Documentation/rust/coding.rst)を参照してください)
もしあなたがrustup
を使う場合、default
profileでは既にツールはインストールされています。そのため、そのまま先へ進めることができます。もし他のprofileを使っている場合、コンポーネントを手動でインストールすることもできます。
rustup component add rustfmt
standalone installerにはrustfmt
もまた含まれます。
clippy
clippy
は、Rust linterです(訳注:lint とはコンパイラよりも厳密にチェックをする機構)。make
する際に、CLIPPY=1
を渡すことで、Rust codeに対する追加の警告を得ることができます(詳細については、rust_coding(Documentation/rust/coding.rst)を参照してください)
もしあなたがrustup
を使う場合、default
profileでは既にツールはインストールされています。そのため、そのまま先へ進めることができます。もし他のprofileを使っている場合、コンポーネントを手動でインストールすることもできます。
rustup component add clippy
standalone installerにはclippy
もまた含まれます。
rustdoc
rustdoc
toolをインストールすることで、Rust codeに対する素晴らしいHTML documentationを得る事もできるようになります。それには、kernelの残り部分で使われているrust/
内のライブラリ(crates)も含まれます。(詳細については、rust_coding(Documentation/rust/coding.rst)を参照してください)
もしあなたがrustup
を使う場合、default
profileでは既にツールはインストールされています。そのため、そのまま先へ進めることができます。もし他のprofileを使っている場合、コンポーネントを手動でインストールすることもできます。
rustup component add rustdoc
standalone installerにはrustdoc
もまた含まれます。
Configuration
General setup
menu内で、Rust support
(CONFIG_RUST
)を有効にしなければなりません。このオプションは、build systemがrustc
を配置している場合にだけ表示されます。次に、Rustが必要とする残りのオプションについて表示されます。
そのあと、`Device Driversの下の
Character devices``に異動し、``Rust example`` (``CONFIG_RUST_EXAMPLE``)という、Rust driverのサンプルを有効にしてください。
Building
x86_64やarm64 kernelを、GCC、Clangあるいは完全なLLVM toolchainでbuildすることはうまく動作するはずです。しかし、現時点ではGCCでの利用は実験的であることに注意をしてください。
Hacking
もしより深淵を覗きたい場合には、drivers/char/rust_example.rs
に置かれたサンプルドライバーのソースコードを見てください。Rustのサポートコードはrust
にあります。また、kernel hacking
の下に、Rust hacking
menuもあります。
もしGCB/Binutilsを使っているが、Rust symbolでdemangleされない場合、その理由は利用しているtoolchainがRustの新しいv0 mangle schemeをまだサポートしていないからかもしれません。いくつかの方法が考えられます。
-
独自にtoolをbuildしてよいならば、GCC向けの非常に新しいreleaseにおけるcherry pickedでのサポートしたforkに追従することができます。
https://github.com/Rust-for-Linux/binutils-gdb/releases/tag/gdb-10.1-release-rust https://github.com/Rust-for-Linux/binutils-gdb/releases/tag/binutils-2_35_1-rust
-
もしGDBしか必要とせず、
CONFIG_DEBUG_INFO
を有効にできるならば:
GDBのいくつかのバージョン(例えば、vanilla GDB 10.1)ではデバッグ情報として既にdemangledされた名前を利用することができます。 -
もしloadble moduleのサポートが要らないのであれば、compileするときに
-Zsymbol-mangling-version=v0
を外してください。しかし、これは我々はサポートしていませんので、急ぎでない場合には利用するべきではありません。
まとめ
- rustはnightly build版が必要になります。nightlyの機能を活用しているので。
- x86-64とarm64がサポートされています。あと、LLVM前提になります。
- driver/charの下にサンプルコードがあるので、気になったら見てください。
- debugするときdemangleで問題になったら、ツール側をどうにかしてください。