我正在测试使用 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 -> ffff8800437f1e00(小端)
b 指针的附加地址是 ffff8800437f0800
我知道堆内存中的动态内存分配有一个由双链表组成的空闲列表。
我认为这也与内存分配过程有关。
我想知道值001e7f430088ffff的含义和kfree
函数内部的过程。
谢谢。
最佳答案
b =a;
这意味着 a 和 b 都指向同一个内存。释放任何指针将导致丢失两个指针的内存。然后这个内存可以包含任何垃圾值。
free(a);
a=NULL;
释放后无需分配 NULL
。释放指针时,意味着它不再指向任何内存。
所以如果你需要避免这样的行为
要么不释放指针
a
。只需分配它NULL
或其他内存或者使用
memcpy(b, a, sizeof(a));
函数复制a
中的值。但在此之前,您必须为b
分配内存
关于c - kfree 函数调用时发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37570127/