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

最近の画像

Zero History - ギブスンの新作が 9 月に発売 -
虐殺器官
ドミニオンのランダマイザアプリ、dominion minion が日本語対応!
ハイペリオンの没落 ~ 完結...でもまだ続く~
ハイペリオンの没落 ~ 完結...でもまだ続く~
ハイペリオン - 長大な叙事詩 SF のスタート -
ハイペリオン - 長大な叙事詩 SF のスタート -
「都市と星」 - 10億年と言われてもよく分からない -
「星を継ぐもの」 - 良い Sci-Fi -
トールサイズのニューロマンサーを買った
虎よ、虎よ! - 主人公フォイルの執念の物語 -

私の本棚

 

自転車走行距離

自転車走行距離

Flickr Photos

FlickrPhotos

なかのひと

Y!ログール

このサイトについて

2015年2月

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

アーカイブ

My Update

  • Loading...

その他

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