关注了就能看到更多这么棒的文章哦~
How many ways are there to configure the Linux kernel?
By Daroc Alden
September 10, 2025
Gemini flash translation
https://lwn.net/Articles/1034811/
配置 6.16 Linux 内核的方式有很多种。在 x86_64 平台上,它有 32,468 个不同的配置选项,其他平台也有类似数量的选项。探索内核的配置方式非常困难,需要专门的工具。这些工具表明,选项组合成的 可能配置数量 具有 6,550 位数字。这个数字在内核历史上是如何变化的,这对测试又意味着什么?
分析 Kconfig
面对如此多的配置选项,即使要弄清楚哪些选项是多余的、未使用的,或者可以通过简化来处理的,也可能很困难。对于我们计算内核配置方式数量的问题,我们还需要考虑不同配置选项之间的关系。值得庆幸的是,有一些软件可以管理这种日益增长的复杂性。
内核使用一种自定义配置语言,Kconfig,来描述如何定制构建。虽然 Kconfig 已经扩散到少数几个 相关项目,但它仍然是一个主要由内部开发、Linux 特有的系统。Paul Gazzillo 与其他几位贡献者共同编写了 kmax,这是一套遵循 GPL-2.0 许可的软件套件,用于分析 Kconfig 声明。该项目包含多种工具,用于确定哪些配置选项需要启用以测试补丁、查找配置错误,以及将 Kconfig 声明导出为可被更多工具理解的语言。它已被集成到英特尔的 0-day 测试套件中,并在此过程中发现了内核配置中的 许多错误。
该项目的一个程序 klocalizer,能够以 SMT-LIB 2(可满足性模理论库)或 DIMACS(离散数学和计算机科学联盟)格式输出不同选项之间的关系集合——这些是现代 SAT 求解器(布尔可满足性问题求解器)的标准输入格式。这使得编写针对内核配置选项的自定义临时分析变得简单得多。例如,可以使用 Z3 的 Python 绑定来加载 klocalizer 的输出,并探索选项之间的相互关系。像 Z3 这样的 SAT 求解器(如果可能)会为一组约束生成一个单一的解决方案——在这里,即一种有效的内核配置方式。
计算有效解决方案的数量是一个相关但更困难的问题,称为 #SAT(计数可满足性问题)。虽然有多种近似技术可以用于概率性地解决 #SAT,但在本例中,内核配置中的约束足够简单,一个名为 ganak 的精确计数器能够准确地解决这个问题。
统计数据
因此,有了这些工具,就可以分析内核究竟有多少种配置方式。内核中配置参数数量的增长大致呈线性,导致内核可配置方式的数量呈指数级增长。以下图表显示了两条趋势线:蓝线是内核实际配置方式数量的对数,红线是配置选项的数量(经过适当缩放以适应同一坐标轴;详见下文)。红线代表蓝线可能达到的理论最大值。直接绘制 6,000 位数字对于 LibreOffice Calc 和 Google Sheets 来说都太困难了,因此采用了对数表示。

从这张图表中可以立即看出几点。例如,与 2.6.37 版本(kmax 可以理解的最早版本)相比,6.16 版本中可用的配置选项数量增加了一倍以上。从某种意义上说,这并不令人惊讶——Linux 内核不断增加对新功能和新硬件的支持;配置选项的数量也随代码一同增长。但存在一个更微妙且可以说更重要的趋势:配置选项随着时间的推移变得越来越相互依赖。
如果每个配置选项都可以独立于其他所有配置选项启用,那么给定 N 个配置选项,将有 2^{N} 种方式来配置内核。红线是配置选项数量乘以 ^{ln(2)}⁄_{ln(10)} 的值——也就是说,它代表 2^{N} 的对数。这样,两条线就可以直接进行比较。内核实际的配置方式数量低于这个理论最大值,因为配置选项可能相互依赖或相互排斥。此图表显示了红线和蓝线之间的差异:

请注意,这个结果仍然是对数尺度的,所以这个值是由不同选项之间的依赖关系所排除的内核配置方式数量的对数。随着差异的增大,这表明更多的配置选项正在相互作用。这本身并不是一个问题——但这些相互作用很可能与相互依赖的代码片段相关联。内核代码依赖于多个相关配置选项的位置数量正在增加。
鉴于可能配置的数量庞大,可以肯定并非所有配置都经过了单独测试。如果配置选项是独立的,那么理论上只需测试一个所有功能都启用的内核和一个所有功能都禁用的内核就足够了。许多选项,特别是那些特定于某个硬件驱动程序的选项,确实是独立的。但当选项可以相互影响和交互(即使是在 Kconfig 交互之外)时,需要测试的场景数量会迅速增加。
Linux 的测试是高度分布式的——由单个补丁贡献者和审阅者、多种不同的自动化单元测试和模糊测试机器人、发行版质量保证(QA)团队、公司以及普通 Linux 用户完成。由于开源的去中心化特性以及大量的可能配置,很难准确判断有多少种配置得到了覆盖。流行发行版使用的内核经过了充分测试,但启用其他配置选项会迅速进入未知领域。Linux 内核不会停止获得新功能——因此,解决这个问题的唯一真正方法是尽可能简化现有配置选项。最近 从调度器中移除特殊的单处理器支持 的工作就是一个例子。
归根结底,在内核开发的诸多挑战中,这并不是最紧迫或最重要的。然而,为了任何试图配置内核的人的理智,这一点仍然值得关注。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

Linux内核配置数量揭秘
838

被折叠的 条评论
为什么被折叠?



