如果我们按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);
}
答案 0 :(得分:1)
与malloc()
和free()
一样,kfree()
必须传递kmalloc()
返回的确切地址。
答案 1 :(得分:1)
正如其他人已经说过的那样,你应该传递一个指向分配器返回给你的确切地址的指针,让我再解释你为什么需要它。
当你调用一个分配器时,它会在'池'中搜索一些对你的请求有好处的内存块,但是分配器如何知道每个块的大小是多少?它通常在传递给你的指针之前保持它。
这个区域对于分配器很重要,原因有两个:在那里,有一个标志指示是否分配了这个块+块的大小(也许是其他东西)。
当您调用自由函数时,分配器需要知道您想要释放的块的大小,并且需要将其标记为空闲,因此它假定在您给出的地址之前的某个区域中,它可以检查/设置这些信息;所以不,给它对象中间的地址为你的分配器搞砸了。
答案 2 :(得分:0)
无论内核使用slob,slab还是slub allocator,都将分配的内存视为整个对象。所以,你不能只释放它的一部分。