「30日でできる!OS自作入門」をRustで。3日目

Posted on June 4, 2019 , Tags: OS自作入門, OS, Rust

「30日でできる!OS自作入門 」 を読みはじめた。 せっかくなのでCの部分はできるだけRustで書いてみようと思う。Cの導入部分からなので、3日目から開始となる。
この記事の成果物となるコードは yoshitsugu/haribote_os_in_rust においてある。
検証環境としてはx86_64のLinuxマシンとなる。

下準備

まずはRustのプロジェクトを準備

Rust nightlyの機能を使いたいので、nightlyが使われるようにしておく。

asmファイルは本家のものからコピーして /asm 以下に配置した。また、ビルドしたものは /build に置くことにする。
ipl.asm, asmhead.asm のアセンブルのため、Makefileを作成しておく。

Rustのコードを書く

ここでは、最終的に白い画面がでたら成功とする。(若干4日目を先取りしている。)

RustのコードをOSとして動かすために、OSが機能を提供しているものを排除する必要がある。このため、 #![no_std] でstdライブラリを使用しないようにしている。また、panicの時のhandlerも自分で設定する必要がある。
このあたり、Writing an OS in Rust というシリーズもののブログもあり、大変参考になった。

Rustをコンパイルする

既存のターゲットトリプルへのコンパイルでは動かないため、まずは、カスタムターゲットの設定が必要になる。
i686-haribote.json という名前でターゲットの設定ファイルを作る。(名前はなんでもよい)

ビルドの時に --target i686-haribote.json としてもよいが、毎回指定するのも大変なため、 .cargo/config に記載しておく

[build]
target = "i686-haribote.json"

Cargo.toml も調整が必要。panic時にstackがunwindされるのを防ぐため、 panic = "abort" を指定。また、Rustコードはstaticlibとしてビルドするようにする。

ビルド時には cargo build の代わりに、 cargo xbuild を使用する。これは、 Rust Coreライブラリという最低限のデータ構造などのセットを提供してくれるものを使用するときに便利だ。

imgを作る

ここからは こちらの記事 を参考にOSとして動くようにしていく。
まずは上記のRustコードから生成されたライブラリのリンクをする。(実際はファイルのフォーマットのみでリンクは行っていないようだ。)

上記のkernel.binとasmから作ったasmhead.binを結合してsysファイルを作る

最後にOSイメージの作成をする

この辺りの操作もMakefileに追記しておく

確認

make runでQEMUが起動し、確認できる。

QEMU起動

参考文献