ブートローダを自作してみた

「30日でできる-OS自作入門」を読んで2年近く経つ。その時は斜め読みだけで手を動かしてプログラムを打ち込んだりはしなかった。単に「DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c」等とひたすら入力していく作業が面倒くさかったのだ。

ふと、始めてプログラムを書いた時はこんな風には考えなかった事を思いだした。当時は大学1年生。本に書いてある意味不明な記号とおまじないをひたすら入力し、本を睨みながら間違いを見つけては直す。遂に「hello, world」が表示された時はヤッターと感動した。意味不明な作業を続け、最後にちょっとしたメッセージが表示されるだけだが、何とも言えず嬉しかった。

当時の感動をもういちど味わいたいと思いOS自作入門の本を片手に、ブートローダを作ってみた。

1. nasm のインストール

ブートローダアセンブリ言語でないと作れないと書いてあり、作者が作ったアセンブラnasmをインストール。

wget -O a.tar.bz2 "http://downloads.sourceforge.net/project/nasm/nasm%20sources/2.07/nasm-2.07.tar.bz2?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fnasm%2Ffiles%2F&ts=1286210341&use_mirror=cdnetworks-kr-1"

tar -jxvf a.tar.bz2

cd nasm-2.07/
./configure
make
# make installはしなかった

2. 自作ブートローダを手打ち

; hello-os

DB 0xeb, 0x4e, 0x90
DB "HELLOLPL"
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


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

DB 0x0a, 0x0a
DB "Hello, world"
DB 0x0a
DB 0,0,0,0,0
RESB 368
DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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-2.07」のフォルダにbl.nasファイルとして保存。
「./nasm bl.nasm」でアセンブルし生成された「bl」をVirtualboxのFDイメージとして登録すれば…動いた!ヤッター!新しい事にチャレンジするのは楽しいね。

ちなみに…。
26Pをそのまま入力すると「RESB 0x1fe-$」の行が原因でコンパイルエラーとなったため、24Pの例を参考に一部書き換えてある。また以下のwarningが出たがうまく動いたので今は気にしない事にする。

bl.nasm:21: warning: uninitialized space declared in .text section: zeroing
bl.nasm:34: warning: uninitialized space declared in .text section: zeroing
bl.nasm:38: warning: uninitialized space declared in .text section: zeroing
bl.nasm:40: warning: uninitialized space declared in .text section: zeroing