在嵌入式领域当中,在配置内核的时候会有很多配置方法,比如说make config(基于文本的为传统的配置界面)、make oldconfig(如何只想在原来内核配置的基础上修改一部分,则会省去很多麻烦)、make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)、make menuconfig(基于文本选择的配置界面,字符终端下推荐使用),以上4种配置方式的目的都是在源码的顶层目录下面生成一个.config文件,那么在我们嵌入式开发当中,经常使用的和推荐使用的是make menuconfig这种配置方法。
现在以linux-3.14.25内核为例,在内核的源码目录下面,执行make menuconfig命令。
在执行命令的时候可能出现的错误有:
1. 一些安装包没有提前安装上;(根据错误提示依次安装)
2. 终端窗口太小导致错误;
正常执行make menuconfig之后会出现下面的菜单框:
大家可能有疑问,这个界面是通过什么来生成的呢?其实也很容易会知道,当我们执行make menuconfig后,肯定会执行Makefile,那么我们打开Makefile文件来寻找menuconfig这个目标,但是是搜索不到的,这里有个技巧,我们使用%config来搜索,%是通配符的意思,会搜索到相关目标:
那么我们就会看到,绘制图形和解析这个界面的文件都会在scripts/kconfig目录下面,比较重要的文件有mconf.c和lxdialog目录。如果感兴趣的话可以研究,这里就不详细说明了。
进入菜单之后我们可以看到有标题、有说明性的文字、和关键的选项。它们又是如何呈现在菜单中的呢,其实系统会读取源码目录下面Kconfig文件,Kconfig文件是一个帮助内核添加内核选项的一个配置文件,打开这个Kconfig文件可以看到:
大家可以观察到,我们打开的菜单是有很多的选项的,既然Kconfig是一个添加选项的配置文件,那么这个文件中为什么这么少的内容呢,其实关键点在 source “arch/$SRCARCH/Kconfig”,这句话的意思就是调用其它目录下面的Kconfig文件,所以我们需要打开arch/$SRCARCH/Kconfig文件,但是SRCARCH这个变量的值又是如何确定的呢?很简单,它是在源码顶层目录下的Makefile中赋值的,ARCH=arm,所以我们需要进入到arch/arm/Kconfig文件中,进来之后大家就会看到非常多的选项了,同时也会调用很多各个目录下面的Kconfig文件。
那么大家一定页想知道每一个选项时如何写的呢?这个Kconfig文件的语法格式时什么样子的呢?下面我们来看一下:
1. 每条选项的前面可以看到[ ]、< >、( )三种表示方式
[ ] 有两种状态,*代表选中,没有*代表未选中;
选中的意思是对应的选项功能会被编译进内核镜像文件中;
< > 有三种状态,*代表选中,没有*代表未选中,M代表模块;
( ) 存放十进制或十六进制或字符串;
2. mainmenu “字符串描述信息”, 它只用一次,我们一般不用修改;
3. menu “Device Drivers”…endmenu,表示Device Drivers是一个子选项菜单,每一个选项是包含在drivers/bus/Kconfig文件中的。
4. [ ]、< >、( )如何表示的及后面跟着的选项字符串是如何得来的呢?
这里我们自己添加一个选项在Device Drivers中的Character devices中;
FS4412_LED Device Support选项;
那么我们就需要在drivers/char/下的Kconfig文件中添加内容。如图所示:
config 是一个关键字,对应的是一个选项配置;
如果FS4412_LED Device Support选项被选中为*,则保存配置之后会在源码目录下面的.config文件中出现CONFIG_FS4412_LED的配置项并赋值为y;这个.config文件就是配置内核后生成的保存配置信息的文件。
Tristate是表示 < >的,bool是表示[ ]的,string是表示( )的;
Depends on表示此选项会依赖其它选项配置,也就是说当ARCH_EXYNOS4这个选项被选择上之后,该选项才能被选择;
help是帮助信息;
default y表示该选项默认被选择上。
以上就是make menuconfig的一些用法和注意事项,后说明一点,当我们添加了选项并修改配置选项之后,保存退出菜单,会在源码目录下面生成一个.config文件,在该文件中会找到一个我们后添加的配置项;
这里表示当我们在编译内核的时候,该选项(led驱动)会被编译进内核uImage中,但是我们还需做一步工作就是在drivers/char/Makefile中添加一句话:
在我们编译uImage的时候,这个led的驱动才会被编译进内核,这里还需要注意一点就是这个led的驱动代码一定要是在drivers/char的目录下面存在的,否则之前做的都是无用功。
以上就是关于make menuconfig的一些介绍,包括Kconfig的语法和.config配置文件的说明,还有如何添加一个选项。至于菜单中其它选项的意思和作用是什么,那就需要大家慢慢积累和查找总结了。