kmalloc
を変数に使用し、memset
の値を持つメモリとfree
を使用してメモリを割り当てるカーネルモジュールをテストしています。
ここにゼロ化メモリルーチンを持つコードがあります。kfree関数が呼び出されたときに起こったこと
unsigned char *a = (unsigned char *)kmalloc(256, GFP_KERNEL);
unsigned char *b;
int i;
for(i=0;i<256;i++)
{
a[i]=(unsigned char)i;
}
// print variable a
printk("before zeroisation\n");
for(i=0;i<255;i++)
{
printk("%02x", a[i]);
}
// copy allocated address to variable b
b =a;
memset(a, 0x00, 256);
// print memset to zero
printk("memset variable a\n");
for(i=0;i<255;i++)
{
printk("%02x", b[i]);
}
free(a);
a=NULL;
// print free variable's address
printk("after zeroisation\n");
for(i=0;i<255;i++)
{
printk("%02x", b[i]);
}
と結果が
before zeroization
000102030405060708090a0b0c0d0e0f ...
memset variable a
00000000000000000000000000000000 ...
after zeroization
001e7f430088ffff0000000000000000 ...
です。これは、変数の自由なようで割り当てられた領域で何かのアドレスの挿入値になります。 001e7f430088ffff - > ffff8800437f1e00(リトルエンディアンで)
bのポインタの追加のアドレスはffff8800437f0800
です。ヒープメモリの動的メモリ割り当てには、ダブルリンクリストからなるフリーリストがあることは知っています。
私はこれもメモリ割り当てプロセスに関連していると思います。
私は値001e7f430088ffffの意味と、kfree
の機能を知りたいと思っています。ありがとうございます。
ありがとうございます。
にメモリを割り当てる必要がある[未定義の動作]は(https://en.wikipedia.org/wiki/Undefined_behaviorは) – LPs
@LPsはない未定義の動作は、結果を意味しました(私が正しく理解していれば)しかし、この結果は常に同じです。 –
カーネルには、 'slab'、' slub'、 'slob'の3種類のメモリアロケータがあります。どのカーネルが設定されていますか? (CONFIG_SLAB、CONFIG_SLOBまたはCONFIG_SLUB)。 – Tsyvarev