当kfree函数调用

时间:2016-06-01 13:27:33

标签: c linux linux-kernel heap 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 - &gt; ffff8800437f1e00(小端)
 b的指针的附加地址是ffff8800437f0800
 我知道堆内存中的动态内存分配具有由双链表组成的空闲列表  我认为这也与内存分配过程有关。

我想知道值001e7f430088ffff的含义以及kfree函数内的进程。
 谢谢。

1 个答案:

答案 0 :(得分:0)

   b =a;

这意味着a和b都指向相同的内存。释放任何指针都会导致两个指针丢失内存。然后这个内存可以包含任何垃圾值。

  free(a);
  a=NULL;

一旦获释,无需指定NULL。释放指针时,意味着它不再指向任何内存。

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

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

  2. 即可
  3. 或使用memcpy(b, a, sizeof(a));功能复制a中的值。但在此之前,您必须将内存分配给b