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ソースコード読んだ方が楽しいしわかりやすいです.#kernelvm— ばにらびいんず(鳥) (@n01e0) March 20, 2021
↓
(ネタ被りということでは、ギリギリセーフかな…? よし翻訳してみよう)
ということで…
さっそく、新しく追加された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
bindgentoolを用いることで、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 hackingmenuもあります。
もし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で問題になったら、ツール側をどうにかしてください。