ページへ戻る

+ Links

 印刷 

gg00man​/file :: OSASK計画

osaskwiki:gg00man編集/file

Page Top

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すればまったく問題はない。
Page Top

lib_readCSd

int lib_readCSd(int offset) :

機能:コードセグメントの任意のダブルワードを読み込んでその値を返す。

  コードセグメントには主にプログラムのバイナリーコードが書かれていますが、一部
の領域は特別な値が書かれており、主にそれを参照するために使います。なお、offset
はコードセグメントの範囲をはみ出すような指定をしてはいけません。

    offset = 0x0010 : stack + スタティックデーター + mallocの合計サイズをページ
      単位(4KB単位)に切り上げた値。ここからmmarea領域が始まっている。fpの初期化で
      ここをよく使う。

    offset = 0x0014 : この値の上位20bitは、mmarea:で指定した値が書き込まれている
      。下位12bitはリザーブなので、その値に依存しないようにすること。mmarea:は4KB
      単位で指定するので、上位20bitだけで指定できる。

参考になるサンプル:tviewc00(introc), test016
Page Top

lib_initmodulehandle0

void lib_initmodulehandle0(int opt, int slot) :

機能: スロットをモジュールハンドルとして初期化し,アプリ専用ディレクトリに移動。

  opt == 8 だとユーザディレクトリ、opt == 12 だとマシンディレクトリに移動する。
  現状ではどちらも同じに見えるが、マシンディレクトリだと全ユーザ共通となる。
  モジュールハンドルはスロットを一つ使う。
  たいていの場合、lib_steppath0()と組み合わせて使われる。

参考になるサンプル:test016
Page Top

lib_initmodulehandle1

void lib_initmodulehandle1(int slot, int num, int sig) :

機能: スロットをモジュールハンドルとして初期化し、どこのディレクトリに移動
      するかはシェル (人間) に任せる。

    モジュールハンドルはスロットを一つ使う。
    numは番号で、コマンドラインから制御するために機能別に通し番号をふる。
    sigは成功シグナル。成功した場合はsigが、失敗した場合はsig+1~sig+15の
  シグナルが来る。どれがどんなエラーを示すかは未定。
    成功か失敗のシグナルが返ってくるまで、このコマンドを再実行してはいけない。

ネタ元: introc/tviewc00.c
Page Top

lib_steppath0

void lib_steppath0(int opt, int slot, const char *name, int sig) :

機能:パスをたどることで、モジュールハンドルを移動。

このコマンドを使う前にスロットをモジュールハンドルに初期化して適当な
ディレクトリに移動させておくこと。そのディレクトリの中を検索する。

  (1) opt == 0
      name : モジュールネーム。
          必ず大文字で、12文字。9文字目はピリオドでなければならない。12文字に満
        たない場合、スペースで補う。例:"TEST016 .C  "
      sig  : 完了シグナル。
          成功の場合はこの値が返ってくる。失敗の場合は+1~+15された値が返ってく
        る。値と失敗の原因についての関係は今のところ未定。

参考になるサンプル:test016
Page Top

lib_mapmodule

void lib_mapmodule(0, int slot, int attr, int len, int offset, int moffset) :

機能: モジュールをメモリ空間にマッピングする。

    slotはモジュールに移動させたモジュールハンドル。一つのハンドルで複数
  マッピングしてはいけない。
    attrは読み書き属性。5で読み込み専用、7で書き込み可能。
    lenはマッピングする長さ。0より大きい4096の倍数。モジュールの大きさとlen
  のうち、短いほうでマッピングが打ち切られる。
    offsetはマッピング領域のポインタ。典型的にはilb_readCSd(0x10)を使うが、
  複数のファイルを同時にマッピングするときは重ならないようにずらす。
    moffsetはモジュール内のオフセット。これも4096の倍数にすること。

参考になるサンプル:tviewc00(introc)
Page Top

lib_unmapmodule

void lib_unmapmodule(0, int size, int addr) :

機能: モジュールマッピング解除。

    addrで始まる長さsizeバイトの領域のモジュールをはがす。
    モジュールをリサイズしたり、ハンドルにしたスロットを再利用したりするまえに
   マッピングを全てはがしておくこと。
Page Top

lib_readmodulesize

int lib_readmodulesize(int slot) :

機能: モジュールの大きさを返す。

    slotはモジュールハンドル。

参考になるサンプル:tviewc00(introc)
Page Top

こめんと欄


Last-modified: 2009-11-17 (火) 00:00:00 (JST) (319d) by ゲスト