The embedonomicon

embedonomiconは、#![no_std]アプリケーションをスクラッチから作成するプロセスと、 Cortex-Mマイクロコントローラ向けにアーキテクチャ固有の機能を作るイテレーティブなプロセスを案内します。

目的

本書を読むことで、次のことを学べます。

  • #[no_std]アプリケーションのビルド方法。これは、#![no_std]ライブラリをビルドするより、はるかに複雑です。 なぜなら、ターゲットシステムではOSが動いていないからです(もしくは、OSを作ろうとしているかもしれません!)。 そして、プログラムは、ターゲット上で動作する唯一(もしくは、最初の1つ)のプロセスになります。 この場合、プログラムは、ターゲットシステム向けにカスタマイズが必要です。
  • Rustプログラムのメモリレイアウトを細かく制御するためのコツ。 リンカ、リンカスクリプト、および、RustプログラムのABIの一部を制御できるようにするRustの機能について学びます。
  • (実行時にコストがかからない)静的オーバーライド可能なデフォルト機能を実装する秘訣。

対象読者

本書は主に、2つの読者を対象としています。

  • エコシステムがまだサポートしていないアーキテクチャ(例えば、Rust 1.28におけるCortex-R)や、 Rustがサポートを始めたばかりのアーキテクチャ(例えば、Extensaは将来サポートされるかもしれません)に対して、 ベアメタルでのブートを提供したい人々

要求事項

本書は、自己完結しています。読者は、Cortex-Mアーキテクチャについて詳しかったり、Cortex-Mマイクロコントローラを持っている必要はありません。 本書内の例は、全てQEMU上でテストできます。しかしながら、本書内の例を実行したり調査するため、次のツールをインストールする必要があります。

  • 本書内の全コードは、2018エディションを使います。2018エディションの機能やイディオムを知らない場合は、 エディションガイドを確認して下さい。
  • Rust 1.31以上のツールチェインとARM Cortex-Mコンパイルのサポート
  • ARMエミュレーションをサポートしているQEMU。qemu-system-armがインストールされていなければなりません。
  • ARMサポートのGDB。

設定例

全てのOSに共通する手順です。

$ # Rustツールチェイン
$ # 1からやる場合、https://rustup.rs/からrustupを入手して下さい
$ rustup default stable

$ # ツールチェインは、これより新しくなければなりません
$ rustc -V
rustc 1.31.0 (abe02cefd 2018-12-04)

$ rustup target add thumbv7m-none-eabi

$ # cargo-binutils
$ cargo install cargo-binutils

$ rustup component add llvm-tools-preview

macOS

$ # arm-none-eabi-gdb
$ # 最初に`brew tap Caskroom/tap`を実行しなければならないかもしれません
$ brew cask install gcc-arm-embedded

$ # QEMU
$ brew install qemu

Ubuntu 16.04

$ # arm-none-eabi-gdb
$ sudo apt install gdb-arm-none-eabi

$ # QEMU
$ sudo apt install qemu-system-arm

Ubuntu 18.04 or Debian

$ # gdb-multiarch。gdbを起動する時は、`gdb-multiarch`を使って下さい
$ sudo apt install gdb-multiarch

$ # QEMU
$ sudo apt install qemu-system-arm

Windows

(オプションのステップ)(Ubuntu 18.04でテスト済み)ARMからツールチェイン一式をインストール

  • 最近の2018では、Cortex-Mマイクロコントローラ向けのリンカが、GCCのリンカからLLDに切り替わりました。 gcc-arm-none-eabiはもはや必要ありません。しかし、このツールチェインを使いたい人は、ここから下記の手順でインストールできます。
$ tar xvjf gcc-arm-none-eabi-8-2018-q4-major-linux.tar.bz2
$ mv gcc-arm-none-eabi-<version_downloaded> <your_desired_path> # オプション
$ export PATH=${PATH}:<path_to_arm_none_eabi_folder>/bin # 設定を永続的にするため、この行を.bashrcに追加します。