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.
Zugriff auf einen freigegebenen Speicher ist [undefiniertes Verhalten] zuzuteilen haben (https://en.wikipedia.org/wiki/Undefined_behavior) – LPs
@LPs hat bedeutet nicht undefiniertes Verhalten Ergebnis ist unerwartet? (wenn ich das richtig verstehe.) aber dieses Ergebnis ist immer dasselbe. –
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