为什么驱动程序编程更喜欢 kzalloc 而不是 kmalloc

Jay*_*Sen 9 linux-device-driver linux-kernel

我是否正确地注意到,如果在设备驱动程序例程中进行任何内存分配, kzalloc 比 kmalloc 更受欢迎?

我见过用 kzalloc 替换 kmalloc+memset 的内核补丁。但我的疑问是为什么完全需要设置内存内容?为什么我们不能在以后期望内存写入相关内容时只使用 kmalloc 呢?

Fed*_*ico 6

这取决于相关内容的定义。

如果你不关心内存的内容,你可以直接使用kmalloc;这是缓冲区分配的情况,您不关心初始内容,因为您要写入数据。在这种情况下,您可以节省将内存设置为 0 的“成本”。

但如果您要为结构分配内存,情况就会有所不同。就我个人而言,我更喜欢kzalloc仅当我想要分配要设置一些值(不同于 0)的结构时,但同时我想将结构的所有其他字段设置为已知且有效的状态(零) 。例如:

struct test {
    int counter;
    void *buffer;
    int n_data;
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果我使用,kzalloc我将节省一些代码,因为:

  • 一开始就将计数器初始化为 0,通常这是一件好事;
  • 设置为NULL缓冲区也很好,因为我稍后会分配它,并且通过将其设置为NULL我可以简单地编写以下内容,因为它是已知状态:

    if (!t->buffer)
        t->buffer = kmalloc(10);
    
    Run Code Online (Sandbox Code Playgroud)
  • 将数据数量设置n_data为零是好的,因为开始时的缓冲区是空的并且未分配。

当然,如果在您的结构中您要手动设置大多数字段的值不为零,那么将所有内容初始化为零就没有意义(至少对我来说)kzalloc


Mil*_*are 4

出色地。这对于 Linux 内核和 kmalloc/kzalloc 来说并不是很具体。但它的普遍问题是围绕分配和使用内存。

这些人已经介绍了许多情况,说明如果您只进行分配而不将其归零,可能会发生什么情况。这些仍然是用户级的东西,想象一下这些事情发生在内核中。

参考:内存归零