[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 3040] from OSASK BOARD



このメールは、OSASK伝言板に書き込まれた内容です。
この書き込みに返事を書く場合は、下のURLから書き込みを行なって下さい。


http://www.imasy.or.jp/~mone/osask/index.cgi?REFER=3c52a24a_0d47

From: 川合秀実
Message-ID: 3c52a24a_0d47
Date: 2002/01/26 21:34
Subject: Re: bim2binの出力について

[OSASK 3036]へのレスです。

>binファイルのフォーマットがよくわかりません。
>ご教授ください。

 .binファイルのフォーマットは結構複雑なので、それよりも.bimファイルを出
力するようにした方が簡単でしょう(もともとそういう複雑さを回避するために
obj2bimとbim2binの二段階方式にしたんですし)。

 .bimファイルは、とりあえず2つのセクションを持っています(本当はもっとい
ろいろなフォーマットが可能なのですが、そういうことを書いているときりがな
いので、bim2binで処理できる範囲に限定して書きます)。

・codeセクション(COFFでいうところの.textのようなもの)
・dataセクション(COFFでいうところの.dataのようなもの)

 .bimファイルのフォーマットは以下のようになっています。

+0x0000(dw) : codeセクションサイズ(バイト単位で)
+0x0004(dw) : codeセクションロードアドレス(必ず0x0048)
+0x0008(dw) : codeセクション開始オフセット(必ず0x0048)
+0x000c(dw) : dataセクションサイズ(バイト単位で)
+0x0010(dw) : dataセクションロードアドレス(4KB単位で)
+0x0014(dw) : dataセクション開始オフセット
+0x0018(dw) : _mainの値(エントリーアドレス)
+0x001c 〜 +0x0047 : すべて0x00で埋める
+0x0048 〜 : codeセクションの中身の始まり

 ようするに、最初の72バイトはヘッダになっていて、ヘッダ直後からコードが
始まっているわけです。そしてヘッダのうちの半分以上を占める44バイトがリザ
ーブです。

 dataセクションロードアドレスは、スタックサイズに等しいです。OSASKのア
プリケーションのメモリモデルはflatではないので、コードが占めるサイズのこ
とは気にしないでください。

 dataセクション開始オフセットは、.bimファイル内のどこからdataセクション
が始まっているのかを知らせます。まあ普通は、codeセクション開始オフセット
とcodeセクションサイズの和を書き込むでしょう。

 bim2binは、このフォーマットの.bimファイルを読み込んで、以下の状態を構
築するのに必要なヘッダやコードを付加して、.binファイルを生成します。

・コード空間は、データー空間とオーバーラップせずにオフセット0から始まっ
 て、72バイトのヘッダ+codeセクションサイズのモジュールとして存在。つま
 り、普通のCプログラムなどでは、コード空間内のデーターをリードすること
 はできない(アセンブラなどでルーチンを書いて、CS:でアクセスすればアクセ
 ス可能)。

・データー空間は、オフセット0から始まり、最初のdataセクションロードアド
 レスの分がスタックとして使用される。ESPもdataセクションロードアドレス
 の値に初期化される。その後ろにdataセクションの内容が展開され、さらにそ
 の後ろにmallocのための領域がある。そしてそのまた後ろに、メモリを割り当
 てられていない空間(=ファイルを割り当てるための空間)が用意される。

・この状態で、_mainからの実行を開始する。

 この情報がお役に立てばいいのですが・・・。