写南京的诗词:Linux Kbuild文档
来源:百度文库 编辑:中财网 时间:2024/05/09 14:53:34
V 0.1
tanggeliang@dvnchina.com
2008-10-30
目录
Linux内核配置方式 3
1.1 概述 3
1.2 内核配置工具 3
1.3 内核配置方式 4
2. Kconfig 5
2.1 Kconfig的树状关系 5
2.2菜单选项 5
2.3菜单属性 6
2.4菜单依赖关系 6
2.5菜单结构 7
2.6 Kconfig语法 8
3. Kbuild Makefile 8
3.1 Makefile的组织结构 8
3.2 Makefile语言 9
3.3 Kbuild 变量 9
3.4 Kbuild Makefile的定义 10
4. 一个使用linux kbuild实现可配置编译的例子 13
4.1 运行print 14
4.2 实现print 15
参考文献 18
Linux内核配置方式1.1 概述Linux内核源代码组织了一个配置系统,该配置系统可以生成内核配置菜单,方便内核配置。配置系统主要包含Makefile、Kconfig和配置工具,可以生成配置界面。其中,配置界面是通过配置工具来生成的,配置工具通过Makefile编译执行,配置界面中的选项则是通过各级的Kconfig(老版本也称Config.in)和Makefile(老版本也称Kbuild)文件定义。
Linux内核配置系统也被移植到其它软件(如Busybox、glibc、uclibc等)中,来提供同样的配置界面以方便有选择性的配置。
1.2 内核配置工具Linux内核配置命令主要有:make config、make menuconfig、make xconfig和make gconfig,分别是字符界面、ncurses光标菜单、QT图形窗口和GTK图形窗口的配置界面。字符界面配置方式需要回答每一个选项提示,逐个回答进行配置并不方便,而光标和图形配置界面界面友好,方便实用。
make config是完全命令行的配置方式,make menuconfig依赖于ncurses库,make xconfig依赖于QT图形库,make gconfig依赖于GTK图形库。
不同的内核配置方式,分别通过不同的配置工具来完成。scripts目录下提供了各种内核配置工具,表1是这些工具的说明。
表1 内核配置工具说明
配置工具
Makefile相关目标
依赖的程序
conf
config defconfig oldconfig …
conf.c、zconf.tab.c
mconf
menuconfig
mconf.c、zconf.tab.c
qconf
xconfig
qconf.c、kconfig_load.c、zconf.tab.c
gconf
gconfig
gconf.c、kconfig_load.c、zconf.tab.c
其中zconf.tab.c程序实现了解析Kconfig文件和内核配置主要函数。Zconf.tab.c程序还直接包括了下列一些C程序,这样各种配置功能都包含在zconf.tab.o目标文件中了。
其中,lex.zconf.c实现lex语法解析器,
util.c实现配置工具,
confdata.c实现.config等相关数据文件保存,
expr.c实现表达式函数,
symbol.c实现变量处理函数,
menu.c实现菜单控制函数。
1.3 内核配置方式在顶层的Makefile中,可以查找到如下几行定义的规则:
这就是生成内核配置界面的命令规则,它也定义了执行的目标和依赖的前提条件,还有要执行的命令。这条规则定义的目标为config %config,通配符%意味着可以包括config、menuconfig、xconfig、gconfig等。依赖的前提条件是scripts_basic outputmakefile,这些在Makefile中也是规则定义,主要用来编译生成配置工具。这条规则执行的命令就是执行scripts/kconfig/Makefile制定的规则。
根据配置工具的不同,内核有不同的配置方式。有命令行方式,还有图形界面方式。表2是各种内核配置方法的说明。
表2 内核配置方法的说明
配置方法
功能
config
通过命令行程序更新当前配置
menuconfig
通过菜单程序更新当前配置
xconfig
通过QT图形界面更新当前配置
gconfig
通过GTK图形界面更新当前配置
oldconfig
通过已经提供的.config文件更新当前配置
Randconfig
对所有的选项随机配置
Defconfig
对所有的选项缺省配置
allmodconfig
对所有的选项尽可能选择“m”
allyesconfig
对所有的选项尽可能选择“y”
allnoconfig
对所有的选项尽可能选择“n”的最小配置
这些内核配置方式是在scripts/kconfig/Makefile中通过规则定义的。从这个Makefile中,可以找到下面一些规则定义。如果把变量或者通配符带进去,就可以明白要执行的操作。
这里的ARCH以arm为例来说明。
执行命令:scripts/kconfig/qconf arch/arm/Kconfig,使用QT图形库生成配置界面,arch/arm/Kconfig是菜单的主配置文件,每种配置方式都需要。
执行命令:scripts/kconfig/qconf arch/arm/Kconfig,使用GTK图形库生成配置界面。
执行命令:scripts/kconfig/mconf arch/arm/Kconfig,使用lxdialog工具,生成光标配置菜单。
执行命令:scripts/kconfig/conf (-o/s) arch/arm/Kconfig,完全命令行的内核配置方式。使用“-o”选项,直接读取已经存在的.config文件,要求确定内核新的配置项。使用“-s”选项,直接读取已经存在的.config文件,提示但不要求确认内核新的配置项。
通过上述各种方式都可以完成配置内核的工作,在顶层目录下生成.config文件。这个.config文件保存大量的内核配置项,.config会自动转换成include/linux/autoconf.h头文件。在include/linux/config.h文件中,将包含使用include/linux/autoconf.h头文件。
2. Kconfiglinux在2.6版本以后将配置文件由原来的config.in改为Kconfig,对于Kconfig的语法在内核源代码/Documentation/kbuild/kconfig-language.txt中做了详细的说明。
2.1 Kconfig的树状关系Kconfig的配置选项是以树的形式组织的,如下所示所示:
每个选项都有其自己的依赖关系。这些依赖关系决定了选项是否是可见的。父选项可见,子选项才能可见。
arch/$(ARCH)/Kconfig文件是主Kconfig文件,跟体系结构有关系。主Kconfig文件调用其他目录的Kconfig文件,其他的Kconfig文件又调用各级子目录的配置文件,成树状关系。
2.2菜单选项多数选项定义了一个配置选项,其它选项起辅助组织作用。一个配置选项定义可以是下面的形式:
每行都是以关键字开始,并可以接多个参数。"config" 为定义了一新的配置选项。下面的几行定义了该配置选项的属性。属性可以是该配置选项的类型,输入提示(input prompt),依赖关系,帮助信息和默认值。一个配置选项可以用相同的名字定义多次,但每个定义只能有一个输入提示并且类型还不能冲突。
2.3菜单属性一个菜单选项可以有多个属性,这些属性受到语法的限制。每个配置选项都必须指定类型。类型定义包括:"bool"、"tristate"、"string"、"hex"、"int"共五种。其中有两个基本类型:tristate 和 string,其他类型都是基于这两个基本类型。内核菜单属性说明表3所示。
表3 内核菜单属性说明
属性
语法
说明
输入提示
"prompt"
["if"]
每个菜单选项最多只能有一个显示给用户的输入提示。可以用"if" 来表示该提示的依赖关系,当然这是可选的。
默认值
"default"
["if"]
一个配置选项可以有任意多个默认值。如果有多个默认值,那么只有第一个被定义的值是可用的。默认值并不是只限于应用在定义他们的菜单选项。这就意味着默认值可以定义在任何地方或被更早的定义覆盖。如果用户没有设置(通过上面的输入提示),配置选项的值就是默认值。如果可以显示输入提示的话,就会把默认值显示给用户,并可以让用户进行修改。默认值的依赖关系可以用 "if" 添加。
依赖关系
"depends on"
/"requires"
为一菜单选项定义依赖关系。如果定义了多个依赖关系,它们之间用 '&&' 间隔。依赖关系也可以应用到该菜单中所有的其它选项(同样接受一if表达式)。
反向依赖关系
"select"
["if"]
尽管普通的依赖关系可以降低一选项的上限,反向依赖能将这一限制降的更低。当前菜单选项的值是symbol的最小值。如果symbol被选择了多次,上限就是其中的最大值。反向依赖只能用在 boolean 或 tristate 选项上。
数据范围
"range"
["if"]
为int和hex类型的选项设置可以接受输入值范围。用户只能输入大于等于第一个symbol,小于等于第二个symbol的值。
帮助信息
"help"
or
"---help---"
定义一帮助信息。帮助信息的结束就由缩进的水平决定的,这也就意味着信息是在第一个比帮助信息开始行的缩进小的行结束。"---help---" 和 "help" 在实现的作用上没有区别,"---help---" 有助于将文件中的配置逻辑与给开发人员的提示分开。
2.4菜单依赖关系依赖关系决定了菜单选项是否可见,也可以减少tristate的输入范围。tristate逻辑比boolean逻辑在表达式中用更多的状态(state)来表示模块的状态。依赖关系表达式的语法如表4所示,表达式是以优先级的降序列出的。
表4 菜单依赖关系语法说明
表达式
结果说明
::=
将symbol赋给表达式。boolean和tristate类型的symbol直接赋给表达式。所有其它类型的symbol都赋 'n'。
'='
如果两个symbol相等,返回'y',否则为'n'。
'!='
如果两个symbol相等,返回'n',否则为'y'。
'(' ')'
返回表达式的值。用于改变优先级。
'!'
返回 (2-/expr/) 的结果。
'&&'
返回 min(/expr/,/expr/) 的结果。
'||'
返回 max(/expr/,/expr/) 的结果。
一个表达式的值可以是'n','m'或'y'(或者是计算的结果 0,1,2)。当表达式的值为'm'或'y'的时候,菜单项才是可见的。
symbol有两种类型:不可变的和可变的。不可变的symbol是最普通的,由'config'语句定义,完全由数字、字母和下划线组成(alphanumeric characters or underscores)。
不可变的symbol只是表达式的一部分。经常用单引号或双引号括起来。在引号中,可以使用任何字符,使用引号要用转义字符'\'。
2.5菜单结构菜单在树中的位置可由两种方法决定。
第一种可以是这样:
所有的在"menu" ... "endmenu" 之间都是"Network device support"的子菜单。所有的子菜单选项都继承了父菜单的依赖关系,比如,"NET"的依赖关系就被加到了配置选项NETDEVICES的依赖列表中。
第二种是通过分析依赖关系生成菜单的结构。如果菜单选项在一定程度上依赖于前面的选项,它就能成为该选项的子菜单。首先,前面的(父)选项必须是依赖列表中的一部分并且它们中必须有满足下面两个条件的选项:如果父选项为'n',子选项必须不可见;如果父选项可见,子选项才能可见。
MODVERSIONS 直接依赖 MODULES,这就意味着如果MODULES不为'n',该选项才可见。换句话说,当MODULES可见时,选项才可见(MODULES的(空)依赖关系也是选项依赖关系的一部分)。
2.6 Kconfig语法配置文件描述了菜单选项,每行都是以一关键字开头(除了帮助信息)。菜单的关键字如表5所示。其中菜单开头的关键字有:config、menuconfig、choice/endchoice、comment、menu/endmenu。它们也可以结束一个菜单选项,另外还有if/endif、source也可以结束菜单选项。
表5 Kconfig菜单关键字说明
关键字
语法
说明
config
"config"
定义了一配置选项 并且可以接受任何前面介绍的属性。
menuconfig
"menuconfig"
此关键字和前面的关键字很相似,但它在前面的基础上要求所有的子选项作为独立的行显示。
choices
"choice"
"endchoice"
该关键字定义了一组选择项,并且选项可以是前面描述的任何属性。尽管boolean只允许选择一个配置选项,tristate可以抒多个配置选项设为'm',但选项只能是boolean或tristate类型。这可以在一个硬件有多个驱动的情况下使用,最终只有一个驱动被编译进/加载到内核,,但所有的驱动都可以编译成模块。选项可以接受的另一个选项是"optional",这样选项就被设置为'n',没有被选中的。
comment
"comment"
这定义了在配置过程中显示给用户的注释,该注释还将写进输出文件中。唯一可用的可选项是依赖关系。
menu
"menu"
tanggeliang@dvnchina.com
2008-10-30
目录
Linux内核配置方式 3
1.1 概述 3
1.2 内核配置工具 3
1.3 内核配置方式 4
2. Kconfig 5
2.1 Kconfig的树状关系 5
2.2菜单选项 5
2.3菜单属性 6
2.4菜单依赖关系 6
2.5菜单结构 7
2.6 Kconfig语法 8
3. Kbuild Makefile 8
3.1 Makefile的组织结构 8
3.2 Makefile语言 9
3.3 Kbuild 变量 9
3.4 Kbuild Makefile的定义 10
4. 一个使用linux kbuild实现可配置编译的例子 13
4.1 运行print 14
4.2 实现print 15
参考文献 18
Linux内核配置方式1.1 概述Linux内核源代码组织了一个配置系统,该配置系统可以生成内核配置菜单,方便内核配置。配置系统主要包含Makefile、Kconfig和配置工具,可以生成配置界面。其中,配置界面是通过配置工具来生成的,配置工具通过Makefile编译执行,配置界面中的选项则是通过各级的Kconfig(老版本也称Config.in)和Makefile(老版本也称Kbuild)文件定义。
Linux内核配置系统也被移植到其它软件(如Busybox、glibc、uclibc等)中,来提供同样的配置界面以方便有选择性的配置。
1.2 内核配置工具Linux内核配置命令主要有:make config、make menuconfig、make xconfig和make gconfig,分别是字符界面、ncurses光标菜单、QT图形窗口和GTK图形窗口的配置界面。字符界面配置方式需要回答每一个选项提示,逐个回答进行配置并不方便,而光标和图形配置界面界面友好,方便实用。
make config是完全命令行的配置方式,make menuconfig依赖于ncurses库,make xconfig依赖于QT图形库,make gconfig依赖于GTK图形库。
不同的内核配置方式,分别通过不同的配置工具来完成。scripts目录下提供了各种内核配置工具,表1是这些工具的说明。
表1 内核配置工具说明
配置工具
Makefile相关目标
依赖的程序
conf
config defconfig oldconfig …
conf.c、zconf.tab.c
mconf
menuconfig
mconf.c、zconf.tab.c
qconf
xconfig
qconf.c、kconfig_load.c、zconf.tab.c
gconf
gconfig
gconf.c、kconfig_load.c、zconf.tab.c
其中zconf.tab.c程序实现了解析Kconfig文件和内核配置主要函数。Zconf.tab.c程序还直接包括了下列一些C程序,这样各种配置功能都包含在zconf.tab.o目标文件中了。
其中,lex.zconf.c实现lex语法解析器,
util.c实现配置工具,
confdata.c实现.config等相关数据文件保存,
expr.c实现表达式函数,
symbol.c实现变量处理函数,
menu.c实现菜单控制函数。
1.3 内核配置方式在顶层的Makefile中,可以查找到如下几行定义的规则:
这就是生成内核配置界面的命令规则,它也定义了执行的目标和依赖的前提条件,还有要执行的命令。这条规则定义的目标为config %config,通配符%意味着可以包括config、menuconfig、xconfig、gconfig等。依赖的前提条件是scripts_basic outputmakefile,这些在Makefile中也是规则定义,主要用来编译生成配置工具。这条规则执行的命令就是执行scripts/kconfig/Makefile制定的规则。
根据配置工具的不同,内核有不同的配置方式。有命令行方式,还有图形界面方式。表2是各种内核配置方法的说明。
表2 内核配置方法的说明
配置方法
功能
config
通过命令行程序更新当前配置
menuconfig
通过菜单程序更新当前配置
xconfig
通过QT图形界面更新当前配置
gconfig
通过GTK图形界面更新当前配置
oldconfig
通过已经提供的.config文件更新当前配置
Randconfig
对所有的选项随机配置
Defconfig
对所有的选项缺省配置
allmodconfig
对所有的选项尽可能选择“m”
allyesconfig
对所有的选项尽可能选择“y”
allnoconfig
对所有的选项尽可能选择“n”的最小配置
这些内核配置方式是在scripts/kconfig/Makefile中通过规则定义的。从这个Makefile中,可以找到下面一些规则定义。如果把变量或者通配符带进去,就可以明白要执行的操作。
这里的ARCH以arm为例来说明。
执行命令:scripts/kconfig/qconf arch/arm/Kconfig,使用QT图形库生成配置界面,arch/arm/Kconfig是菜单的主配置文件,每种配置方式都需要。
执行命令:scripts/kconfig/qconf arch/arm/Kconfig,使用GTK图形库生成配置界面。
执行命令:scripts/kconfig/mconf arch/arm/Kconfig,使用lxdialog工具,生成光标配置菜单。
执行命令:scripts/kconfig/conf (-o/s) arch/arm/Kconfig,完全命令行的内核配置方式。使用“-o”选项,直接读取已经存在的.config文件,要求确定内核新的配置项。使用“-s”选项,直接读取已经存在的.config文件,提示但不要求确认内核新的配置项。
通过上述各种方式都可以完成配置内核的工作,在顶层目录下生成.config文件。这个.config文件保存大量的内核配置项,.config会自动转换成include/linux/autoconf.h头文件。在include/linux/config.h文件中,将包含使用include/linux/autoconf.h头文件。
2. Kconfiglinux在2.6版本以后将配置文件由原来的config.in改为Kconfig,对于Kconfig的语法在内核源代码/Documentation/kbuild/kconfig-language.txt中做了详细的说明。
2.1 Kconfig的树状关系Kconfig的配置选项是以树的形式组织的,如下所示所示:
每个选项都有其自己的依赖关系。这些依赖关系决定了选项是否是可见的。父选项可见,子选项才能可见。
arch/$(ARCH)/Kconfig文件是主Kconfig文件,跟体系结构有关系。主Kconfig文件调用其他目录的Kconfig文件,其他的Kconfig文件又调用各级子目录的配置文件,成树状关系。
2.2菜单选项多数选项定义了一个配置选项,其它选项起辅助组织作用。一个配置选项定义可以是下面的形式:
每行都是以关键字开始,并可以接多个参数。"config" 为定义了一新的配置选项。下面的几行定义了该配置选项的属性。属性可以是该配置选项的类型,输入提示(input prompt),依赖关系,帮助信息和默认值。一个配置选项可以用相同的名字定义多次,但每个定义只能有一个输入提示并且类型还不能冲突。
2.3菜单属性一个菜单选项可以有多个属性,这些属性受到语法的限制。每个配置选项都必须指定类型。类型定义包括:"bool"、"tristate"、"string"、"hex"、"int"共五种。其中有两个基本类型:tristate 和 string,其他类型都是基于这两个基本类型。内核菜单属性说明表3所示。
表3 内核菜单属性说明
属性
语法
说明
输入提示
"prompt"
["if"
每个菜单选项最多只能有一个显示给用户的输入提示。可以用"if" 来表示该提示的依赖关系,当然这是可选的。
默认值
"default"
["if"
一个配置选项可以有任意多个默认值。如果有多个默认值,那么只有第一个被定义的值是可用的。默认值并不是只限于应用在定义他们的菜单选项。这就意味着默认值可以定义在任何地方或被更早的定义覆盖。如果用户没有设置(通过上面的输入提示),配置选项的值就是默认值。如果可以显示输入提示的话,就会把默认值显示给用户,并可以让用户进行修改。默认值的依赖关系可以用 "if" 添加。
依赖关系
"depends on"
/"requires"
为一菜单选项定义依赖关系。如果定义了多个依赖关系,它们之间用 '&&' 间隔。依赖关系也可以应用到该菜单中所有的其它选项(同样接受一if表达式)。
反向依赖关系
"select"
["if"
尽管普通的依赖关系可以降低一选项的上限,反向依赖能将这一限制降的更低。当前菜单选项的值是symbol的最小值。如果symbol被选择了多次,上限就是其中的最大值。反向依赖只能用在 boolean 或 tristate 选项上。
数据范围
"range"
["if"
为int和hex类型的选项设置可以接受输入值范围。用户只能输入大于等于第一个symbol,小于等于第二个symbol的值。
帮助信息
"help"
or
"---help---"
定义一帮助信息。帮助信息的结束就由缩进的水平决定的,这也就意味着信息是在第一个比帮助信息开始行的缩进小的行结束。"---help---" 和 "help" 在实现的作用上没有区别,"---help---" 有助于将文件中的配置逻辑与给开发人员的提示分开。
2.4菜单依赖关系依赖关系决定了菜单选项是否可见,也可以减少tristate的输入范围。tristate逻辑比boolean逻辑在表达式中用更多的状态(state)来表示模块的状态。依赖关系表达式的语法如表4所示,表达式是以优先级的降序列出的。
表4 菜单依赖关系语法说明
表达式
结果说明
将symbol赋给表达式。boolean和tristate类型的symbol直接赋给表达式。所有其它类型的symbol都赋 'n'。
如果两个symbol相等,返回'y',否则为'n'。
如果两个symbol相等,返回'n',否则为'y'。
'('
返回表达式的值。用于改变优先级。
'!'
返回 (2-/expr/) 的结果。
返回 min(/expr/,/expr/) 的结果。
返回 max(/expr/,/expr/) 的结果。
一个表达式的值可以是'n','m'或'y'(或者是计算的结果 0,1,2)。当表达式的值为'm'或'y'的时候,菜单项才是可见的。
symbol有两种类型:不可变的和可变的。不可变的symbol是最普通的,由'config'语句定义,完全由数字、字母和下划线组成(alphanumeric characters or underscores)。
不可变的symbol只是表达式的一部分。经常用单引号或双引号括起来。在引号中,可以使用任何字符,使用引号要用转义字符'\'。
2.5菜单结构菜单在树中的位置可由两种方法决定。
第一种可以是这样:
所有的在"menu" ... "endmenu" 之间都是"Network device support"的子菜单。所有的子菜单选项都继承了父菜单的依赖关系,比如,"NET"的依赖关系就被加到了配置选项NETDEVICES的依赖列表中。
第二种是通过分析依赖关系生成菜单的结构。如果菜单选项在一定程度上依赖于前面的选项,它就能成为该选项的子菜单。首先,前面的(父)选项必须是依赖列表中的一部分并且它们中必须有满足下面两个条件的选项:如果父选项为'n',子选项必须不可见;如果父选项可见,子选项才能可见。
MODVERSIONS 直接依赖 MODULES,这就意味着如果MODULES不为'n',该选项才可见。换句话说,当MODULES可见时,选项才可见(MODULES的(空)依赖关系也是选项依赖关系的一部分)。
2.6 Kconfig语法配置文件描述了菜单选项,每行都是以一关键字开头(除了帮助信息)。菜单的关键字如表5所示。其中菜单开头的关键字有:config、menuconfig、choice/endchoice、comment、menu/endmenu。它们也可以结束一个菜单选项,另外还有if/endif、source也可以结束菜单选项。
表5 Kconfig菜单关键字说明
关键字
语法
说明
config
"config"
定义了一配置选项
menuconfig
"menuconfig"
此关键字和前面的关键字很相似,但它在前面的基础上要求所有的子选项作为独立的行显示。
choices
"choice"
"endchoice"
该关键字定义了一组选择项,并且选项可以是前面描述的任何属性。尽管boolean只允许选择一个配置选项,tristate可以抒多个配置选项设为'm',但选项只能是boolean或tristate类型。这可以在一个硬件有多个驱动的情况下使用,最终只有一个驱动被编译进/加载到内核,,但所有的驱动都可以编译成模块。选项可以接受的另一个选项是"optional",这样选项就被设置为'n',没有被选中的。
comment
"comment"
这定义了在配置过程中显示给用户的注释,该注释还将写进输出文件中。唯一可用的可选项是依赖关系。
menu
"menu"
linux 无法编辑文档
下载的linux下的驱动,不过解压后只有 后缀.c 和.h 的文件还有两个Kconfig和Kbuild文件,如何安装?
linux下数据库选择的文档
linux的文档和xp通用吗?
红旗LINUX的帮助文档在哪里????
如何把文本文档中的文件在linux下使用
急救!!! linux下我的文本文档打不开
Linux ? ? ? ? ? ?
linux~~~
Linux???
linux???
linux~~~~~~~~~~~~~~~~~`
为何word文档在了linux中不能正常显示中文
谁有没有在linux或者aix5.3上装weblogic的安装配置文档?
小弟初学Linux编程,请问Linux下有没有像MSDN那样的帮助文档,可以查找函数的用法的呢??
我刚用,请问如何使red hat linux 9.0在文档里支持中文?请详解!
<Red Hat linux 9 宝典> 北京哪有卖呀 价格多少呢?有RHEL4.0 宝典相关的么?有电子书文档么?
我下载了红旗Linux 5.0操作系统的安装方法文档,但是无论是用office2003 还是用WPS2005都无法打开?
什么是linux
linux问题
安装LINUX
Linux是什么意思?????
什么是Linux?
linux是什么?