uxf
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* Universal eXecutable Format
-(by [[K]], 2016.09.14)
** これは何?
-プログラミング言語を作っていると、実行速度が出なくて悩ま...
-でもプログラムのうち高速化の必要があるところは全体の2割...
-こういうときの逃げ道としてC言語が用意しているのはインラ...
--Cはどっちにしてもアセンブラが必要になるので、インライン...
-それで、実行バイナリを扱うわけだけど、COFFやELFはオーバ...
-第二世代OSASK(efg01)の技術をそのまま使うことも考えたけ...
-ということで、efg01の技術をもっとずっとシンプルにしたよ...
** sh8
-まず、このuxfで使われる可変長整数のエンコードを紹介しま...
0~0x7f: 0xxxxxxx
0~0x3fff: 10xxxxxx xxxxxxxx
0~0x1fffff: 110xxxxx xxxxxxxx xxxxxxxx
0~0xfffffff: 1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx
-これより大きな表現も考えられますが、x86の32ビットだけを...
** フォーマット内容
01 (アライン情報) (.textのサイズ) (.dataのサイズ) (.bss...
-アライン情報は、4ビットずつで、(.bssのアライン) << 8 | (...
-アラインは0~15まで指定できるわけですが、「0」の1バイト...
-各セクションの生データは、サイズ情報が1以上の場合のみ記...
-リロケーション情報は少し複雑で、次のようになっています。
(リロケーション要素数) (リロケーション間隔の単位) { (次...
--リロケーション要素数が0の場合は、リロケーション位置の単...
-エントリポイントは.textの先頭に固定されています。
** ローダプログラム例
void *load_uxf(const unsigned char *p)
{
if (get_sh8(&p) != 0x01) return NULL; // フォーマッ...
int i, j, k, l, u, m, siz[3], algn = get_sh8(&p);
unsigned char *sct[3];
for (i = 0; i < 3; i++) {
siz[i] = get_sh8(&p);
sct[i] = NULL;
if (siz[i] > 0)
sct[i] = malloc_aligned(siz[i], (algn >> (i...
}
for (i = 0; i < 2; i++) {
if (siz[i] == 0) continue;
for (j = 0; j < siz[i]; j++)
sct[i][j] = *p++; // 生データのロード.
j = get_sh8(&p);
if (j == 0) continue;
u = get_sh8(&p);
l = 0;
while (j > 0) {
m = get_sh8(&p);
l += (m >> 2) * u;
int *q = (int *) (sct[i] + l);
*q += (int) sct[m & 3];
l += 4;
j--;
}
}
for (j = 0; j < siz[2]; j++)
sct[2][j] = 0; // bss領域のクリア.
// sct[0]の領域に、実行権限を付与する.
return sct[0];
}
int get_sh8(const unsigned char **pp)
{
const unsigned char *p = *pp;
unsigned char c = *p++, b;
int i, j;
i = c;
for (b = 0x80; (i & b) != 0; b >>= 1)
i ^= b;
for (b = 0x80; (c & b) != 0; b >>= 1)
i = i << 8 | *p++;
*pp = p;
return i;
}
void *malloc_aligned(int siz, int algn)
{
if (algn == 0) algn = 4;
algn = 1 << algn;
// このsizとalgnでメモリ領域を確保 → p
// まあ簡易的には以下の方法で実現できる(freeのことは...
int p = (int) malloc(siz + algn);
if ((p & (algn - 1)) != 0)
p = (p + (algn - 1)) & ~(algn - 1);
return (void *) p;
}
** uxfのプログラムはどうやって書くの?
-基本的にはC言語で書きます。アセンブラで書いてもいいです...
-ただ現状ではuxfを出力できるリンカがないので、それを適当...
** 拡張仕様
-リロケーション情報でセクション番号に3を指定した場合、そ...
--{(次の位置までの間隔) << 2 | 3} { 識別子長 << 2 | リン...
--これでダイナミックリンクも記述できる
--リンクタイプ:
---0: 補正なし(リンク位置にある値はもちろん加算する)
---1: 相対アドレス指定に配慮し、上記の値から(書き込み位置...
---2: publicラベル宣言(リロケーション作業については何も...
--リンクタイプ=3をプライベートラベルにするか、それともさ...
--識別子長を0にしたときに拡張動作にするという道もある
--識別子はバイト単位なので、長さもバイト数で記述される
-リンクタイプ0と1の拡張によって、未解決シンボルを記述でき...
-リンクタイプ2の拡張によって、publicラベルが宣言できるよ...
* こめんと欄
-リンカはできました。 -- [[K]] SIZE(10){2016-09-23 (金) 2...
-拡張仕様についてもサポートできました。 -- ''K'' SIZE(10)...
-uxfのリンカはどこでダウンロードできますか? -- 名無しさ...
-まだどこにもアップロードしていません、すみません。 -- [[...
#comment
終了行:
* Universal eXecutable Format
-(by [[K]], 2016.09.14)
** これは何?
-プログラミング言語を作っていると、実行速度が出なくて悩ま...
-でもプログラムのうち高速化の必要があるところは全体の2割...
-こういうときの逃げ道としてC言語が用意しているのはインラ...
--Cはどっちにしてもアセンブラが必要になるので、インライン...
-それで、実行バイナリを扱うわけだけど、COFFやELFはオーバ...
-第二世代OSASK(efg01)の技術をそのまま使うことも考えたけ...
-ということで、efg01の技術をもっとずっとシンプルにしたよ...
** sh8
-まず、このuxfで使われる可変長整数のエンコードを紹介しま...
0~0x7f: 0xxxxxxx
0~0x3fff: 10xxxxxx xxxxxxxx
0~0x1fffff: 110xxxxx xxxxxxxx xxxxxxxx
0~0xfffffff: 1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx
-これより大きな表現も考えられますが、x86の32ビットだけを...
** フォーマット内容
01 (アライン情報) (.textのサイズ) (.dataのサイズ) (.bss...
-アライン情報は、4ビットずつで、(.bssのアライン) << 8 | (...
-アラインは0~15まで指定できるわけですが、「0」の1バイト...
-各セクションの生データは、サイズ情報が1以上の場合のみ記...
-リロケーション情報は少し複雑で、次のようになっています。
(リロケーション要素数) (リロケーション間隔の単位) { (次...
--リロケーション要素数が0の場合は、リロケーション位置の単...
-エントリポイントは.textの先頭に固定されています。
** ローダプログラム例
void *load_uxf(const unsigned char *p)
{
if (get_sh8(&p) != 0x01) return NULL; // フォーマッ...
int i, j, k, l, u, m, siz[3], algn = get_sh8(&p);
unsigned char *sct[3];
for (i = 0; i < 3; i++) {
siz[i] = get_sh8(&p);
sct[i] = NULL;
if (siz[i] > 0)
sct[i] = malloc_aligned(siz[i], (algn >> (i...
}
for (i = 0; i < 2; i++) {
if (siz[i] == 0) continue;
for (j = 0; j < siz[i]; j++)
sct[i][j] = *p++; // 生データのロード.
j = get_sh8(&p);
if (j == 0) continue;
u = get_sh8(&p);
l = 0;
while (j > 0) {
m = get_sh8(&p);
l += (m >> 2) * u;
int *q = (int *) (sct[i] + l);
*q += (int) sct[m & 3];
l += 4;
j--;
}
}
for (j = 0; j < siz[2]; j++)
sct[2][j] = 0; // bss領域のクリア.
// sct[0]の領域に、実行権限を付与する.
return sct[0];
}
int get_sh8(const unsigned char **pp)
{
const unsigned char *p = *pp;
unsigned char c = *p++, b;
int i, j;
i = c;
for (b = 0x80; (i & b) != 0; b >>= 1)
i ^= b;
for (b = 0x80; (c & b) != 0; b >>= 1)
i = i << 8 | *p++;
*pp = p;
return i;
}
void *malloc_aligned(int siz, int algn)
{
if (algn == 0) algn = 4;
algn = 1 << algn;
// このsizとalgnでメモリ領域を確保 → p
// まあ簡易的には以下の方法で実現できる(freeのことは...
int p = (int) malloc(siz + algn);
if ((p & (algn - 1)) != 0)
p = (p + (algn - 1)) & ~(algn - 1);
return (void *) p;
}
** uxfのプログラムはどうやって書くの?
-基本的にはC言語で書きます。アセンブラで書いてもいいです...
-ただ現状ではuxfを出力できるリンカがないので、それを適当...
** 拡張仕様
-リロケーション情報でセクション番号に3を指定した場合、そ...
--{(次の位置までの間隔) << 2 | 3} { 識別子長 << 2 | リン...
--これでダイナミックリンクも記述できる
--リンクタイプ:
---0: 補正なし(リンク位置にある値はもちろん加算する)
---1: 相対アドレス指定に配慮し、上記の値から(書き込み位置...
---2: publicラベル宣言(リロケーション作業については何も...
--リンクタイプ=3をプライベートラベルにするか、それともさ...
--識別子長を0にしたときに拡張動作にするという道もある
--識別子はバイト単位なので、長さもバイト数で記述される
-リンクタイプ0と1の拡張によって、未解決シンボルを記述でき...
-リンクタイプ2の拡張によって、publicラベルが宣言できるよ...
* こめんと欄
-リンカはできました。 -- [[K]] SIZE(10){2016-09-23 (金) 2...
-拡張仕様についてもサポートできました。 -- ''K'' SIZE(10)...
-uxfのリンカはどこでダウンロードできますか? -- 名無しさ...
-まだどこにもアップロードしていません、すみません。 -- [[...
#comment
ページ名: