为什么在 Linux 内核 Kconfig 中使用 tristate 与 bool?

为什么在 Linux 内核 Kconfig 中使用 tristate 与 bool?

这是我目前对为什么人们会选择使用其中一种而不是另一种的理解,您能确认或更正我吗?

  • 运行时与编译时:如果您不知道是否要在运行时启用此功能,请使用三态。否则,你在编译时就知道了,所以使用 bool。如果你#ifdef在一些周围的代码 B 中包含一些可选代码 A(例如,包括 GPU 支持等额外功能),那么你需要将 A 设置为 bool,即使整个模块 B 可以声明为三态,因为ifdef在编译时进行评估。
  • 迭代速度:如果您正在开发一段新的代码,那么如果您将其声明为模块,那么您可以快速卸载旧版本并重新加载新编译的版本,而无需重新启动整个系统。
  • 侵入性:有些代码动态添加到已经运行的内核(例如对称多处理)会具有破坏性,因此它始终为布尔值。

我在这里还缺少其他因素吗?我认为自己错过的因素可能是

  • 表现
  • 安全
  • 经验法则(例如“始终使用 bool 除非您需要使用三态”)

其他解释、注释、链接和想法将不胜感激。谢谢!

答案1

引文来自https://www.linuxjournal.com/content/kbuild-linux-kernel-build-system

并非内核中的所有内容都可以编译为模块。

许多功能非常具有侵入性,您必须在编译时决定内核是否支持它们。例如,您无法向正在运行的内核添加对称多处理 (SMP) 或内核抢占支持。因此,使用布尔配置符号对于这些类型的功能是有意义的。

大多数可以编译为模块的功能也可以在编译时添加到内核中。这就是三态符号存在的原因——决定是否要编译内置功能 (y)、作为模块 (m) 或根本不编译 (n)。

我认为这一点很明确:如果只有两个选择,则使用布尔值,如果有三个选择,则使用三态。其他一切都没有意义。

相关内容