将地址传递给kfree

时间:2013-12-28 06:14:29

标签: linux linux-kernel linux-device-driver

如果我们按kmalloc()分配内存,那么在释放内存时,我应该只将内存块的起始地址传递给kfree(),还是将任何地址传递给分配的内存块?

例如:在下面的程序中,kfree()是否可以释放分配的1KB内存?

        int my_kmalloc_init(void) 
 {

        kp = kmalloc(1024,GFP_KERNEL);
        if(!kp) {
                pr_err("memory allocation failed");
                return -ENOMEM;
        }

        return 0;
}

void my_kmalloc_exit(void) {

        kfree(kp+100);

}

3 个答案:

答案 0 :(得分:1)

malloc()free()一样,kfree()必须传递kmalloc()返回的确切地址。

答案 1 :(得分:1)

正如其他人已经说过的那样,你应该传递一个指向分配器返回给你的确切地址的指针,让我再解释你为什么需要它。

当你调用一个分配器时,它会在'池'中搜索一些对你的请求有好处的内存块,但是分配器如何知道每个块的大小是多少?它通常在传递给你的指针之前保持它。

这个区域对于分配器很重要,原因有两个:在那里,有一个标志指示是否分配了这个块+块的大小(也许是其他东西)。

当您调用自由函数时,分配器需要知道您想要释放的块的大小,并且需要将其标记为空闲,因此它假定在您给出的地址之前的某个区域中,它可以检查/设置这些信息;所以不,给它对象中间的地址为你的分配器搞砸了。

答案 2 :(得分:0)

无论内核使用slob,slab还是slub allocator,都将分配的内存视为整个对象。所以,你不能只释放它的一部分。