OS自作入門 on Linux [day 1]

今回のコード。

https://github.com/zakuro9715-MiaOS-history/day01

一日目は、とりあえずHello Worldを表示させます。

本ではnaskというNASM-likeなアセンブラを使っていますが、Linuxには当然ないので、gasを使います。

が、しかし、nask(NASM)はインテルシンタックスであるのに対し、gasはAT&Tシンタックスであるため、文法が全然違います。

例えば

nask

mov ax, 0 ; axレジスタに0を代入

gas

mov $0, %ax # naskとは逆。レジスタには%、値には$をつける

という感じです。

miaos.sはこんな感じ

まず目につくのが、DBではなく、.wordとか.byteとかがたくさんある点です。gasではDB命令の代わりに、これらの命令を使います。一対一の対応でない点に注意です。   

[table]

gas での命令,説明

.byte,8bit

.word,16bit

.ascII,ASCII文字列

[/table]

  22行目に出てくるskip 命令は、指定したバイト数分飛ばす命令です。2つ目の引数を指定すると、飛ばした場所がその引数で埋められます。つまり、22行目は、18byte を0で埋める、という意味になります。

その後もまた、本に書いてあるとおりですが、35行目にorg 命令が登場します。この命令は、指定した場所まで飛ばす命令です。

その次には、0x55 と 0xaa をおいていますが、これはブートセクタ・シグネチャと呼ばれるもので、FAT12 のためのものです(FAT12 が何かわからなければ無視すれば良いです)

その後ろも、多分 FAT12 の何かでしょう。どうせ day 2からはなくなるので無視しておきます。

 

これで miaos.s は終わりです。やったね、できたよ。と言いたいところですが、世の中そう甘くはありません。この後アセンブルしなくてはなりません。

アセンブルは、まずは普通に行います

$ as miaos.s -o miaos.bin

 次に、リンクを行います。

 <code>$ ld miaos.bin -o miaos.img</code>

 すると、たぶんエントリーポイントがないよって warning が出てくると思います。 ldを普通に実行すると、実行ファイルを作成しようとします。しかし、 miaos.s にはエントリーポイントを書いていないので warning がでます。実行ファイルを作ろうとしているので、当然OSとしては動きません。 これを解決するためには、ld に対して、「実行ファイルじゃなくてただのオブジェクトを作ってね」と命令する必要があります。命令は、リンカスクリプトと呼ばれるスクリプトを作って ld コマンドに渡します。

見れば明らかですね。i386向けのバイナリを出力しろ、という意味です。

そして再びリンク

$ ld miaos.bin -T binary.ls -o miaos.img

リンカスクリプトは -T オプションで指定します。

これで本当に出来上がりなので、最後に実行です。OSを動かすためには当然マシンが必要ですが、すぐに用意できる人は少ないと思うので、仮想マシンを使います。

これは本と同じで、qemu を使います。apt にあると思うので適当にインストールしましょう。

実行コマンドは、qemu-system-i386 または qemu-system-x86_64 を使います。どちらでも動きますが、私は qemu-system-x86_64 を使っています。

フロッピーから起動するために、-fda オプションを付けます

$ qemu_system_x86_64 -fda miaos.img

画面に Hello World! と表示されたと思います。これで1日目は完了です。

 

day2 に割り当てられていた Makefile の作成も一日目にやってしまいます。

とはいっても、この行以外は簡単です。

$(IMG:%.img=%.o) は、単なる置換です。$(IMG)の拡張子を o に置換したものを表します。つまり、この場合は miaos.o です。

Makefileに miaos.o のルールがありませんが、.o ファイルは何も指定しない場合は as で自動的にコンパイルされることになっています。

また、$^ は依存しているルールを表すので、最終的には、

$ ld miaos.o -T binary.ls -o miaos.img

という意味になります。

これで本当に1日目は終わりです。アセンブラの文法の違いがあったので、長くなってしまいました。

 

今回参考にしたページ