2016-06-01 10 views
1

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の機能を知りたいと思っています。ありがとうございます。
ありがとうございます。

+0

にメモリを割り当てる必要がある[未定義の動作]は(https://en.wikipedia.org/wiki/Undefined_behaviorは) – LPs

+0

@LPsはない未定義の動作は、結果を意味しました(私が正しく理解していれば)しかし、この結果は常に同じです。 –

+0

カーネルには、 'slab'、' slub'、 'slob'の3種類のメモリアロケータがあります。どのカーネルが設定されていますか? (CONFIG_SLAB、CONFIG_SLOBまたはCONFIG_SLUB)。 – Tsyvarev

答えて

0
b =a; 

これは、aとbの両方が同じメモリを指していることを意味します。任意のポインタを解放すると、両方のポインタからメモリが失われます。このメモリには任意のガベージ値を含めることができます。

free(a); 
    a=NULL; 

解放されると、NULLを割り当てる必要はありません。ポインタを解放すると、ポインタがメモリを指していないことを意味します。だから、

あなたは

  1. 、このような動作を回避する必要がありますいずれかのフリーポインタaをいない場合。 NULLまたは別のメモリを割り当ててください

  2. の値をコピーするには、memcpy(b, a, sizeof(a));関数を使用してください。しかし、その前に、あなたが解放されたメモリへのアクセスb

+0

Asker **は意図的に**フリーのポインタをデリファレンスし、その内容について尋ねます。私は、そのような参照が実際のプログラムで使われるべきではないことを彼に思い出させる理由はない。 – Tsyvarev

+0

@Tsyvarevあなたは正しいです。私は彼がこのような状況に新しい可能性があると思った。それが助けにならないなら、私はそれを取り除くでしょう。 – Mazhar

関連する問題