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

时间:2015-02-20 16:38:55

标签: linux-kernel linux-device-driver

AM我正确地观察到,如果在设备驱动程序例程中完成任何内存分配,kzalloc优于kmalloc吗?

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

2 个答案:

答案 0 :(得分:2)

好。这对Linux Kernel和kmalloc / kzalloc来说并不是很特别。但它在分配和使用内存方面存在一般性问题。

这些人已经涵盖了很多案例,如果你只是做分配而不是把它归零,会发生什么。这些仍然是用户级的东西,想象这些事情发生在内核中。

参考:zeroing out memory

答案 1 :(得分:1)

这取决于相关内容的定义

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

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

struct test {
    int counter;
    void *buffer;
    int n_data;
};

在这种情况下,如果我使用kzalloc,我会保存一些代码行,因为:

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

    if (!t->buffer)
        t->buffer = kmalloc(10);
    
  • 将数据n_data设置为零是好的,因为开头的缓冲区为空且未分配。

当然,如果在你的结构中你要手动设置大多数字段的值不等于0,那么用kzalloc <将所有字段初始化为零就没有意义(至少对我而言) / p>