ブートローダを自作してみた
「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