linux kernelにrustがやってきた！(next-xxxxに)

#TL;DR : linux kernelのrepositoryでrustフォルダが掘られた（next branchで)

要約すると以下のようになるっぽい。

- rustはnightly build版が必要になります。nightlyの機能を活用しているので。
- x86-64とarm64がサポートされています。あと、LLVM前提になります。
- driver/charの下にサンプルコードがあるので、気になったら見てください。
- debugするときdemangleで問題になったら、ツール側をどうにかしてください。

# まずはこちらをご覧いただきたい…

https://www.kernel.org/

Linux Kernelのnext-XXXX branchにで…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/af1670c4-cbfb-933a-5151-4d74e4b213c1.png)

見慣れないフォルダ！！ **rust** !!! **rust** !!! **rust** !!!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/4eea9716-ad31-4f03-bb90-40d0f3c262e5.png)

確かに昨年、rustのサポートの話でていましたね…

https://japan.zdnet.com/article/35157012/

# ここから話を見つけました

lwn ( https://lwn.net/ ) に面白い記事ないかなー

↓

https://lwn.net/Articles/849849/

↓　twitterでネタ被ってないよね…を簡単に確認

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Rustの時代っぽいので，昨日書いたLinux Kernelに入りそうなRustについて軽くまとめた記事を共有しておきます．<a href="https://t.co/6qqjsjZ9bM">https://t.co/6qqjsjZ9bM</a><br>ソースコード読んだ方が楽しいしわかりやすいです．<a href="https://twitter.com/hashtag/kernelvm?src=hash&amp;ref_src=twsrc%5Etfw">#kernelvm</a></p>&mdash; ばにらびいんず(鳥) (@n01e0) <a href="https://twitter.com/n01e0/status/1373180849428910083?ref_src=twsrc%5Etfw">March 20, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

http://feneshi.co/Rust_In_Linux_Kernel/

↓

（ネタ被りということでは、ギリギリセーフかな…？　よし翻訳してみよう）

# ということで…

さっそく、新しく追加された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で問題になったら、ツール側をどうにかしてください。