3日目「ブートセクタとかブートセクタとか、あとブートセクタとかですよ」

 もうね、ブートセクタですよね。ブートセクタ。もうこれ最高。俺はブートセクタと友達になりたい。いや結婚したい。いやもうブートセクタそのものになりたい(えっ? 将来の夢はブートセクタ?)。というのも、実は詳しく話しますと、BIOSを使うブートセクタのプログラミングって結構面白いかもしれない、と思ったまでです(全然詳しくねーよ!)。まぁ、それはそうと、今日は土曜日なのでいつもよりは少し時間があったりして。なので、ちゃんと読み進めるよい機会ということで、いつになくみっちりとやった。
 まず、3日目はフロッピーディスクの構造の説明から始まる。セクタシリンダヘッダといったものですな。フロッピーには80個のシリンダがあり1個のシリンダに18セクタ入っている。そして1セクタは512バイト。つまり、

512 × 18 × 80 = 737,280バイト

そして、どうやらフロッピーには表側と裏側が使える(ヘッダとして管理)らしいから、

737,280 × 2 = 1,474,560バイト(約1.4MB)

となるわけだ。ははー、なるほど。なんかすごい良く分かりました。そして、フロッピーをドライブに入れてコンピュータを起動すると、一番最初にフロッピーの最初のセクタ512バイトがメモリアドレス0x00007c00 から 0x00007dffへ読み込まれることになる。これはどうやらソフトウェアではなくハードウェアが行ってくれるみたい。そして、この0x7c00というのが、昨日のソースコードの一番最初に書いていたORG 0x7c00の意味なのだ。ちなみに、その他のメモリマップは「http://community.osdev.info/?%28AT%29memorymap」を見てくれ。いろいろと面白いことが書いてある。
 実際にフロッピーからデータを読み込むためには、読み込み用のBIOSも調べる必要がある。「http://community.osdev.info/?%28AT%29memorymap」から調べることができるぞ。

システムのリセット
  AH = 0x00;
  DL = ドライブ番号; (0x00〜0x7f:FDD、0x80〜0xff:HDD)
  戻り値:
  FLAGS.CF == 0 : エラーなし
  FLAGS.CF == 1 : エラーあり、AHにエラーコード

 まずフロッピードライブの初期化はこのBIOSで行うようだ。なんかフロッピードライブはたまに読み込めないことがあるらしいから、数回読み込みに挑戦する必要がある。そのためにこのBIOSを使ったりするようだ。そして、次は読み込みだ。

ディスクからの読み込み、ディスクへの書き込み、セクタのベリファイ、およびシーク
  AH = 0x02; (読み込み時)
  AH = 0x03; (書き込み時)
  AH = 0x04; (ベリファイ時)
  AH = 0x0c; (シーク時)
  AL = 処理するセクタ数; (連続したセクタを処理できる)
  CH = シリンダ番号 & 0xff;
  CL = セクタ番号(bit0-5) | (シリンダ番号 & 0x300) >> 2;
  DH = ヘッド番号;
  DL = ドライブ番号;
  ES:BX = バッファアドレス; (ベリファイ時、シーク時にはこれは参照しない)
  戻り値:
  FLAGS.CF == 0 : エラーなし、AH == 0
  FLAGS.CF == 1 : エラーあり、AHにエラーコード(リセットファンクションと同じ)

 レジスタをほとんど使ってしまうちょっとわがままなやつだが、これを呼び出すことでディスクからデータの読み出しができるようだ。つまり、一番最初の512バイトで行うことは

  • フロッピードライブからデータを読み込む
  • メモリマップを見て、プログラマが自由に扱ってよい場所にコピーする
  • コピーしたデータの最初のアドレスへジャンプする

の3点なのだ。ちなみにフロッピーディスクの最初の512バイトはすでに読み込まれているため、その次の1セクタ(512バイト)以降から必要な分だけメモリへ読み込む処理。これが最初のブートセクタで行うべき処理となる。
 それで、本書では新たにメモリに読み込むデータをharibote.nasファイルとしている。そして、このファイル内には画面を真っ黒にするBIOSを呼び出す命令が書かれてあるので、ちゃんと、ipl10.nasが正常にフロッピーディスクのデータを読み込むことができたなら、ディスプレイの画面が真っ暗になるというわけだ。本書ではこれで動作確認を行っている。
 しかし、画面を真っ暗にするだけの処理なんて、俺は全然面白くないと思うんだ! 何よりメッセージ性が足りないと思うんだ。やはり、何事にもメッセージ性がなければ、俺はダメだと思うんだ。尾崎豊の詩があんなに心に響くのはきっと歌詞にメッセージが込められているからだと思うんだ夜の校舎でせっせと窓ガラスを壊してまわったからだと思うんだそれは違うだろ…)。いや、でも待てよ。確かにいっけんただの真っ黒の画面だが、あれにはもしかしたら、著者が本を書く上で感じた苦悩や努力が、たくさんたくさん詰まっているのかもしれない。挫折、苦渋、歓喜、成功、といった深い情緒がひしひしと滲み出ているのかもしれない。そうだ、きっとそうなんだ感じろ感じるんだ俺著者の飽くなき向上心と揺るがぬ努力の意志を………。
 というわけで、サンプルプログラムを少し改良し、文字列を表示するように変更した。あとipl10.nasの途中経過も少しだけ出力するようにした。動作状況とソースコードは「本当に30日でOSが出来上がるのかを試してみるページの3日目」に置いてある。
 これまでのまとめ的な意味合いで作成したので、多少時間をかけたが、だいぶ理解度が増した。本書を読む限り、これで一応アセンブラを使った部分はかなり減るらしいので、個人的には次がかなり楽しみだ。ただ、32ビットへの以降といった部分がいまはまだ解説されていない(まだ難易度が高いのであとで改めて解説するらしい)ので、その部分が少し気になっている。3日目にして少しずつだが面白くなってきたので、この調子で行けたらいいな。
 少しずつだが、OSの本質に近づいていっている気がするが、まだまだ先は長い。C言語の世界でもちゃんと読み進めていけるのだろうか。乞うご期待!