3 章: 32ビットモード突入と C 言語導入
まずは、フロッピーの作りについて。同心円状のシリンダが 80 個あって、1 つのシリンダに 18 個のセクタがあって1 つのセクタが 512バイト。それが両面あるから
80 * 2 * 18 * 512 = 1474560 byte
これがフロッピーの容量ということになる。フロッピーのロードもシリンダとかセクタをレジスタで指定してINT 命令で行うとのこと。
これでようやく IPL を作る準備が整った。すなわち、ドライブにフロッピーを入れて電源 ON から OS 起動までの流れは
- PC のスイッチON
- BIOS がブートセクタをロードして実行
- フロッピーに保存された OS プログラムをメモリにロード
- ロードした先頭のアドレスに分岐
- OS が起動
の感じだが、その 3、4 を行うプログラムが IPL である。次は 32 ビットモードの設定なんだけど、3、4 だけと思われたブートセクタのプログラムが 32 ビットの移行のためにずいぶんと複雑なことになっていた。これはまた後ほど説明があるらしい。しかし、今後はブートセクタはアセンブラ、OS 部分は C 言語と住み分けが出来そうな感じになってきた。とはいうものの、OS としてやりたいことが C 言語では表現できない場合があって、その 1 つが前回説明した HLT。著者の執拗なまでの HLT へのこだわりのおかげ?でアセンブラでHLT を使う関数 _io_hlt を用意して C のソースから呼び出すという技が 4 日目にして早くも出ました(笑)
C からアセンブラの関数を呼び出すのに必要なことは
- C の関数名がそのままアセンブラで使えないので、アセンブラソースではアセンブラ用に変換されたラベルを使う。
- アセンブラのソース側で関数のラベルを GLOBAL で定義する。
- 引数の渡し方・帰り値の返し方(レジスタ?スタック?)
だったかな。1 はただ関数名の前に "_" を付けるだけ。 2 はただ書けばいいだけ。3 は今回の _io_hlt は引数も返り値も void なので関係なし…じゃない、スタックいるやん!でもいつ初期化したんやろ?関数呼び出しする以上スタックもどっかで初期化してるはずだけど全然説明なかったで…。と、思って 32 ビットになって複雑化したブートプログラム asmhead.nas を調べると「 スタック初期値」のコメントとともに ESP に値を設定する処理があったので、おそらくそこでしているだと理解。詳細は後の説明を待つことにします。
こうしてできたプログラム(というか本にソースがついているのだけど)は画面が真っ黒になるだけ。
とはいえ C 言語も出てきたことだし。徐々にではあるが本格的になってきたかなぁ。3 章終わり。











コメントする