内容来自 韦东山《嵌入式Linux应用开发完全手册》

在内核日录下执行“make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-”时,就会看到一个如图16.3所示的菜单,这就是内核的配置界面。通过配置界面,可以选择芯片类型、选择需要支持的文件系统,去除不需要的选项等,这就称为“配置内核”。注意,也有其他形式的配置界面,比如“make config”命令启动字符配置界面,对于每个选项都会依次出现一行提示信息,逐个回答;“make xconfig”命令启动X-windows图形配置界面。

所有配置工具都是通过读取arch/$(ARCH)/Kconfig文件来生成配置界面,这个文件是所有配置文件的总入口,它会包含其他目录的Kconfig文件。配置界面如图16.3所示。

内核源码每个子日录中,都有一个Makefile文件和Kconfig文件。Makefile的作用前面已经讲述,Kconfig用于配置内核,它就是各种配置界面的源文件。内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config。

内核的配置界面以树状的菜单形式组织,主菜单下有若干个子菜单,子菜单下又有子菜单或配置选项。每个子菜单或选项可以有依赖关系,这些依赖关系用来确定它们是否显示。只有被依赖项的父项已经被选中,子项才会显示。

Kconfig文件的语法可以参考Documentation/kbuild/kconfig-language.txt文件,下面讲述几个常用的语法,并在最后介绍菜单形式的配置界面操作方法。

1.Kconfig文件的基本要素:config条目(entry)

config条目常被其他条目包含,用来生成菜单、进行多项选择等。

config条目用来配置一个选项,或者这么说,它用于生成一个变量,这个变量会连同它的值一起被写入配置文件.config中。比如有一个config 条目用来配置CONFIG_LEDS_S3C24XX,根据用户的选择,.config文件中可能出现下面3种配置结果中的一个。

CONFTG_LEDS_S3C24XX=y  #对应的文件被编进内核
CONEIG_LEDS_S3C24XX=m  #对应的文件被编成模块
#CONFIG_LEDS_S3C24xx   #对应的文件没有被使用

以一个例子说明config条目格式,下面代码选自fs/Kconfig文件,它用于配置CONFIG JFFS2FS POSIX_ACL选项。

1255 config JFFS2_FS_POSIX_ACL
1256 bool"JFFS2 POSIX Access Control Lists"
1257 depends on JFFS2_FS_XATTR
1258 default y
1259 select FS_POSTX_ACL
1260 help
1261 posix Access Control Lists(ACLs)support permissions for users and
1262 groups beyond the owner/group/world scheme.
1263
1264 To learn more about Access Control Lists,visit the Posix ACLs for
1265 Linux website <http://acl,bestbits.at/>.
1266
1267 If you don't know what Access Control Lists are,say N
1268

代码中包含了几乎所有的元素,下面一一说明。

第1255行中,config是关键字,表示一个配置选项的开始:紧跟着的JFFS2_FS POSIXACL是配置选项的名称,省略了前缀“CONFIG_”。

第1256行中,boot表示变量类型,即CONFIG_JFFS2_FS_POSIX_ACL的类型。有5种类型:bool、tristate、string、hex和int,其中的tristate和string是基本的类型,其他类型是它们的变种。boot变量取值有两种:y和n;tristate变量取值有3种:y、n和m;string变量取值为字符串:hex变量取值为十六进制的数据;int变量取值为十进制的数据。

“boot”之后的字符串是提示信息,在配置界面中上下移动光标选中它时,就可以通过按空格或回车键来设置CONFIGJFFS2_FSPOSIXACL的值。提示信息的完整格式如下,如果使用“if <expr>”,则当expr为真时才显示提示信息。在实际使用时,prompt 关键字可以省略。

"prompt"<prompt>["if"<expr>]

第1257行表示依赖关系,格式如下。只有JFFS2_FSXATTR配置选项被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项。注意,如果依赖条件不满足,则它取默认值。

"depends on"/"requires"<expr>

第1258行的表示默认值为y,格式如下:

"default"<expr>["if"<expr>]

第1259行表示当前配置选项FFS2FSPOSIX_ACL被选中时,配置选项FS_POSIXACL也会被自动选中,格式如下:

"select"<symbo1>["if"<expr>]

第1260行表示下面几行是帮助信息,帮助信息的关键字有如下两种,它们完全一样。当遇到一行的缩进距离比第一行帮助信息的缩进距离小时,表示帮助信息已经结束。比如第1268行的缩进距离比第126的缩进距离小,帮助信息到第1267行结束。

“help"or"---help---"

注意除第1255行的关键字及配置选项的名称、第256行的变量类型外,其他信息都是可以省略的。

2.menu条目

menu条目用于生成菜单,格式如下:

