AM我正确地观察到,如果在设备驱动程序例程中完成任何内存分配,kzalloc优于kmalloc吗?
我见过内核补丁用kzalloc替换kmalloc + memset。但我怀疑为什么需要设置内存内容呢?为什么我们只能在以后期望用相关内容写入内存时才使用kmalloc?
答案 0 :(得分:2)
好。这对Linux Kernel和kmalloc / kzalloc来说并不是很特别。但它在分配和使用内存方面存在一般性问题。
这些人已经涵盖了很多案例,如果你只是做分配而不是把它归零,会发生什么。这些仍然是用户级的东西,想象这些事情发生在内核中。
答案 1 :(得分:1)
这取决于相关内容的定义。
如果您不关心内存的内容,可以使用kmalloc
;这是缓冲区分配的情况,您不关心初始内容,因为您要编写您的数据。在这种情况下,您可以节省成本'将内存设置为0。
但是如果要为结构分配内存,情况会有所不同。
就个人而言,我只是在我想要分配我要设置某个值(不同于0)的结构时更喜欢kzalloc
但同时我想将结构的所有其他字段设置为已知有效状态(零)。例如:
struct test {
int counter;
void *buffer;
int n_data;
};
在这种情况下,如果我使用kzalloc
,我会保存一些代码行,因为:
设置为NULL
缓冲区它也很好,因为我稍后会将其分配并将其设置为NULL
我可以简单地编写以下内容,因为它是一个已知状态:
if (!t->buffer)
t->buffer = kmalloc(10);
将数据n_data
设置为零是好的,因为开头的缓冲区为空且未分配。
当然,如果在你的结构中你要手动设置大多数字段的值不等于0,那么用kzalloc
<将所有字段初始化为零就没有意义(至少对我而言) / p>