a22_memman04
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* メモリ管理#4
-(by [[K]], 2022.02.25)
** (0) もくじ
-aclライブラリバージョン2のメモリ管理について
-[1]AMemAlc0とAMemAlc1によるメモリ管理(メモリアロケータ)
-[2]ACleanによるオブジェクト管理の簡易化
** (1-1) メモリアロケータ
-acl2では、ヒープメモリのアロケータが改良されて以下のこと...
--AMemAlc0やAMemAlc1で取得したポインタには対応するidがあ...
--たとえばASLR(アドレス空間配置のランダム化)が有効な場...
--そしてid値からポインタを得ることもできる。
--これらの機能により何が実現するかというと、デバッグがや...
-実例を使って説明する。
void aMain(AComArg *ca0)
{
ABegin(ca1, c1, ca0);
void *p;
int i, alc0, ofs, id;
AMemAlc0 *t28[28]; AMemAlc1_makeTable28(ca1, ca1->ta...
for (i = 0; i < 7; i++) { // このループで7つのポイン...
static int t[7] = { 1, 4, 1, 4, 2, 1, 3 };
p = AMemAlc1_alc(ca1, ca1->ta, 8 << t[i], c1); /...
id = AMemAlc0_test3(ca1, t28, t28 + 28, p, &ofs,...
printf("#%d: 0x%08x id=(%d,%d,%d)\n", i, (int) p...
}
AClean_out(ca1, c1); // これで7つのポインタは自動で...
}
-このプログラムを三度実行すると以下のようになる。
#0: 0x007b36e8 id=(1,0,0)
#1: 0x00610048 id=(4,0,0)
#2: 0x007b36f8 id=(1,1,0)
#3: 0x006100c8 id=(4,1,0)
#4: 0x00614458 id=(2,0,0)
#5: 0x007b3708 id=(1,2,0)
#6: 0x00618868 id=(3,0,0)
#0: 0x00b136f8 id=(1,0,0)
#1: 0x006e0048 id=(4,0,0)
#2: 0x00b13708 id=(1,1,0)
#3: 0x006e00c8 id=(4,1,0)
#4: 0x006e4458 id=(2,0,0)
#5: 0x00b13718 id=(1,2,0)
#6: 0x006e8868 id=(3,0,0)
#0: 0x006636f8 id=(1,0,0)
#1: 0x00670048 id=(4,0,0)
#2: 0x00663708 id=(1,1,0)
#3: 0x006700c8 id=(4,1,0)
#4: 0x00674458 id=(2,0,0)
#5: 0x00663718 id=(1,2,0)
#6: 0x00678868 id=(3,0,0)
--ASLRによってポインタは毎回違っているが、そのポインタか...
--だからメモリ上に構造木などを作った場合、そのリンク先の...
--そしてこのidは環境に依存しないので、最初はWindows上で開...
-プログラムを改造して以下のようにすることもできる。前半は...
void aMain(AComArg *ca0)
{
ABegin(ca1, c1, ca0);
void *p;
int i, alc0, ofs, id;
AMemAlc0 *t28[28]; AMemAlc1_makeTable28(ca1, ca1->ta...
for (i = 0; i < 7; i++) { // このループで7つのポイン...
static int t[7] = { 1, 4, 1, 4, 2, 1, 3 };
p = AMemAlc1_alc(ca1, ca1->ta, 8 << t[i], c1); /...
id = AMemAlc0_test3(ca1, t28, t28 + 28, p, &ofs,...
printf("#%d: 0x%08x id=(%d,%d,%d)\n", i, (int) p...
}
AClean_out(ca1, c1); // これで7つのポインタは自動で...
for (;;) { // idを入力してポインタを得る.
char s[1000];
printf("\n>");
fgets(s, 10000, stdin);
if (strncmp(s, "exit", 4) == 0) break;
sscanf(s, "(%d,%d,%d)", &alc0, &id, &ofs);
p = ((char *) AMemAlc0_test2(ca0, t28[alc0], id)...
printf("%08x\n", (int) p);
}
}
-こうすると
終了行:
* メモリ管理#4
-(by [[K]], 2022.02.25)
** (0) もくじ
-aclライブラリバージョン2のメモリ管理について
-[1]AMemAlc0とAMemAlc1によるメモリ管理(メモリアロケータ)
-[2]ACleanによるオブジェクト管理の簡易化
** (1-1) メモリアロケータ
-acl2では、ヒープメモリのアロケータが改良されて以下のこと...
--AMemAlc0やAMemAlc1で取得したポインタには対応するidがあ...
--たとえばASLR(アドレス空間配置のランダム化)が有効な場...
--そしてid値からポインタを得ることもできる。
--これらの機能により何が実現するかというと、デバッグがや...
-実例を使って説明する。
void aMain(AComArg *ca0)
{
ABegin(ca1, c1, ca0);
void *p;
int i, alc0, ofs, id;
AMemAlc0 *t28[28]; AMemAlc1_makeTable28(ca1, ca1->ta...
for (i = 0; i < 7; i++) { // このループで7つのポイン...
static int t[7] = { 1, 4, 1, 4, 2, 1, 3 };
p = AMemAlc1_alc(ca1, ca1->ta, 8 << t[i], c1); /...
id = AMemAlc0_test3(ca1, t28, t28 + 28, p, &ofs,...
printf("#%d: 0x%08x id=(%d,%d,%d)\n", i, (int) p...
}
AClean_out(ca1, c1); // これで7つのポインタは自動で...
}
-このプログラムを三度実行すると以下のようになる。
#0: 0x007b36e8 id=(1,0,0)
#1: 0x00610048 id=(4,0,0)
#2: 0x007b36f8 id=(1,1,0)
#3: 0x006100c8 id=(4,1,0)
#4: 0x00614458 id=(2,0,0)
#5: 0x007b3708 id=(1,2,0)
#6: 0x00618868 id=(3,0,0)
#0: 0x00b136f8 id=(1,0,0)
#1: 0x006e0048 id=(4,0,0)
#2: 0x00b13708 id=(1,1,0)
#3: 0x006e00c8 id=(4,1,0)
#4: 0x006e4458 id=(2,0,0)
#5: 0x00b13718 id=(1,2,0)
#6: 0x006e8868 id=(3,0,0)
#0: 0x006636f8 id=(1,0,0)
#1: 0x00670048 id=(4,0,0)
#2: 0x00663708 id=(1,1,0)
#3: 0x006700c8 id=(4,1,0)
#4: 0x00674458 id=(2,0,0)
#5: 0x00663718 id=(1,2,0)
#6: 0x00678868 id=(3,0,0)
--ASLRによってポインタは毎回違っているが、そのポインタか...
--だからメモリ上に構造木などを作った場合、そのリンク先の...
--そしてこのidは環境に依存しないので、最初はWindows上で開...
-プログラムを改造して以下のようにすることもできる。前半は...
void aMain(AComArg *ca0)
{
ABegin(ca1, c1, ca0);
void *p;
int i, alc0, ofs, id;
AMemAlc0 *t28[28]; AMemAlc1_makeTable28(ca1, ca1->ta...
for (i = 0; i < 7; i++) { // このループで7つのポイン...
static int t[7] = { 1, 4, 1, 4, 2, 1, 3 };
p = AMemAlc1_alc(ca1, ca1->ta, 8 << t[i], c1); /...
id = AMemAlc0_test3(ca1, t28, t28 + 28, p, &ofs,...
printf("#%d: 0x%08x id=(%d,%d,%d)\n", i, (int) p...
}
AClean_out(ca1, c1); // これで7つのポインタは自動で...
for (;;) { // idを入力してポインタを得る.
char s[1000];
printf("\n>");
fgets(s, 10000, stdin);
if (strncmp(s, "exit", 4) == 0) break;
sscanf(s, "(%d,%d,%d)", &alc0, &id, &ofs);
p = ((char *) AMemAlc0_test2(ca0, t28[alc0], id)...
printf("%08x\n", (int) p);
}
}
-こうすると
ページ名: