まりものメモ帳

なぐり書き

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)。
f:id:admarimoin:20180903230547p:plain
イヒーwwwwwwwwwwwwwwwww
オフセット0x80あたりまで写経を終えたら次は0x168000まで地獄の0x00コピーアンドペースト大会です。もうちょっと頭のいい方法あるんじゃないかなあと悩みながら頭の悪い僕はコピーとペーストとカットを繰り返し、1時間かけて写経を終えました。あとは書くとこ書いて終わり。次はこの.imgファイルをqemuにかけます。

$ qemu-system-i386 helloos.img

最初 $ qemu とかやったんですがダメみたいでした。ちゃんとアーキテクチャを指定しなきゃダメみたいです。
実行するとこんな感じになります。わあい。
f:id:admarimoin:20180831013701p:plain
実行時に

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

おお〜〜。
f:id:admarimoin:20180903224418p:plain
ここまですごく長かったです…一日目なのにこの進みは亀もびっくり、マズイ気がしなくもないけど成功してよかったです。