2: 2003-10-24 (金) 07:33:00 |
3: 2004-02-22 (日) 00:07:13 |
| * ファイル関係 [[GUIGUI00_man]] | | * ファイル関係 [[GUIGUI00_man]] |
| #contents | | #contents |
| + | |
| + | ***obj2bim+bim2binで生成されるアプリのメモリマップ(セレクタ0x000f) |
| + | -イメージ(上が低位アドレス、下が上位アドレス) |
| + | |スタック領域| |
| + | |静的データ領域| |
| + | |malloc領域| |
| + | |mmarea領域| |
| + | --mmarea領域という言い方はいまいちだけど、とりあえず。 |
| + | -アドレス(オフセット) |
| + | --スタック領域: |
| + | ---アドレス0x00000000から始まる。サイズはobj2bimで指定する。 |
| + | ---サイズはlib_readCSd(0x20)でプログラム側から知ることもできる。 |
| + | --静的データ領域: |
| + | ---スタックの直後のアドレスから始まる。つまりlib_readCSd(0x20)のアドレスから始まっていることになる。 |
| + | ---サイズはリンクした結果で決まる。bss領域も0展開されて静的データ領域内に配置されている(上位に集めてある)。合計サイズは、lib_readCSd(0x24)から知ることができる。 |
| + | --malloc領域: |
| + | ---静的データの直後のアドレスから始まる。つまりlib_readCSd(0x20)+lib_readCSd(0x24)のアドレスから始まる。 |
| + | ---サイズは基本的にはbim2binで指定した値であるが、malloc領域の終わりのアドレス+1を4KB単位に切り上げなければいけないので、指定した値よりも大きくなっていることもある。 |
| + | ---malloc領域の終わりのアドレスは、lib_readCSd(0x10)-1で得られる。ここから開始アドレスを差し引いて1を足せば、malloc領域のサイズを知ることもできる。 |
| + | --mmarea領域: |
| + | ---malloc領域の直後のアドレスから始まる。つまりlib_readCSd(0x10)のアドレスから始まっていることになる。 |
| + | ---サイズはbim2binで指定した値であり、lib_readCSd(0x14)&0xfffff000で得られる。 |
| + | -備考 |
| + | ---lib_readCSd(0x20)、lib_readCSd(0x24)については、将来のリンカ・ライブラリのバージョンアップで期待した値が取得できなくなる可能性がある。lib_readCSd(0x10)、lib_readCSd(0x14)については、ぐいぐい00仕様に規定されているので、ずっとかわらない。 |
| + | ---リンカやライブラリがバージョンアップしても、古い規格に合わせて作ったバイナリが使えなくなるわけではない。問題なく使える。古いソースを新しいライブラリやリンカと組み合わせて使うと正しく動作しないバイナリが作られることがある、ということである。古いリンカや古いライブラリを使ってmakeすればまったく問題はない。 |
| | | |
| ***lib_readCSd | | ***lib_readCSd |
| | | |
| offset = 0x0010 : stack + スタティックデーター + mallocの合計サイズをページ | | offset = 0x0010 : stack + スタティックデーター + mallocの合計サイズをページ |
- | 単位(4KB単位)に切り上げた値。ここからfile領域が始まっている。fpの初期化で | + | 単位(4KB単位)に切り上げた値。ここからmmarea領域が始まっている。fpの初期化で |
| ここをよく使う。 | | ここをよく使う。 |
| | | |
- | offset = 0x0014 : この値の上位20bitは、file:で指定した値が書き込まれている | + | offset = 0x0014 : この値の上位20bitは、mmarea:で指定した値が書き込まれている |
- | 。下位12bitはリザーブなので、その値に依存しないようにすること。file:は4KB | + | 。下位12bitはリザーブなので、その値に依存しないようにすること。mmarea:は4KB |
| 単位で指定するので、上位20bitだけで指定できる。 | | 単位で指定するので、上位20bitだけで指定できる。 |
| | | |
| offsetはマッピング領域のポインタ。典型的にはilb_readCSd(0x10)を使うが、 | | offsetはマッピング領域のポインタ。典型的にはilb_readCSd(0x10)を使うが、 |
| 複数のファイルを同時にマッピングするときは重ならないようにずらす。 | | 複数のファイルを同時にマッピングするときは重ならないようにずらす。 |
- | moffsetはモジュール内のオフセット。制限はとくにないらしい。 | + | moffsetはモジュール内のオフセット。これも4096の倍数にすること。 |
| | | |
| 参考になるサンプル:tviewc00(introc) | | 参考になるサンプル:tviewc00(introc) |