linux内核中kconfig、.config、menuconfig之间的关系

  在进行linux内核的配置编译的时候,最常见的就是make menuconfig命令。总所周知,linux是一个模块化定制的系统,那么它又是如何来实现模块化的配置的呢?

在配置的过程中,我们最重要的就是理清楚 kconfig、.config 、 menuconfig之间的关系。 


一、linux内核的配置原理

.config:

  默认情况下是没有.config文件的,配置过程就是为了产生.config文件。内核在编译过程中会读取.config中的配置项,并且用这些配置项去指导整个编译链接过程。.config文件的格式类似于脚本文件,其中内容为类似于于:CONFIG_ARM=y的一个一个的配置项。这些配置项就类似于脚本文件中定义的一个一个变量,所以这一行可以被理解为定义了一个变量CONFIG_ARM,这个变量的值为y。.config文件中每一行都是一个配置项,从.config文件的规模可以看出linux内核的可配置项有两三千个。所以linux内核是高度可配置的,而且linux内核的所有配置项很难全部搞明白。因为linux内核的配置项太多太繁杂,因此linux内核不像uboot那样直接手工配置,而是发明了一个图形化的配置工具menuconfig

menuconfig:

  menuconfig提供了一套文本图形用户界面,方便在配置的过程中查找我们所需要的配置项。make menuconfig其实就是读取第一步得到的.config,然后给我们一个图形化的界面,让我们可以更加容易的找到自己想要修改的配置项,然后更改配置。menuconfig需要ncurses库的支持,需要在电脑中安装ncurses库,并且操作时屏幕不能太小。menuconfig中有很多的菜单项,菜单项的项目内容从Kconfig文件来,菜单项的选择值从.config文件来。

kconfig:

  kconfig是一种特定格式的脚本文件,主要是提供给menuconfig读取的。内核源码树每个目录下都还包含一个 Kconfig 文件,用于描述所在目录源代码相关的内核配置菜单,各个目录的 Kconfig 文件构成了一个分布式的内核配置数据库。通过 make menuconfig命令配置内核的时候,从 Kconfig 文件读取菜单,配置完毕保存到文件名为.config 的内核配置文件中,供 Makefile 文件在编译内核时使用。

kconfig脚本的格式如下图所示:

  

menu 和 endmenu之间定义了一个子菜单。而在这个子菜单中的菜单项由config关键字来定义。

  

  

这两行语句定义了一个 bool选项,在.config中的配置变量名称为 CONFIG_DEVKMEM,选项提示信息为“ /dev/kmem virtual device support”,在内核配置界面的实际表现为:

   

菜单项的类型:

  

 对于布尔型选项,在配置界面用[ ]表示:[*] /dev/kmem virtual device support  [*]表示选中, 对应 CONFIG_XXX=y[ ]则表示未选中。
 对于三态选项,   在配置界面用< >表示: <*> Kernel .config support <*>表示选中, 对应 CONFIG_XXXx=y<M>表示编译为模块, 对应 CONFIG_XXX=m< >表示未选中。

 

依赖关系:如果一个选项能否生效与否与其它选项的设置有关,则必须通过 depends on来声明这种依赖关系。例如,只有使能了 SMP 才能设置 CPU 个数变量 NR_CPUS,在 Kconfig中则写成:

  

目录层次迭代: 通过 source 可以直接引用下级目录的 Kconfig 文件,形成新的菜单项或者子菜单,这样方便每个目录独立管理各自的配置内容。source "drivers/tty/Kconfig"”就是直接引用<drivers/tty/Kconfig>文件,形成更多菜单(项)。


二、内核重要配置项的介绍

下面针对内核配置的重要菜单项进行介绍,如下图:

  

  

  

内核编译生成文件说明:

  

注意:如果在 64 位 ubuntu 下编译 Linux 内核,在编译过程中很有可能出现“arm-fsl-linux-gnueabi/bin/as: error while loading shared libraries: libz.so.1: cannot openshared object file: No such file or directory”这样的错误,这是因为没有正确安装 libz库所致,可以通过 “sudo apt-get install zlib1g:i386” 命令安装解决 。

uImage和mkImage:

  对于ARM linux 系统,大多数使用uboot引导,很少使用zImage镜像,而是通过 mkimage对zImage加工成 uImage,然后烧录启动内核。uImage U-Boot 默认采用的内核映像文件,它是在 zImage 内核映像之前加上了一个长度为 64 字节信息头的映像。  mkimage工具可在编译 U-Boot 源码后从 tools目录下获得,复制到系统/usr/bin 目录即可;对于 Ubuntu 系统,还可用 sudo apt-get install u-boot-tools 命令安装得到。 

mkImage工具的使用及参数说明:

  $ mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image

  

mkimage除了可以制作uimage镜像,还可以查看uimage镜像文件的信息:

  命令: mkimage -l uImage_file  

原文地址:https://www.cnblogs.com/qiabaowei/p/8555492.html