在进行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