ブートローダー(その2)
今回は、ブートセクタに書かれたプログラムを実行し、ブートセクタの次のセクタに保存されているデータ(プログラム)を読み込み、処理を読み込んだ先に移すところまでを見てゆく(一週間時間を開けたわりには、異常に進みが遅い)。
<a href="http://dev.ariel-networks.com/Members/ohyama/stuff/first2second.tgz/download">ソースはこちら</a>
主なプログラムは以下の2つ。
boot.S : ブートセクタの処理
second.S : ブートセクタの次のセクタ領域の処理
では、中身について簡単に解説する。
ブートに成功すると、boot.S の .text セッションは、0x07C00 に読み込まれる。
boot.S は、0x07C0 をベースセグメントとする start に処理を移す。そして、フロッピーの初期化を行う為、init_fd において、BIOSコール(00 interurupt 0x13)を呼び出す。
そして、次のセクタに保存されている。データを呼び出す為、load_second で 02 interrupt 0x13 を呼び出し、1セクタ分だけ 0x90000 に読み込み、0x9000 をセグメントへ処理を移す。
さて、以前のプログラムでは、-fomit-frame-point オプションを指定し、gdb のコードスタック領域を削ったり、EBX レジスタのリザーブを省略したり、-fno-ident オプション、-finhibit-size-directivce オプションを指定し、ident ディレクティブ や .size ディレクティブを省略するなど、乾いた雑巾を搾る事を行っていたが、ここでは、最適化オプション -O2 を指定している以外、何もしていない。
それでも、boot バイナリを覗いてみると、ブートセクタの半分もまだ使っていない。512バイトあれば、(bios の助けを借りて)結構いろいろな事が出来るようだ。
しかし、ここでの仕事はこれで十分である。
0x9000 に読み込まれた second.S は、15 interrupt 0x10 のBIOSコールを呼び出し、ディスプレイに文字を出力し、読み込みが成功した事を表示する。表示が終わると、無限ループに入る。
ここで、ブートセクタの箱庭から 64K の広い(?)世界が広がる。次回以降、この領域を使って話しを進める。
- Category(s)
- 学習経過
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/ohyama/30fc30c830ed30fc30fc-305d306e2/tbping