LoginSignup
68
38

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-21

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にで…

image.png

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

image.png

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

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

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

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

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

ということで…

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
68
38