2016年12月20日火曜日

Rust で nostd(と UEFI)

Rust Advent Calender 2016,19 日目の記事です.

Rust で OS 作ったりなんだり,簡単にできるといいなあってことで.

まず,Rust で nostd な環境でどのようにすれば良いのか,なのですが,単純にこれだけならば,Rust の公式ドキュメントに載っています.
https://doc.rust-lang.org/book/no-stdlib.html
基本的には,nostd をコンパイラに指示して,lang_item を使っていくつかの不足のシンボルを定義してあげます. また,ここで panic_fmt をいい具合に定義するときっと panic!() とか使うのに役立つ(と思います).

ここからが,ちょっとした TIPS になります.
実際に本当に使える何かを作ろうとしたとき,何もないと不便で,作りづらいです.そこで,Rust の libcore,つまり core ライブラリを使って, core::fmt::Display でフォーマット文字列使ったり,core::mem::size_of で特定の型のメモリサイズを取得したり, core::ptr::null で null pointer 作ったり core::ptr::swap でポインタの中身を取り替えたり,そういう unsafe な部分も 組込みっぽい場所で必要になるでしょう.しかし,これらを使うにも,クロスコンパイルの時には,Rust のソースを全部もってきたりして,手動で core ライブラリを ビルドしてリンクさせないと使えなかったりするのです.

そこで便利なのが,xargo です.次のように使えます.
$ cargo install xargo
$ export PATH=$HOME/.cargo/bin:$PATH
$ xargo build
普段のcargoの代わりに,ビルドなどにこのコマンドを使うと,cargoのラッパーとして動作し,しかも core ライブラリ等を自動でビルド,リンクしてくれます. 結構地味に便利なので,ぜひ.

最後に,宣伝というか.
UEFI で動かせるナニカを Rust で作りたいなーと思いつつ,放置してたのですが,crates.io に uefi というライブラリがあったので,手を出しはじめました. しかし,実装が全然足りてなかったので,少しづつ足したり直したりしながら使ってます.
https://github.com/orumin/rust-uefi
コントリビューションだとかツッコミだとか,色々手を貸して下さる方がおられるのならとても嬉しいです.