ページへ戻る

− Links

 印刷 

gg00man​/file のバックアップの現在との差分(No.2) :: OSASK計画

osaskwiki:gg00man編集/file のバックアップの現在との差分(No.2)

« Prev[4]  Next »[5]
2: 2003-10-24 (金) 07:33:00 ソース[6] 現: 2024-01-08 (月) 12:58:55 ゲスト ソース[7]
Line 1: Line 1:
* ファイル関係 [[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
 int lib_readCSd(int offset) :  int lib_readCSd(int offset) :
 + 
 機能:コードセグメントの任意のダブルワードを読み込んでその値を返す。  機能:コードセグメントの任意のダブルワードを読み込んでその値を返す。
 + 
   コードセグメントには主にプログラムのバイナリーコードが書かれていますが、一部    コードセグメントには主にプログラムのバイナリーコードが書かれていますが、一部
 の領域は特別な値が書かれており、主にそれを参照するために使います。なお、offset  の領域は特別な値が書かれており、主にそれを参照するために使います。なお、offset
 はコードセグメントの範囲をはみ出すような指定をしてはいけません。  はコードセグメントの範囲をはみ出すような指定をしてはいけません。
 + 
     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だけで指定できる。
 + 
 参考になるサンプル:tviewc00(introc), test016  参考になるサンプル:tviewc00(introc), test016
***lib_initmodulehandle0 ***lib_initmodulehandle0
 void lib_initmodulehandle0(int opt, int slot) :  void lib_initmodulehandle0(int opt, int slot) :
 + 
 機能: スロットをモジュールハンドルとして初期化し,アプリ専用ディレクトリに移動。  機能: スロットをモジュールハンドルとして初期化し,アプリ専用ディレクトリに移動。
 + 
   opt == 8 だとユーザディレクトリ、opt == 12 だとマシンディレクトリに移動する。    opt == 8 だとユーザディレクトリ、opt == 12 だとマシンディレクトリに移動する。
   現状ではどちらも同じに見えるが、マシンディレクトリだと全ユーザ共通となる。    現状ではどちらも同じに見えるが、マシンディレクトリだと全ユーザ共通となる。
   モジュールハンドルはスロットを一つ使う。    モジュールハンドルはスロットを一つ使う。
   たいていの場合、lib_steppath0()と組み合わせて使われる。    たいていの場合、lib_steppath0()と組み合わせて使われる。
 + 
 参考になるサンプル:test016  参考になるサンプル:test016
***lib_initmodulehandle1 ***lib_initmodulehandle1
 void lib_initmodulehandle1(int slot, int num, int sig) :  void lib_initmodulehandle1(int slot, int num, int sig) :
 + 
 機能: スロットをモジュールハンドルとして初期化し、どこのディレクトリに移動  機能: スロットをモジュールハンドルとして初期化し、どこのディレクトリに移動
       するかはシェル (人間) に任せる。        するかはシェル (人間) に任せる。
 + 
     モジュールハンドルはスロットを一つ使う。      モジュールハンドルはスロットを一つ使う。
     numは番号で、コマンドラインから制御するために機能別に通し番号をふる。      numは番号で、コマンドラインから制御するために機能別に通し番号をふる。
Line 44: Line 69:
   シグナルが来る。どれがどんなエラーを示すかは未定。    シグナルが来る。どれがどんなエラーを示すかは未定。
     成功か失敗のシグナルが返ってくるまで、このコマンドを再実行してはいけない。      成功か失敗のシグナルが返ってくるまで、このコマンドを再実行してはいけない。
 + 
 ネタ元: introc/tviewc00.c  ネタ元: introc/tviewc00.c
***lib_steppath0 ***lib_steppath0
 void lib_steppath0(int opt, int slot, const char *name, int sig) :  void lib_steppath0(int opt, int slot, const char *name, int sig) :
 + 
 機能:パスをたどることで、モジュールハンドルを移動。  機能:パスをたどることで、モジュールハンドルを移動。
 + 
 このコマンドを使う前にスロットをモジュールハンドルに初期化して適当な  このコマンドを使う前にスロットをモジュールハンドルに初期化して適当な
 ディレクトリに移動させておくこと。そのディレクトリの中を検索する。  ディレクトリに移動させておくこと。そのディレクトリの中を検索する。
 + 
   (1) opt == 0    (1) opt == 0
       name : モジュールネーム。        name : モジュールネーム。
Line 62: Line 87:
           成功の場合はこの値が返ってくる。失敗の場合は+1~+15された値が返ってく            成功の場合はこの値が返ってくる。失敗の場合は+1~+15された値が返ってく
         る。値と失敗の原因についての関係は今のところ未定。          る。値と失敗の原因についての関係は今のところ未定。
 + 
 参考になるサンプル:test016  参考になるサンプル:test016
***lib_mapmodule ***lib_mapmodule
 void lib_mapmodule(0, int slot, int attr, int len, int offset, int moffset) :  void lib_mapmodule(0, int slot, int attr, int len, int offset, int moffset) :
 + 
 機能: モジュールをメモリ空間にマッピングする。  機能: モジュールをメモリ空間にマッピングする。
 + 
     slotはモジュールに移動させたモジュールハンドル。一つのハンドルで複数      slotはモジュールに移動させたモジュールハンドル。一つのハンドルで複数
   マッピングしてはいけない。    マッピングしてはいけない。
Line 77: Line 102:
     offsetはマッピング領域のポインタ。典型的にはilb_readCSd(0x10)を使うが、      offsetはマッピング領域のポインタ。典型的にはilb_readCSd(0x10)を使うが、
   複数のファイルを同時にマッピングするときは重ならないようにずらす。    複数のファイルを同時にマッピングするときは重ならないようにずらす。
-     moffsetはモジュール内のオフセット。制限はとくにないらしい。 +     moffsetはモジュール内のオフセット。これも4096の倍数にすること。 
 + 
 参考になるサンプル:tviewc00(introc)  参考になるサンプル:tviewc00(introc)
***lib_unmapmodule ***lib_unmapmodule
 void lib_unmapmodule(0, int size, int addr) :  void lib_unmapmodule(0, int size, int addr) :
 + 
 機能: モジュールマッピング解除。  機能: モジュールマッピング解除。
 + 
     addrで始まる長さsizeバイトの領域のモジュールをはがす。      addrで始まる長さsizeバイトの領域のモジュールをはがす。
     モジュールをリサイズしたり、ハンドルにしたスロットを再利用したりするまえに      モジュールをリサイズしたり、ハンドルにしたスロットを再利用したりするまえに
Line 91: Line 116:
***lib_readmodulesize ***lib_readmodulesize
- int ilb_readmodulesize(int slot) : + int lib_readmodulesize(int slot) : 
 + 
 機能: モジュールの大きさを返す。  機能: モジュールの大きさを返す。
 + 
     slotはモジュールハンドル。      slotはモジュールハンドル。
 + 
 参考になるサンプル:tviewc00(introc)  参考になるサンプル:tviewc00(introc)
* こめんと欄 * こめんと欄
#comment #comment
« Prev[4]  Next »[5]