在使用 Linux 内核时,我遇到了一些内核配置选项没有明确出现在 .config 文件中的情况。为了进一步调查,我通过添加代码来手动测试一些标志,如果启用了这些标志,这些代码会故意使构建失败,但我没有发现任何此类标志在未出现在 .config 中的情况下处于活动状态的证据。
这是我的问题:
- 是否可以通过依赖项或默认值隐式启用 Kconfig 选项,但未在 .config 中显式列出?
不,.config 将准确列出内核中内置的内容(如果它已正确生成,并且未手动修改)。 KConfig 将解决您的 defconfig 的依赖关系。
传统上,您将使用
*_defconfig
文件配置内核。这是 .config
的压缩表示。它基本上包含了所有非默认配置。当您运行 make <your>_defconfig
时,它将选择列出的所有配置,并对所有其他配置使用默认值。然后您可以使用 make menuconfig
进行手动配置。完成后,使用 make savedefconfig
保存回 defconfig。 defconfig
文件适合版本控制,因为它们比 .config
更轻。一些外部构建框架也允许保存配置片段,但不是标准的。
如果您不确定使用 .config 或 defconfig 是否正确,您可以重新生成正确的配置,并使用
make menuconfig
解析所有默认值并保存。
- 选择指令、自动选择或特定于架构的条件如何影响 .config 中标志的可见性?
在 KConfig 选项之间声明依赖关系有多种方式。您可以在
KConfig
文件中找到与您的选项相关的文件:
depends on
:没有依赖就无法启用selects
:自动选择所述依赖项imply
:与 select 类似,但可以使用 =n
visible if
:菜单中显示的条件
- 即使相关标志未出现在 .config 中,某些功能是否可以有条件地编译或默认启用?
如1)。 .config 提供处理依赖项后解析的最终值。您还可以检查运行时有效配置(如果启用)(
zcat /proc/config.gz
)。然而,其他机制允许在运行时在内核上添加新配置。最常见的是模块。您可以使用 lsmod
列出已加载的模块。