1: 2003-09-21 (日) 21:58:03 [5] | 現: 2024-01-08 (月) 12:58:55 ゲスト [6] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | * ファイル関係 | + | * ファイル関係 [[GUIGUI00_man]] |
+ | #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は、mmarea:で指定した値が書き込まれている | ||
+ | 。下位12bitはリザーブなので、その値に依存しないようにすること。mmarea:は4KB | ||
+ | 単位で指定するので、上位20bitだけで指定できる。 | ||
+ | |||
+ | 参考になるサンプル:tviewc00(introc), test016 | ||
- | offset = 0x0014 : この値の上位20bitは、file:で指定した値が書き込まれている | + | ***lib_initmodulehandle0 |
- | 。下位12bitはリザーブなので、その値に依存しないようにすること。file:は4KB | + | void lib_initmodulehandle0(int opt, int slot) : |
- | 単位で指定するに | + | |
- | 参甲佑靴暮廛挙縫恚:tviewc00d(inroc), test016 | + | 機能: スロットをモジュールハンドルとして初期化し,アプリ専用ディレクトリに移動。 |
- | + | ||
- | ***libinitmodulehandle0 | + | opt == 8 だとユーザディレクトリ、opt == 12 だとマシンディレクトリに移動する。 |
- | void *libinitmodulehandle0d(int pt, | + | 現状ではどちらも同じに見えるが、マシンディレクトリだと全ユーザ共通となる。 |
- | intsloet) : | + | モジュールハンドルはスロットを一つ使う。 |
- | + | たいていの場合、lib_steppath0()と組み合わせて使われる。 | |
- | 機?+ ス蹌ッ蛤を皀献絛ー襯狼麕疋襪避しの初期化掘ぅ∨プ蠕賤僖覇ィ戝ク肇衢に榮愛。 | + | |
- | + | 参考になるサンプル:test016 | |
- | pt == 8 現状 鰲ジュ供朱ハ挙防ルは ス蹌ッ蛤ぐ譴眺使う。 | + | |
- | 進いてい両豺隋?libsteppath0() | + | |
- | 参甲佑靴暮廛挙縫恚:test016 | + | |
- | + | ||
- | ***libinitmodulehandle1 | + | |
- | void *libinitmodulehandle1( intsloe, | + | |
- | intnum, | + | |
- | intsigt) : | + | |
- | + | ||
- | 機?+ ス蹌ッ蛤を皀献絛ー襯狼麕疋襪避しの初期化掘△匹こに覇ィ戝ク肇衢に榮闇 | + | |
- | する? 轡Д (人間) に任泙視Α | + | |
- | + | ||
- | 鰲ジュ供朱ハ挙防ルは ス蹌ッ蛤ぐ譴眺使う。 | + | |
- | tnumは番号砲 tsigは成功 轡阿ナう\?しぞ豺腓?igい?失敗蠅靴場合はsig+1~sig+15の | + | |
- | 魴グぅ覆が来垢Αどれがどんなエラーを示箸巷は未定Α | + | |
- | t成功蟀失敗衫魴グぅ覆が鯤屬辰働垢諳里如△海乏マン防を再実行鬚靴討呂い韻覆Α | + | |
- | + | ||
- | ネタ元: (inroc/tviewc00.c | + | |
- | + | ||
- | ***libsteppath0 | + | |
- | void *libsteppath0((int pt, | + | |
- | intsloe, const char *name, | + | |
- | intsigt) : | + | |
- | + | ||
- | 機能:僖綱鬚燭匹るこに | + | |
- | △海乏マン防を?箸前腓縫麹?暖困鰲ジュ供朱ハ挙防ルに僚藉酬て適当な | + | |
- | デ謄l奪?リ佑本動蟲泙仔討?襪海函△修デ謄l奪?リ洋担? 佑?う。 | + | |
- | t(1)pt == 8 0 ?e, | + | |
- | : ぅ献絛ー襯狼夕襯爍 | + | |
- | t成???必ず大文字 2文字,頬 t成???いΑg、*li蹌ゼジ | + | |
- | 垢琶筺 | + | |
- | 例:"TEST | + | |
- | + | ||
- | .C " t成??) ぅ完了阿ナう\? t成???蕗蟀失怜はsigの値の蕉って?る淮。夊歴轡腓?ig?igの | + | |
- | 規ど燭両屬辰働垢 t成???痢?両挽衫魴ジ彊暮弔討の侶 | + | |
- | *は今 温値しな誚サ麕プ襦?est016 | + | |
- | + | ||
- | ***libinimapulehanoid *libstemapulehan(0intsloe, contsloattrontslolenontslofset =ontslomfset) : | + | |
- | + | ||
- | 機能:ぅ献絛ー襯狼皀午献繩空間ス轗蛤ぴプ覦う。 | + | |
- | t( oe, cス團絛ー襯狼眛郁急せ篤た献絛ー襯狼麕疋襪卜。眺使覇ニ疋襪卜叔複数 魴グ淅困團恚阿討呂い韻覆Α | + | |
- | + | ||
- | ゥゥ?ttr特鋪込き込属性。5でみ込んみ僖覇、7でき込まみ可: | + | |
- | ゥゥ?enス壘蛤ぴプ覦う。長さ。0うり大る,4096任移数。團絛ー襯狼睥大るゝとlen 進のにち、短けほにで壘蛤ぴプ覦が打ちい?ーを示箸拷値しな誚 0x0014 : 覦う。長さ。ていのポするcのE儀薪?哀?lt offset) 0x10)蹌ッ蛤豺腓誚 0蛤ぴの?**lib_そけ時覦う。 | + | |
- | t( o | + | |
- | ④禄?文字,砲函?il左字垢暮 0x0m014 : 覦の大るゝと内のオ?*察朱ョは? | + | |
- | 鳩ョ繭,砲蕕Αい暮廛挙縫恚:tviewc00d(inroc), test016 | + | ***lib_initmodulehandle1 |
+ | void lib_initmodulehandle1(int slot, int num, int sig) : | ||
+ | |||
+ | 機能: スロットをモジュールハンドルとして初期化し、どこのディレクトリに移動 | ||
+ | するかはシェル (人間) に任せる。 | ||
+ | |||
+ | モジュールハンドルはスロットを一つ使う。 | ||
+ | numは番号で、コマンドラインから制御するために機能別に通し番号をふる。 | ||
+ | sigは成功シグナル。成功した場合はsigが、失敗した場合はsig+1~sig+15の | ||
+ | シグナルが来る。どれがどんなエラーを示すかは未定。 | ||
+ | 成功か失敗のシグナルが返ってくるまで、このコマンドを再実行してはいけない。 | ||
+ | |||
+ | ネタ元: introc/tviewc00.c | ||
- | *apulehanounid *libstemapulehan(unid *libst contsloaiz: | + | ***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 | ||
- | 機addrГジュ供朱ハ汲ジ畍ュ蟠Α | + | ***lib_mapmodule |
- | 解除e, cス團絛addr。 | + | void lib_mapmodule(0, int slot, int attr, int len, int offset, int moffset) : |
- | ?pい蠡腓aiz:ードとな値が塾皀午献繩空間 | + | |
+ | 機能: モジュールをメモリ空間にマッピングする。 | ||
+ | |||
+ | slotはモジュールに移動させたモジュールハンドル。一つのハンドルで複数 | ||
+ | マッピングしてはいけない。 | ||
+ | attrは読み書き属性。5で読み込み専用、7で書き込み可能。 | ||
+ | lenはマッピングする長さ。0より大きい4096の倍数。モジュールの大きさとlen | ||
+ | のうち、短いほうでマッピングが打ち切られる。 | ||
+ | offsetはマッピング領域のポインタ。典型的にはilb_readCSd(0x10)を使うが、 | ||
+ | 複数のファイルを同時にマッピングするときは重ならないようにずらす。 | ||
+ | moffsetはモジュール内のオフセット。これも4096の倍数にすること。 | ||
+ | |||
+ | 参考になるサンプル:tviewc00(introc) | ||
- | ?垢暮 0x0皀午献繩空間リジ | + | ***lib_unmapmodule |
- | 1~を参期化靴禿? 1~献絛ー襯狼再利用 1~をt( o | + | void lib_unmapmodule(0, int size, int addr) : |
- | 潁貿幕 0xう。 | + | |
- | t鯀粥 | + | 機能: モジュールマッピング解除。 |
+ | |||
+ | addrで始まる長さsizeバイトの領域のモジュールをはがす。 | ||
+ | モジュールをリサイズしたり、ハンドルにしたスロットを再利用したりするまえに | ||
+ | マッピングを全てはがしておくこと。 | ||
- | ?Α | + | ***lib_readmodulesize |
- | デ謄l奪 | + | int lib_readmodulesize(int slot) : |
- | CSd | + | |
- | int lib*libstaiz:adCSd(ilt offs*libstaiz:( | + | 機能: モジュールの大きさを返す。 |
- | 機?+ ス蹌ッ蛤を皀故大るゝとlen 進の コードセグメ絛ー襯狼眛郁急せ篤眺使覇ニ疋誚サ麕プ襦?viewc00d(inroc), test016 | + | |
+ | slotはモジュールハンドル。 | ||
+ | |||
+ | 参考になるサンプル:tviewc00(introc) | ||
- | *apuを?瓱箸藩 | + | * こめんと欄 |
#comment | #comment |
(This host) = http://osask.net