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

标签 c linux linux-kernel heap-memory linux-device-driver

我正在测试使用 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/

相关文章:

c - 如何将文件中的所有数字读取到数组中?

python - 嵌入式 python 未拾取 PYTHONPATH

c - 为什么在 Linux 中内存使用量大于物理 RAM?

c - 将头文件与 makefile : undefined reference error 链接

c - 从函数返回数组/指针

c++ - Linux - 获取线程堆栈内存的开始和结束

php - Linux 主机中的 Cron 作业命令

linux - 取消设置一组环境变量

Linux kernel header.S源码,为什么清零BSS时需要_end+3?

c - 下列哪项对 Nagle 算法的描述是正确的?