Ubuntu 18.04で30日OS自作入門をやりたい[1日目]
まえがき
この度「30日でできる!OS自作入門」というのを購入しまして、少し読み進めたらWindowsでないと本通りに進めていくことが出来ないことが判明しました。なんと僕のお家にはWindows環境の入ったPCが無い(!)ので、Linuxでやってる方はいらっしゃらないかなあと思っていた所、結構いらっしゃいました!それらを参考にしながらこっちにもつらつらと使ったツールとか載っけながら日記的に書いていこうかなと思っています。クソザコナメクジはクソザコナメクジなりに先人様の知識を頼りに歩いていきます。
順調に毎日1日目…2日目と更新出来ればいいのですが、現実そうは行きません。なんと2学期が始まってしまいそうです(現在8月30日)。現実は厳しい。というわけで飛び飛びの更新になりそうですが、よろしくお願いします。更新が止まったら察して下さい。ちなみに夏休みの宿題は終わってません。よろしくお願いします。
使ったツール群
・ghex
バイナリエディタ。最初はhexeditを使っていたけどコピーアンドペーストなどが独特だったため取り止め。GUIで使いやすいです。
・qemu
フリーのPCエミュレータ。これからもとてもお世話になるっぽい。
・nasm
x86向けのアセンブラ(本で使われているnaskの元(?))
$ sudo apt-get install ghex $ sudo apt-get install qemu $ sudo apt-get install nasm
でインストール可能です。
8月30日,8月31日
バイナリエディタとにらめっこ
本に従いバイナリエディタに16進数を書き込んでいきます(ファイル名は本に則ってhelloos.img)。
イヒーwwwwwwwwwwwwwwwww
オフセット0x80あたりまで写経を終えたら次は0x168000まで地獄の0x00コピーアンドペースト大会です。もうちょっと頭のいい方法あるんじゃないかなあと悩みながら頭の悪い僕はコピーとペーストとカットを繰り返し、1時間かけて写経を終えました。あとは書くとこ書いて終わり。次はこの.imgファイルをqemuにかけます。
$ qemu-system-i386 helloos.img
最初 $ qemu とかやったんですがダメみたいでした。ちゃんとアーキテクチャを指定しなきゃダメみたいです。
実行するとこんな感じになります。わあい。
実行時に
WARNING: Image format was not specified for 'helloos.img' and probing guessed raw. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted. Specify the 'raw' format explicitly to remove the restrictions.
と警告が出るのですが(俺は出ました)、その時は
$ qemu-system-i386 -drive file=helloos.img,format=raw,if=floppy
で警告を出さずに表示させることが出来ました。
9月1日
某お祭りのお手伝いをしてました。[実績解除]子供に接客する
9月2日
夏休みの宿題をやっていました。
9月3日
アセンブリで頭良く
アセンブリを書くのは授業でPICアセンブラでヒイヒイ言わされたぶりなので心配なんですがやっていきましょう。写経写経。
ってわけで写経したのがこれです。
helloos.asm
;hello-os ;TAB = 4 ;FAT12フロッピーのための記述らしいです DB 0xeb,0x4e,0x90 DB "HELLOIPL" DW 512 DB 1 DW 1 DB 2 DW 224 DW 2880 DB 0xf0 DW 9 DW 18 DW 2 DD 0 DD 2880 DB 0,0,0x29 DD 0xffffffff DB "HELLO-OS " DB "FAT12 " RESB 18 ;main DB 0xb8,0x00,0x00,0x8e,0xd0,0xbc,0x00,0x7c DB 0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8a DB 0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09 DB 0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xeb DB 0xee,0xf4,0xeb,0xfd ;message DB 0x0a,0x0a DB "Hello,World!" DB 0x0a DB 0 RESB 0x1fe-$ ;① DB 0x55,0xaa ;ブートセクタ以外の部分だそうです DB 0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00 RESB 4600 DB 0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00 RESB 1469432
ぶっちゃけ載せる意味は無いっちゃ無いんですが載せてると凄そうなことをしてるように見えるので載せときます。
nasm「エラーだぞ」
$ nasm helloos.asm
で実行すると、上記アセンブリの①の部分にこんなエラーが
helloos.asm:35: error: attempt to reserve non-constant quantity of BSS space
RESB 0x1fe-$は本によると510( = 0x1fe)バイトまで0で埋め尽くすための命令みたいです。こいつがnasmだとエラーを吐く。うーむ。調べるとRESB 0x1fe-($-$$)とするべきみたいです。nasmでは$はその行の最初、$$は現在のセクションの最初を表すみたいなのでセクション内でどれぐらい離れてるか知るには$ - $$とすればいいということみたいです。完全に理解した(大嘘)。
つーわけで①に正しいのに変えてあげてアセンブルします。おわ、警告が
helloos.asm:21: warning: uninitialized space declared in .text section: zeroing helloos.asm:35: warning: uninitialized space declared in .text section: zeroing helloos.asm:40: warning: uninitialized space declared in .text section: zeroing helloos.asm:42: warning: uninitialized space declared in .text section: zeroing
対応を見てみると全部RESB命令の所で出たwarningでした。調べるとTIMES命令を使えばwarningが出てこない…?まあ出来たので実行実行!どうせならということでDB "Hello,World!"の「こんにちは世界」の文章を変えてみちゃいましょう。アセンブルしてqemuにかけてやります。
$ qemu-system-i386 -drive file=helloos,format=raw,if=floppy
おお〜〜。
ここまですごく長かったです…一日目なのにこの進みは亀もびっくり、マズイ気がしなくもないけど成功してよかったです。