深入理解 Linux 配置/构建系统是如何工作的。
自从 Linux 内核代码迁移到 Git 以来,Linux 内核配置/构建系统(也称为 Kconfig/kbuild)已存在很长时间了。然而,作为支持基础设施,它很少成为人们关注的焦点;甚至在日常工作中使用它的内核开发人员也从未真正思考过它。
为了探索如何编译 Linux 内核,本文将深入介绍 Kconfig/kbuild 内部的过程,解释如何生成 .config 文件和 vmlinux/bzImage 文件,并介绍一个巧妙的依赖性跟踪技巧。
Kconfig
构建内核的第一步始终是配置。Kconfig 有助于使 Linux 内核高度模块化和可定制。Kconfig 为用户提供了许多配置目标:
配置目标
解释
config
利用命令行程序更新当前配置
nconfig
利用基于 ncurses 菜单的程序更新当前配置
menuconfig
利用基于菜单的程序更新当前配置
xconfig
利用基于 Qt 的前端程序更新当前配置
gconfig
利用基于 GTK+ 的前端程序更新当前配置
oldconfig
基于提供的 .config 更新当前配置
localmodconfig
更新当前配置,禁用没有载入的模块
localyesconfig
更新当前配置,转换本地模块到核心
defconfig
带有来自架构提供的 defconcig 默认值的新配置
savedefconfig
保存当前配置为 ./defconfig(最小配置)
allnoconfig
所有选项回答为 no 的新配置
allyesconfig
所有选项回答为 yes 的新配置
allmodconfig
尽可能选择所有模块的新配置
alldefconfig
所有符号(选项)设置为默认值的新配置
randconfig
所有选项随机选择的新配置
listnewconfig
列出新选项
olddefconfig
同 oldconfig 一样,但设置新符号(选项)为其默认值而无须提问
kvmconfig
启用支持 KVM 访客内核模块的附加选项
xenconfig
启用支持 xen 的 dom0 和 访客内核模块的附加选项
tinyconfig
配置尽可能小的内核
我认为 menuconfig 是这些目标中最受欢迎的。这些目标由不同的主程序host program处理,这些程序由内核提供并在内核构建期间构建。一些目标有 GUI(为了方便用户),而大多数没有。与 Kconfig 相关的工具和源代码主要位于内核源代码中的 scripts/kconfig/ 下。从 scripts/kconfig/Makefile 中可以看到,这里有几个主程序,包括 conf、mconf 和 nconf。除了 conf 之外,每个都负责一个基于 GUI 的配置目标,因此,conf 处理大多数目标。
从逻辑上讲,Kconfig 的基础结构有两部分:一部分实现一种来定义配置项(参见内核源代码下的 Kconfig 文件),另一部分解析 Kconfig 语言并处理配置操作。