2016-06-01 18 views
1

Ich bin Kernel-Modul testen, die Speicher reserviert mit kmalloc zu einigen Variablen und memset es ist Wert und free.
Hier ist der Code mit der Nullsetzungsspeicherroutine.Was passiert, wenn kfree Funktion

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]); 
    } 

und Ergebnis ist

before zeroization 
000102030405060708090a0b0c0d0e0f ... 
memset variable a 
00000000000000000000000000000000 ... 
after zeroization 
001e7f430088ffff0000000000000000 ... 

Es frei variabel scheint Einsatzwert in zugewiesenen Bereich etwas Adresse macht. 001e7f430088ffff -> ffff8800437f1e00 (in Little Endian)
Additional Adresse des Zeigers von b ist ffff8800437f0800
Ich weiß, dass die dynamische Speicherzuweisung im Heap-Speicher hat freie Liste aus doppelt verketteten Liste.
Ich denke, das hängt auch mit Speicherzuweisungsprozess zusammen.

Ich möchte wissen die Bedeutung von Wert 001e7f430088ffff und Prozess von innerhalb kfree Funktion.
danke.

+0

Zugriff auf einen freigegebenen Speicher ist [undefiniertes Verhalten] zuzuteilen haben (https://en.wikipedia.org/wiki/Undefined_behavior) – LPs

+0

@LPs hat bedeutet nicht undefiniertes Verhalten Ergebnis ist unerwartet? (wenn ich das richtig verstehe.) aber dieses Ergebnis ist immer dasselbe. –

+0

Es gibt drei Typen von Speicherzuordnern im Kernel: 'slab',' slub' und 'slob'. Mit welchem ​​ist dein Kernel konfiguriert? (CONFIG_SLAB, CONFIG_SLOB oder CONFIG_SLUB). – Tsyvarev

Antwort

0
b =a; 

Das bedeutet, dass a und b auf denselben Speicher zeigen. Geben Sie einen beliebigen Zeiger frei, wird der Speicher von beiden Zeigern verloren gehen. und dann kann dieser Speicher irgendeinen Müllwert enthalten.

free(a); 
    a=NULL; 

befreit Sobald keine Notwendigkeit NULL zuweisen. Wenn Sie einen Zeiger freigeben, bedeutet dies, dass er nicht mehr auf Speicher verweist.

Also, wenn Sie ein solches Verhalten

  1. entweder nicht frei Zeiger a vermeiden müssen. Ordnen Sie es einfach NULL oder einen anderen Speicher

  2. Oder verwenden Sie memcpy(b, a, sizeof(a)); Funktion zum Kopieren von Werten in a. Aber bevor Sie Speicher-zu b

+0

Der Fragesteller ** will ** den "freien" Zeiger absichtlich ** und fragt nach seinem Inhalt. Ich sehe keinen Grund, ihn daran zu erinnern, dass solche Dereferenzierung nicht in realen Programmen verwendet werden sollte. – Tsyvarev

+0

@Tsyvarev Sie haben Recht. Ich dachte, er könnte neu in dieser Situation sein. Also, wenn es nicht hilft, werde ich es entfernen. – Mazhar

Verwandte Themen