Rust Advent Calender 2016,19 日目の記事です.
Rust で OS 作ったりなんだり,簡単にできるといいなあってことで.
まず,Rust で nostd な環境でどのようにすれば良いのか,なのですが,単純にこれだけならば,Rust の公式ドキュメントに載っています.
https://doc.rust-lang.org/book/no-stdlib.html
基本的には,
ここからが,ちょっとした TIPS になります.
実際に本当に使える何かを作ろうとしたとき,何もないと不便で,作りづらいです.そこで,Rust の libcore,つまり core ライブラリを使って,
そこで便利なのが,
最後に,宣伝というか.
UEFI で動かせるナニカを Rust で作りたいなーと思いつつ,放置してたのですが,crates.io に uefi というライブラリがあったので,手を出しはじめました. しかし,実装が全然足りてなかったので,少しづつ足したり直したりしながら使ってます.
https://github.com/orumin/rust-uefi
コントリビューションだとかツッコミだとか,色々手を貸して下さる方がおられるのならとても嬉しいです.
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
コントリビューションだとかツッコミだとか,色々手を貸して下さる方がおられるのならとても嬉しいです.