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言語の世界でもちゃんと読み進めていけるのだろうか。乞うご期待!