ページへ戻る

− Links

 印刷 

GUIGUI01​/man0003 のバックアップソース(No.4) :: OSASK計画

osaskwiki:GUIGUI01/man0003 のバックアップソース(No.4)

« Prev[4]  Next »[5]
* 「ぐいぐい01」のアプリフォーマット
-(by [[K]], 2008.11.13)
*** 註
-所詮はOSASK-HB向けなのでまあ暫定的なものです。とりあえず2008.11.13時点で最新のabcdw003での仕様を書きました。
*** 基本構造
-最初の2バイトがシグネチャで、0x47 0x01。
-それ以降はすべてタグ。
-数値はたいてい[[GUIGUI01/memo01]]の(6)の方法でエンコードされている。以下これをeh4エンコードと呼ぶ。
----
-(例)hellok0.g01 (いわゆる27バイトの"hello, world\n")
 47 01 8D 19 4A 2A FF D5 35 01 24 8D 68 65 6C 6C
 6F 2C 20 77 6F 72 6C 64 0A 44 03

 47 01 -- シグネチャ。
 8D 1_ -- [0D] セクション開始タグ, ネスト内タグ数1。
   _9 4_A 2A -- [14] イメージ展開タグ, イメージ長 0x2a = 42。つまり21バイト。
     FF D5 35 01 24 ... 0A 44 03 -- コードセクションの中身。

*** タグのフォーマット
-タグ番号はすべてeh4でエンコード。このルールはネスト内のタグでも有効。
-[00] :
--後続パラメータなし。
-[01]~[0B] :
--何らかの数値を指定。後続パラメータは1つで、eh4でエンコード。
-[0C]~[0F] :
--ネスト構造型タグ。タグの中にタグが複数含まれるタグ(0や1つの場合もあるが)。まず一つのパラメータがeh4で記述され、それがネスト内に含まれるタグの数を表す。
--ネストの中にネストのタグが含まれることも当然ありうるが、その場合はネスト全体でタグ数1と数える。上記の例を参照のこと。
-[10]~[17] :
--4bit数値による一次元配列記述用タグ。eh4ではないエンコードのビット列などを格納するために使われている。まず一つのパラメータがeh4で記述され、それがこのタグ内に含まれるバイナリの長さを表す。ただしこの長さはバイト単位でもビット単位でもなく、4bit単位である。
-[18]~[1f] :
--eh4による一次元配列記述用タグ。eh4でエンコードされた数値列を格納するために使われている。まず一つのパラメータがeh4で記述され、それがこのタグ内に含まれるeh4数値の個数を表す。
-[20]以降のタグ番号については、どんなフォーマットを取るかの規定はまだない。
*** タグのコード(ルート内)
-[00] 何もしない。NOPなタグ。パディングなどで使いたければ使う。
----
-[01] リザーブ。
-[02] リザーブ。
-[03] rjcフラグとファイルアクセスレベルの指定。bit0がrjcフラグ。bit1-2がファイルアクセスレベル。
-[04] スタックサイズの指定(指数部)。
--このタグを見つけると自動的に仮数部のデフォルトが1に設定される。したがって仮数部も指定するときは、先にこのタグで指数部を指定してからにする。0で4KB単位(=スタックサイズ=仮数部×4KB)、1で16KB単位、2で64KB単位、3で256KB単位、以下省略。
--スタックについて全く指定がない場合、デフォルトの設定が使われる。デフォルトでは、指数部=4KB、仮数部=256。つまり1MB。
-[05] スタックサイズの指定(仮数部)。(指定された値+1)が仮数部になる。
-[06] リザーブ。
-[07] リザーブ。
-[08] malloc用領域のサイズ指定(指数部)。指定方法はスタックサイズと同じ。
--デフォルトは、指数部=4KB、仮数部=512。つまり2MB。
-[09] malloc用領域のサイズ指定(仮数部)。指定方法はスタックサイズと同じ。
-[0A] メモリマップトファイル用の領域のサイズ指定(指数部)。指定方法はスタックサイズと同じ。
--デフォルトは、指数部=4KB、仮数部=256。つまり1MB。
-[0B] メモリマップトファイル用の領域のサイズ指定(仮数部)。指定方法はスタックサイズと同じ。
----
-[0C] コメントタグ。このタグ内の記述はすべて無視する。
--コメント用タグが何種類もあるのは、バイナリエディタでちょっとタグをコメントアウトしたいときのため。それぞれのフォーマットタイプにコメント形式がある。
--[01]~[0B]の形式のコメントは原則として用意しない。これは [00] [00] に書き換えることでコメントアウトできるから。・・・むろん複雑な構造のタグも全部[00]で埋め尽くすことでもコメントアウトはできるが、修正箇所が多くて大変だろうと思うので、それぞれにコメント形式がある。
--もちろんコメントアウトのみならず、構造を持ったコメントとして使うこともできる。いずれにせよ、「ぐいぐい01」ローダはこれらを無条件に読み飛ばす。そして[01]~[0B]の形式のコメントはこの用途でも使い道がないと考えているので用意していない(数値一つをただ置けるだけではコメントとして記述力がなさ過ぎる)。
-[0D] セクション記述タグ。下記参照。
----
-[18] コメントタグ。このタグ内の記述はすべて無視する。
-上記以外はリザーブ。
*** タグのコード(セクション記述タグ内)
-[00] 何もしない、NOPなタグ。パディングなどで使いたければ使う。
----
-[01] セクションタイプ指定。
--このタグの指定がない場合、最初に記述されたセクションならセクションタイプ0がデフォルト。以前にセクション記述タグがあった場合は、(直前のセクションタイプ+1)がデフォルト。
-[02] アライン指定タグ。デフォルトのアラインは4KB。
-[04] これはセクションタイプによって意味が異なる。
--コードセクション(セクションタイプ0)の場合は、エントリポイントの指定。デフォルトはゼロ。
--bssセクション(セクションタイプ2)の場合は、セクションサイズ(仮数部)の指定。
---スタックなどとは違って+1はない。デフォルトでは0。指数部のデフォルトは1バイト。
----
-[0C] コメントタグ。このタグ内の記述はすべて無視する。
----
-[14] セクションイメージタグ。バイナリデータをそのまま記述。
----
-[18] コメントタグ。このタグ内の記述はすべて無視する。
-[19] コンパクト型リロケーション情報。これを配置するときは必ず[14]の後になる(直後である必要はない)。
--このリロケーションアルゴリズムは、バイナリの指定したオフセットからの4バイトに対して、指定したセクションの開始アドレスの値をリトルエンディアンで加えるというただそれだけのことをする。
--[19]ではeh4の配列になっているわけだが、最初の要素は「*どの*セクションの開始アドレスを加算するか」である。残りの要素が、補正の必要なオフセットの羅列になっているのだが、これはコンパクト化のための細工がある。まず補正が必要なオフセットをすべて並べて、これをソートして昇順にする。そしてデータセクションへのリンク情報の場合、オフセットを全部4で割る(つまりデータセクション内のアドレス情報はすべてアラインされていると仮定している・・・これに適合しない場合は[1A]のリロケーション情報を使う)。さらにオフセット列の最初の要素以外は前の値からの増分値のみをeh4にして並べる。
--一つのセクションに対して、コードセクションとデータセクションの両方の補正が必要になることももちろんありうる。その場合は、[19]のタグが2回現れることとなる。bssセクションのアドレスも参照する場合は3回現れることもありえるだろう。
-[1A] コンパクトではないリロケーション情報。フォーマットの詳細はまだ決めていない。
----
-上記以外はすべてリザーブ。

« Prev[4]  Next »[5]