我正在测试内核模块,它使用kmalloc
将内存分配给某个变量,并memset
将其分配给free
。
这是具有归零记忆例程的代码。
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 - &gt; ffff8800437f1e00(小端)
b的指针的附加地址是ffff8800437f0800
我知道堆内存中的动态内存分配具有由双链表组成的空闲列表
我认为这也与内存分配过程有关。
我想知道值001e7f430088ffff的含义以及kfree
函数内的进程。
谢谢。
答案 0 :(得分:0)
b =a;
这意味着a和b都指向相同的内存。释放任何指针都会导致两个指针丢失内存。然后这个内存可以包含任何垃圾值。
free(a);
a=NULL;
一旦获释,无需指定NULL
。释放指针时,意味着它不再指向任何内存。
所以如果你需要避免这种行为
要么不释放指针a
。只需指定NULL
或其他内存
或使用memcpy(b, a, sizeof(a));
功能复制a
中的值。但在此之前,您必须将内存分配给b