探索Linux内核:Kconfig的秘密

  

深入了解Linux配置/构建系统是如何工作的。

  

自从Linux内核代码迁移到Git之后,Linux内核配置/构建系统(也称为Kconfig/kBuild)已经存在了很长时间。然而,作为支持基础设施,它很少受到关注;即使在日常工作中使用它的内核开发人员也从未真正考虑过它。

  

为了探索Linux内核是如何编译的,本文将深入研究Kconfig/kBuild内部进程,解释。config文件和vmlinux/bzImage文件是如何生成的,并介绍一个用于依赖性跟踪的智能技巧。

  

<强> Kconfig

  

构建内核的第一步总是配置.Kconfig帮助使Linux内核高度模块化和可定制.Kconfig为用户提供了许多配置目标:

           配置   使用面向行的程序更新当前配置         nconfig   使用基于ncurses菜单的程序更新当前配置         menuconfig   使用基于菜单的程序更新当前配置         xconfig   利用基于qt的前端更新当前配置         gconfig   利用基于GTK +的前端更新当前配置         oldconfig   使用提供的config作为基础更新当前配置         localmodconfig   更新未加载的当前配置禁用模块         localyesconfig   更新当前配置,将本地插件转换为核心         defconfig   从拱提供的Defconfig中获得默认配置的新配置         Savedefconfig   将当前配置保存为。/defconfig(最小配置)         allnoconfig   使用“不”回答所有选项的新配置         allyesconfig   新配置,在该配置中,所有选项都以“是”接受         allmodconfig   在可能的情况下选择新的配置模块         alldefconfig   将所有符号设置为默认值的新配置         randconfig   具有对所有选项的随机答案的新配置         listnewconfig   列出新选的项         olddefconfig   与oldconfig相同,但在不提示的情况下将新符号设置为默认值         kvmconfig   为kvm客户端内核支持启用其他选的项         xenconfig   启用Xen dom0)和来宾内核支持的其他选的项         tinyconfig   配置尽可能小的内核            

我认为menuconfig是这些目标中最受欢迎的。目标由不同的主机程序进行处理,这些程序由内核提供,并在内核构建过程中生成。一些目标有一个GUI(为了用户的方便),而大多数没有。与kconfig相关的工具和源代码主要位于脚本/kconfig/在内核源代码中。我们可以从脚本/kconfig/makefile,有几个主机程序,包括相依,mconf,和nconf。除了配置,它们每个都负责基于GUI的配置目标之一,因此,配置和他们中的大多数人打交道。

  

从逻辑上讲,Kconfig的基础结构有两个部分:一个实现了新语言要定义配置项(请参阅内核源代码下的Kconfig文件),而其他配置项则解析Kconfig语言并处理配置操作。

  

大多数配置目标的内部流程大致相同(如下所示):

  

探索Linux内核:Kconfig的秘密

  

注意,所有配置项都有一个默认值。
  

  

第一步读取源根下的Kconfig文件以构造初始配置数据库,然后根据此优先级读取现有配置文件来更新初始数据库:

  
      <李> . config李   <李>/lib/模块/$(壳牌、uname-r)/config李   <李>/etc/内核配置   <李>/boot/config - $(壳牌、uname-r)   <李> ARCH_DEFCONFIG李   <李>拱/$ (ARCH)/Defconfig李   
  

如果您正在进行基于GUI的配置,则通过menuconfig或基于命令行的配置oldconfig,数据库将根据您的自定义进行更新。最后,将配置数据库转储到config文件中。

  

但是config文件不是内核构建的最终素材;这就是为什么syncconfig目标存在.syncconfig以前是一个名为silentoldconfig,但是它不像旧名字说的那样,所以它被重命名了。此外,由于它是内部使用(而不是为用户),它被从列表中删除。

  

下面是一个例子syncconfig作用:
  

  

探索Linux内核:Kconfig的秘密

  

syncconfig接受。config作为输入并输出许多其他文件,这些文件分为三类:

  

汽车。相依,三态。配置用于生成文件文本处理,例如,您可能在组件的makefile中看到这样的语句:

探索Linux内核:Kconfig的秘密