"menu"<prompt>
<menu options>
<menu block>
"endmenu"

它的实际使用并不如它的标准格式那样复杂,下面是一个例子。

menu"Floating point emulation"
config FPE_NWFPE
...
config FPE_NWEPE_XP
...
endmenu 

menu之后的字符串是菜单名,“menu”和“endmenu”之间有很多config条目。在配置界面上会出现如下字样的菜单,移动光标选中它后按回车键进入,就会看到这些config条目定义的配置选项。

Floating point emulation--->

3.choice条目

choice条目将多个类似的配置选项组合在一起,供用户单选或多选,格式如下:

"choice"
<choice options>
<choice block>
"endchoice"

实际使用中,也是在“choice”和“endchoice”之间定义多个config条目,比如arch/arm/Kconfig中有如下代码:

choice prompt"ARM system type"default ARCH_VERSATILE
config ARCH_AAEC2000
...
config ARCH_INTEGRATOR
...
endchoice 

prompt"ARM system type”给出提示信息“ARM system type”,光标选中它后按回车键进入,就可以看到多个config条日定义的配置选项。

choice条目中定义的变量类型只能有两种:bool和ristate,不能同时有这两种类型的变量。对于bool类型的choice条日,只能在多个选项中选择一个:对于tristate类型的choice条目,要么就把多个(可以是一个)选项都设为m;要么就像bool类型的choice条目一样,只能选择一个。这是可以理解的,比如对于同一个硬件,它有多个驱动程序,可以选择将其中之一编译进内核中(配置选项设为y),或者把它们都编译为模块(配置选项设为m)。

4.comment条目

comment条目用于定义一些帮助信息,它在配置过程中出现在界面的第一行;并且这些帮助信息会出现在配置文件中(作为注释),格式如下:

"comment"<prompt>
<comment options>

实际使用中也很简单,比如arch/arm/Kconfig中有如下代码:

menu"Floating point emulation"
comment"At least one emulation must be selected"
...

进入菜单“Floating point emulation-->”之后,在第一行会看到如下内容:

-—-At least one emulation must be selected

而在.config文件中也会看到如下内容:

#At least one emulation must be selected

5.source条目

source条目用于读入另一个Kconfig文件,格式如下:

"source" <prompt>

下面是一个例子,取自arch/arm/Kconfig文件,它读入net/Kconfig文件。

source "net/Kconfig"

6.菜单形式的配置界面操作方法

配置界面的开始几行就是它的操作方法,如图16.4所示。

内核scripts/kconfig/mconfc文件的注释给出了更详细的操作方法,讲解如下。

一些特定功能的文件可以直接编译进内核中,或者编译成一个可加载模块,或者根本不使用它们。还有一些内核参数,必须给它们赋一个值:十进制数、十六进制数,或者一个字符串。配置界面中,以[*]、<M>或[]开头的选项表示相应功能的文件被编译进内核中、被编译成一个模块,或者没有使用。尖括号~表示相应功能的文件可以被编译成模块。

要修改配置选项,先使用方向键高亮选中它,按<Y>键选择将它编译进内核,按<M>键选择将它编译成模块,按-N>键将不使用它。也可以按空格键进行循环选择,例如:Y-N-M一Y。

上/下方向键用来高亮选中某个配置选项,如果要进入某个子菜单,先选中它,然后按回车键进入。配置选项的名字后有“>”表示它是一个子菜单。配置选项的名称中有一个高亮的字母,它被称为“热键”(hotkey),直接输入热键就可以选中该配置选项,或者循环选中具有相同热键的配置选项。

可以使用翻页键<PAGE UP>和<PAGE DOWN>来移动配置界面中的内容。要退出配置界面,使用左/右方向键选中<Exi心按钮,然后按回车键。如果没有配置选项使用后面这些按键作为热键的话,也可以按两次<ESC>键或<E><X>键退出。

按<TAB>键可以在<Select>、<Exit>和<Help>这3个按钮中循环选中它们。

要想阅读某个配置选项的帮助信息,选中它之后,再选中<Help>按钮,按回车键;也可以选中配置选项后,直接按<H>或<2>键。

对于choise条目中的多个配置选项,使用方向键高亮选中某个配置选项,按<S>或空格键选中它:也可以通过输入配置选项的首字母,然后按<S>或空格键选中它。

对于int、hex或string类型的配置选项,要输入它们的值时,先高亮选中它,按回车键,输入数据,再按回车键。对于十六进制数据,前缀0x可以省略。

配置界面的最下面,有如下两行:

Load an Alternate Configuration File
Save an Alternate Configuration File

