step 4 - プロテクトモードへの移行とC言語の利用
C言語の利用

 三日目の最後の方からプロテクトモード(32ビットモード)への移行とC言語の利用が始まっています。 今までの通りnasmで対応できるのか不安ですが、 本書でも結構ややこしい作業をしている様です。

新出のオリジナルツールを使って、目的のファイル(hrbファイル)を得るまでに 「Cソース→gasソース→naskソース→objファイル→bimファイル→hrbファイル」 と言う順序を辿っています。 「bimファイル」「hrbファイル」は著者オリジナルのファイル形式とのこと。 また、ここでの新出のオリジナルツールは下記の通りです。

gas2nask.exegasソースをnaskソースに変換するツール。
obj2bim.exenaskが作成したobjファイルをbimファイルに変換するツール
bim2hrb.exe上記のbimファイルをhrbファイルに変換するツール


これらのツールやファイル形式については著者のページの 「tools/obj2bim」や 「tools/bim2hrb」の ところで説明してくれています。 これらによるとこの作業の内容は 「ld」 で行うことと同等の様です。 ですが、当然「obj2bim」や「bim2hrb」から出力されるファイルの形式は「ld」とは違っていて、 著者オリジナルのファイル形式では必要最小限のデータのみをヘッダとしてつける様にしている様子です。

さて、本書で使用されている各種の著者自作のツールは、 バイナリそのままではMacでは動作しませんが、 付属のCD-ROM(omake/tolsrc)にソースコードが含まれています。 ツール自体はファイル操作しかしていない様なので、 コンパイルができれば問題なく動きそうな気がします。 ですが、できるだけXcodeで標準的に提供されている開発ツールを使いたいのと、 このファイル形式のあたりもちゃんと自分で理解しておかないと 後々自由が利かなさそうに思えるので、 Xcode tools の利用を前提にこの辺りの調査も行おうと思います。 これに伴い、C言語に対してはnasmの利用はあきらめる方向で考えます。


C言語ルーチンまでの処理

 ファイル形式の調査も必要なのですが、その前に何をしようとしているのかを把握しておきたいと思います。 三日目の最終形態は「harib00j」に入っている物の様なのでそのコードを見てみることにします。

起動時、プログラムがメモリに読み込まれてからC言語で書かれたプログラム (「bootpack.c」)に移行するまでの処理は、「asmhead.nas」と言うファイルに書かれている様です。 このソースの説明は三日目ではなく、八日目のp.166あたりから書かれています。 とりあえず、だいたい何をしているのか知りたいので先にこちらから読むことにしました。 やっていることは大まかに下記の通りの様です。

「割り込み禁止」と「メモリアクセス設定」は結構重要な気もします。 どうでもいい話ですが、これらはプロテクトモードに移行してからではいけないのでしょうか・・? 設定がモードをまたがるのは何となく不安で、早めにプロテクトモードに入りたい気がします。

プロテクトモードへの移行 はCR0レジスタの最下位ビットを1にすることにより行える様です。 また、CPUのパイプラインをクリアするために移行直後にJMP命令を実行する必要があるとのこと。 本書のコードでは上記に加えてCR0レジスタの最上位ビットを0にセットしています。 これは「ページングを使わない」と言う意味になるのでは?と予測していますが、 実際にはよくわかりません。CR0レジスタの仕様が欲しい気がします。 また、移行後にCSレジスタ以外のセグメントレジスタの値を変更していますが、 今のところこれの意味もわかりません。八日目までに説明されているのかもしれません。

C言語ルーチンのコピーは文章を読むだけではイメージがわかないので、 書かれている内容を図示してみます。



何となく見えてきました。C言語のルーチン「bootpack.c」と そこから呼ばれているアセンブラのルーチン「naskfunc.nas」は リンクされてhrb形式のファイル「bootpack.hrb」となっている様です。 「haribote.sys」はnaskでコンパイルされた「asmhead.nas」と 先ほどの「bootpack.hrb」を単純に結合しただけのファイルの様です。

で、「asmhead.nas」で行われているコピーは、下記の通りの様です。

コピーが完了した後は、0x0028001b番地へジャンプしている様です。 これは、「bootpack.hrb」の途中になるのですが、 「.hrbファイルの構造」を見る限り 中途半端な場所にジャンプしている様に見えて、なぜここに飛んでいるのかが謎です。

FDの内容を全て記憶しているのは無駄の様に思えますが、今後何かに使うんでしょうか? 三日目で実行されている内容が大まかにはわかりましたが、まだわからない点が多いです。


今回のメモ

まだ、三日目から先に進めないのですが、今の時点の疑問をメモしておきます。

前から読むことが想定されている本書で知りたいところだけ先読みしたため、 あっちこちに飛ぶことになったので、読んでいった順序に場所を列挙しておきます。

asmhead.asmの説明八日目 p.166〜
GDTの説明五日目 p.110〜


以上、今回理解した範囲でなんとなくXcode toolsのみで続けて行けそうな気がしています。 asmhead.nasに該当する部分まではこれまで通りnasmで、 C言語部分とそれとリンクするアセンブラ部分はgcc及びgas(かインラインアセンブラ)で 書けば問題なさそうです。 いずれにせよ、アップル製リンカの出力フォーマットについては調べる必要がありますね・・。


(2006/05/07)

ぐうたラボ...