gpt4 book ai didi

c - kfree 函数调用时发生了什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:28 34 4
gpt4 key购买 nike

我正在测试使用 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。释放指针时,意味着它不再指向任何内存。

所以如果你需要避免这样的行为

  1. 要么不释放指针 a。只需分配它 NULL 或其他内存

  2. 或者使用memcpy(b, a, sizeof(a));函数复制a中的值。但在此之前,您必须为 b

  3. 分配内存

关于c - kfree 函数调用时发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37570127/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com