前者用于加载某个配置文件,后者用于将当前的配置保存到某个配置文件中去。需要注意的是,如果不使用这两个选项,配置的加载文件、输出文件都默认为.config文件;如果加载了其他的文件(假设文件名为A),然后在它的基础上进行修改,最后退出保存时,这些变动会保存到A中去,而不是.config。

当然,可以先加载(Load an Alternate Configuration File)文件A,然后修改,最后保存(Save an Alternate Configuration File)到.config中去。

Linux内核移植之二:Kconfig分析相关推荐

  1. 6410 linux内核移植

    linux内核移植(6410) linux内核移植一,硬件环境:友善之臂 tiny6410 开发板开发主机Linux系统:fedora 10 编译器:arm-linux-gcc-4.5.1 二,内核实 ...

  2. Linux系统移植:menuconfig 原理分析

    文章目录 Linux系统移植:menuconfig 原理分析 一.make menuconfig 执行过程 二.Kconfig 语法 2.1 mainmenu 菜单 2.2 调用其他目录 Kconfi ...

  3. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  4. 支持v4l2 linux内核选项 s3c2440,linux内核移植-移植2.6.35.4内核到s3c2440

    原标题:linux内核移植-移植2.6.35.4内核到s3c2440 硬件平台:FL2440 主机平台:Ubuntu 11.04 交叉编译器: - -gcc 4.3.2 原创作品,转载请标明出处htt ...

  5. Linux内核IP Queue机制的分析(一)

    将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析.三篇文章的题目分别是: Linux内核IP Queue机制的分析(一)--用户态接收数据包 Linu ...

  6. linux收发包内核进程名称,Linux内核IP Queue机制的分析(一)——用户态接收数据包...

    序 笔者将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析.三篇文章的题目分别是: Linux内核IP Queue机制的分析(一)­--用户态接收数据包 ...

  7. Linux内核移植和根文件系统制作(详细步骤精讲)

    第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的选择 1.2 Linux内核启 ...

  8. uboot和Linux内核移植

    这篇文章是一个读者昨晚发给我的,文章很长,里面的细节也比较多,但是微信公众号只能发 50000 字的文章,如果想阅读全文. 请发送「 uboot和Linux内核移植 」到公众号后台获取下载链接. 这篇 ...

  9. linux移植会话层层协议,Linux内核移植-南京林业大学毕业设计.DOC

    Linux内核移植-南京林业大学毕业设计 南京林业大学 本科毕业设计(论文) 题 目:嵌入式LINUX在ARM9系统中的移植 院 (系) 信息与科学技术学院 专 业 计算机科学与技术 学 生 谢监荣 ...

最新文章

  1. 怎么把视频里的音乐提取出来
  2. Linux安装weblogic方式,Linux下weblogic安装图解
  3. c++大作业迷宫游戏 规定时间内完成_小学生做作业磨蹭的7个原因及对策!太准了~...
  4. arrylist和linked list区别
  5. LGBM模型取消打印日志(关闭日志)
  6. python3生成文件对象(五分钟读懂)
  7. eclipse中文教程
  8. Photoshop使用教程 如何在线抠图
  9. c++ 运算符重载(简单易懂)
  10. Intel IoT Roadshow 北京站活动感想
  11. 散点图矩阵 pd.plotting.scatter_matrix
  12. 算法-枚举法-已知xyz + yzz = 532,其中x、y、z都是数字(0~9),编写一个程序求出x、y、z分别代表什么数字。
  13. 意外收获:如何将中文转成拼音
  14. 为什么电子邮件的账号地址公司是统一的,电子邮件地址该怎么写?
  15. 地图坐标系之间的转换(百度地图、GCJ、WGS84)
  16. Linux常用命令——sh命令
  17. pyecharts geo绘制地理信息地图
  18. Auto.js视频笔记
  19. C/C++对汉字的读取
  20. 优橙教育内推岗位—5G网络优化工程

热门文章

  1. python手机连续点击脚本_selenium+python自动化86-循环点击遇到的坑
  2. 600 imp oracle_oracle中exp,imp的使用详解
  3. 插入的表单控制下拉框怎么设置_想要告别表单重复填写?这一个功能就够了
  4. 脸书员工都在VR上工作了,你还等什么?
  5. python中词云图是用来描述_Python制作词云图代码实例
  6. 评审关上了你CVPR的门?这还有Rebuttal的窗,7个小技巧送上
  7. SIGGRAPH最佳博士论文奖又落华人手中,胡渊鸣的这位师兄不一般
  8. 对话英特尔研究院院长:量子计算是马拉松,现在大家(包括谷歌)刚跑出第一英里...
  9. Laravel 5.6 中文文档翻译完成,译者 60 人,耗时 10 天
  10. 【Django】创建项目及框架介绍,学习笔记(一)