假设我设置了一个三态内核配置选项来构建为模块,但我没有在运行时加载相应的内核模块(并且它不会自动加载)。生成的内核的功能是否与我完全禁用该选项时的功能相同?或者卸载的模块和禁用的内核选项之间有什么区别吗?
有时在我的 Gentoo 系统上安装软件包时,我会收到以下形式的警告
CONFIG_FLUX_CAPACITOR 在不应设置时设置
通常情况下,该选项实际上被设置为构建为模块,然后不会加载。到目前为止,该软件似乎在我遇到的每种情况下都运行良好,但我想知道这是否是我可以期望的一般情况。
答案1
禁用编译时选项意味着代码未编译。
卸载模块意味着代码已编译成模块,但未加载到内存中,因此不会运行。请注意,有时模块可能会自动加载,因此如果您需要禁用某些功能,安全的选择是在编译时禁用它或将其列入/etc/modprobe.conf
黑名单/etc/modprobe.d/*
。或者从文件系统中删除模块文件 - 您可能想depmod
稍后运行并记下,可能有一些其他模块依赖于它(这可能会在以后引起一些麻烦)。
也就是说,能力方面是相同的。适合在有或没有您禁用(未)禁用的模块的情况下运行的代码可能(或可能没有)略有不同:假设您可以将功能 A 编译为模块的内核。如果功能 B 能够使用功能 A 但不需要它,则生成的代码可能会有所不同。启用 A 的情况下(无论是作为模块还是编译进去的),B 可以包括对功能 A 是否存在的可选检查。禁用 A 的情况下在编译时,B 中的此类检查是无关紧要的,可以完全跳过。然而,这必须在代码本身中明确说明(例如通过 C#ifdef
指令),仅编译器无法决定这一点。因此,它取决于将功能 A 作为可选依赖项的部分的作者。它是否应该在功能上被称为不同是值得怀疑的 - 它不会改变功能,但很可能会改变执行时间(即使只是一点点 - 但即使这在某些极端情况下可能至关重要)。