构建系统与模块加载

这页讲的是:Linux 内核不是一份随便编一下就好的普通程序,它有自己复杂的构建系统、配置体系,以及内建功能和可加载模块之间的组织方式。学这页的重点,是理解“内核如何被组合、裁剪和装配出来”。

这块是什么

构建系统与模块加载,讲的是内核如何从源码、配置和子系统选择中被编译成最终可运行的内核镜像,以及某些功能如何以模块形式按需加载。它不只是“make 一下”,而是把庞大的代码树变成适合当前平台、当前需求的系统成品。

可以把它理解成“系统装配线”:不是所有零件都必须焊死在一起,有些能力可以内建进去,有些则可以在运行时再装上。

它负责什么

组织源码构建

  • 按架构和配置决定编译哪些部分
  • 管理大量子目录和目标文件
  • 把复杂代码树装配成统一产物
  • 让不同平台共享一套总体构建逻辑

管理功能裁剪

  • 通过配置开关选择能力
  • 决定哪些功能内建、哪些做成模块
  • 平衡功能完整性与镜像体积
  • 支持不同场景定制内核能力

支持模块装载

  • 让某些功能按需加载和卸载
  • 减少一次性内建所有能力的压力
  • 方便驱动和特定子系统灵活接入
  • 让内核具备更强的运行时组合性

为什么内核的构建比普通程序更像系统工程

问题你现在怎么理解为什么复杂
支持很多平台不同 CPU 架构、板子和设备组合都可能不同。不是一套固定二进制吃遍所有环境,而是要按平台装配。
功能太多内核覆盖调度、内存、文件系统、网络、驱动等大量子系统。不可能总是全量打包,必须有裁剪和组合机制。
驱动多样硬件支持种类巨大,很多能力不适合全部内建。模块机制让系统不必把所有硬件支持都焊死在镜像里。
稳定性要求高一旦出错,影响的是整机基础系统。构建、配置、符号匹配和版本关系都比普通应用更严肃。

关键概念

概念现在怎么理解
Kconfig负责配置项选择和依赖关系表达的体系。
Kbuild负责把配置和源码组织成实际构建流程的体系。
内建某个功能直接被编进内核镜像,开机就跟着内核一起存在。
模块某个功能被做成可单独加载的部件,运行时按需接入。
符号依赖模块和内核之间、模块彼此之间需要满足一定接口和版本关系。

为什么重要

常见误解

它不负责什么

和其他模块的关系

相关模块关系
驱动框架很多驱动以模块形式存在,是否内建或按需加载会影响设备接入方式。
启动内建能力会在系统启动过程中更早参与,模块能力则可能在之后再装入。
安全模块装载本身也是系统安全边界和治理的一部分。
测试与调试构建配置直接影响你能否开启某些诊断能力和测试设施。

你现在先把“配置、构建、装载”分三步看

阶段它主要在决定什么为什么别把它们混成一个动作
配置系统到底想要哪些能力、哪些依赖必须被一起带上。这一步更像“画清单”,还没真正开始编译。
构建把选中的源码和平台相关逻辑真正编成镜像与模块。这一步更像“装配”,决定产物怎么被做出来。
运行时装载某些模块在开机后再按需进入系统,接上已有内核。这一步更像“上线接入”,不是重新构建整个内核。
调试与裁剪为了问题定位或平台定制,还会决定是否带上额外诊断能力。这能帮助你把“可运行”和“可观察、可维护”一起考虑。

读完这页后,你应该能回答

后面适合继续问:Kconfig 和 Kbuild 各管什么?为什么有些驱动适合做模块,有些更常内建?模块装载为什么会碰到符号和版本问题?