[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からの実行を開始する。
この情報がお役に立てばいいのですが・・・。