【问题标题】:Why driver programming prefer kzalloc over kmalloc为什么驱动程序编程更喜欢 kzalloc 而不是 kmalloc
【发布时间】:2015-02-20 16:38:54
【问题描述】:

我是否正确地观察到在设备驱动程序例程中完成任何内存分配的情况下, kzalloc 优于 kmalloc ?

我已经看到内核补丁用 kzalloc 替换了 kmalloc+memset。但我的疑问是为什么需要设置内存内容?为什么我们不能只使用 kmalloc 当内存稍后会被写入相关内容时?

【问题讨论】:

  • 如果忘记写入内存并读取它怎么办。或者,如果您在写入之前读取非归零内存怎么办?
  • @Milind Dumbare 这些案例被认为是错误,因此它们超出了问题的范围。

标签: linux-kernel linux-device-driver


【解决方案1】:

这取决于相关内容的定义

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

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

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

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

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

    if (!t->buffer)
        t->buffer = kmalloc(10);
    
  • n_data的数据数量设置为零是好的,因为一开始的缓冲区是空的,没有分配。

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

【讨论】:

    【解决方案2】:

    嗯。这对于 Linux 内核和 kmalloc/kzalloc 本身来说并不是很具体。但它在分配和使用内存方面的普遍问题。

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

    参考:zeroing out memory

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      相关资源
      最近更新 更多