3 章: 32ビットモード突入と C 言語導入

まずは、フロッピーの作りについて。同心円状のシリンダが 80 個あって、1 つのシリンダに 18 個のセクタがあって1 つのセクタが 512バイト。それが両面あるから

80 * 2 * 18 * 512 = 1474560 byte

これがフロッピーの容量ということになる。フロッピーのロードもシリンダとかセクタをレジスタで指定してINT 命令で行うとのこと。

これでようやく IPL を作る準備が整った。すなわち、ドライブにフロッピーを入れて電源 ON から OS 起動までの流れは

  1. PC のスイッチON
  2. BIOS がブートセクタをロードして実行
  3. フロッピーに保存された OS プログラムをメモリにロード
  4. ロードした先頭のアドレスに分岐
  5. OS が起動

の感じだが、その 3、4 を行うプログラムが IPL である。次は 32 ビットモードの設定なんだけど、3、4 だけと思われたブートセクタのプログラムが 32 ビットの移行のためにずいぶんと複雑なことになっていた。これはまた後ほど説明があるらしい。しかし、今後はブートセクタはアセンブラ、OS 部分は C 言語と住み分けが出来そうな感じになってきた。とはいうものの、OS としてやりたいことが C 言語では表現できない場合があって、その 1 つが前回説明した HLT。著者の執拗なまでの HLT へのこだわりのおかげ?でアセンブラでHLT を使う関数 _io_hlt を用意して C のソースから呼び出すという技が 4 日目にして早くも出ました(笑)

C からアセンブラの関数を呼び出すのに必要なことは

  1. C の関数名がそのままアセンブラで使えないので、アセンブラソースではアセンブラ用に変換されたラベルを使う。
  2. アセンブラのソース側で関数のラベルを GLOBAL で定義する。
  3. 引数の渡し方・帰り値の返し方(レジスタ?スタック?)

だったかな。1 はただ関数名の前に "_" を付けるだけ。 2 はただ書けばいいだけ。3 は今回の _io_hlt は引数も返り値も void なので関係なし…じゃない、スタックいるやん!でもいつ初期化したんやろ?関数呼び出しする以上スタックもどっかで初期化してるはずだけど全然説明なかったで…。と、思って 32 ビットになって複雑化したブートプログラム asmhead.nas を調べると「 スタック初期値」のコメントとともに ESP に値を設定する処理があったので、おそらくそこでしているだと理解。詳細は後の説明を待つことにします。

こうしてできたプログラム(というか本にソースがついているのだけど)は画面が真っ黒になるだけ。
とはいえ C 言語も出てきたことだし。徐々にではあるが本格的になってきたかなぁ。3 章終わり。

トラックバック(0)

このブログ記事を参照しているブログ一覧: 30日で作る自作OS 4/30 - ようやく IPL、C 言語登場

このブログ記事に対するトラックバックURL: http://tsuyuguchi.com/mt/mt-tb.cgi/182

コメントする

最近の画像

料理が少し楽しくなるかもしれないグッズ
江戸糸あやつり人形
江戸糸あやつり人形
おうち、
新橋青空大判将棋
「天体の回転について」読了
「幼年期の終り」読了
「数学ガール/フェルマーの最終定理」読了
ハリー・ポッター 最終巻
もう炊飯器いらないかも

私の本棚

 

自転車走行距離

Flickr Photos

なかのひと

Y!ログール

このサイトについて

あわせて読みたいブログパーツ

2008年11月

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

アーカイブ

My Update

  • Loading...

その他