Jay*_*Sen 9 linux-device-driver linux-kernel
我是否正确地注意到,如果在设备驱动程序例程中进行任何内存分配, kzalloc 比 kmalloc 更受欢迎?
我见过用 kzalloc 替换 kmalloc+memset 的内核补丁。但我的疑问是为什么完全需要设置内存内容?为什么我们不能在以后期望内存写入相关内容时只使用 kmalloc 呢?
这取决于相关内容的定义。
如果你不关心内存的内容,你可以直接使用kmalloc;这是缓冲区分配的情况,您不关心初始内容,因为您要写入数据。在这种情况下,您可以节省将内存设置为 0 的“成本”。
但如果您要为结构分配内存,情况就会有所不同。就我个人而言,我更喜欢kzalloc仅当我想要分配要设置一些值(不同于 0)的结构时,但同时我想将结构的所有其他字段设置为已知且有效的状态(零) 。例如:
struct test {
int counter;
void *buffer;
int n_data;
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果我使用,kzalloc我将节省一些代码,因为:
设置为NULL缓冲区也很好,因为我稍后会分配它,并且通过将其设置为NULL我可以简单地编写以下内容,因为它是已知状态:
if (!t->buffer)
t->buffer = kmalloc(10);
Run Code Online (Sandbox Code Playgroud)将数据数量设置n_data为零是好的,因为开始时的缓冲区是空的并且未分配。
当然,如果在您的结构中您要手动设置大多数字段的值不为零,那么将所有内容初始化为零就没有意义(至少对我来说)kzalloc