新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 关于Linux 内核配置系统浅析

关于Linux 内核配置系统浅析

作者:时间:2012-08-29来源:网络收藏

前面说过,每个变量取值范围是:y,n,m 和空,obj-$(CONFIG_TC) 分别对应着 obj-y,obj-n,obj-m,obj-。如果 CONFIG_TC 为 y,那么 tc.o 就进入了 obj-y 列表。obj-y 为包含到 vmlinux 中的目标文件列表;obj-m 为编译成模块的目标文件列表;obj-n 和 obj- 中的文件列表被忽略。就根据这些列表的属性进行编译和链接。

export-objs 中的目标文件都使用了 EXPORT_SYMBOL() 定义了公共的符号,以便可装载模块使用。在 tc.c 文件的最后部分,有 EXPORT_SYMBOL(search_tc_card);,表明 tc.o 有符号输出。

这里需要指出的是,对于编译目标的定义,存在着两种格式,分别是老式定义和新式定义。老式定义就是前面 Rules.make 使用的那些变量,新式定义就是 obj-y,obj-m,obj-n 和 obj-。 推荐使用新式定义,不过由于 Rules.make 不理解新式定义,需要在 Makefile 中的适配段将其转换成老式定义。

c) 适配段

适配段的作用是将新式定义转换成老式定义。在上面的例子中,适配段就是将 obj-y 和 obj-m 转换成 Rules.make 能够理解的 L_TARGET,L_OBJS,LX_OBJS,M_OBJS,MX_OBJS。

L_OBJS := $(sort $(filter-out $(export-objs), $(obj-y))) 定义了 L_OBJS 的生成方式:在 obj-y 的列表中过滤掉 export-objs(tc.o),然后排序并去除重复的文件名。这里使用到了 GNU Make 的一些特殊功能,具体的含义可参考 Make 的文档(info make)。

d) include $(TOPDIR)/Rules.make

3. 配置文件

3.1 配置功能概述

除了 Makefile 的编写,另外一个重要的工作就是把新功能加入到 的配置选项中,提供此项功能的说明,让用户有机会选择此项功能。所有的这些都需要在 config.in 文件中用配置语言来编写配置脚本,

在 Linux 中,配置命令有多种方式:

配置命令 解释脚本

Make config, make oldconfig scripts/Configure

Make menuconfig scripts/Menuconfig

Make xconfig scripts/tkparse

以字符界面配置(make config)为例,顶层 Makefile 调用 scripts/Configure, 按照 arch/arm/config.in 来进行配置。命令执行完后产生文件 .config,其中保存着配置信息。下一次再做 make config 将产生新的 .config 文件,原 .config 被改名为 .config.old

3.2 配置语言

1) 顶层菜单

mainmenu_name /prompt/ /prompt/ 是用'或包围的字符串,'与的区别是'…'中可使用$引用变量的值。mainmenu_nAME 设置最高层菜单的名字,它只在 make xconfig 时才会显示。

2) 询问语句

bool /prompt/ /symbol/

hex /prompt/ /symbol/ /word/

int /prompt/ /symbol/ /word/

string /prompt/ /symbol/ /word/

tristate /prompt/ /symbol/

询问语句首先显示一串提示符 /prompt/,等待用户输入,并把输入的结果赋给 /symbol/ 所代表的配置变量。不同的询问语句的区别在于它们接受的输入数据类型不同,比如 bool 接受布尔类型( y 或 n ),hex 接受 16 进制数据。有些询问语句还有第三个参数 /word/,用来给出缺省值。

3) 定义语句

define_bool /symbol/ /word/

define_hex /symbol/ /word/

define_int /symbol/ /word/

define_string /symbol/ /word/

define_tristate /symbol/ /word/

不同于询问语句等待用户输入,定义语句显式的给配置变量 /symbol/ 赋值 /word/。

4) 依赖语句

dep_bool /prompt/ /symbol/ /dep/ ...

dep_mbool /prompt/ /symbol/ /dep/ ...

dep_hex /prompt/ /symbol/ /word/ /dep/ ...

dep_int /prompt/ /symbol/ /word/ /dep/ ...

dep_string /prompt/ /symbol/ /word/ /dep/ ...

dep_tristate /prompt/ /symbol/ /dep/ ...

与询问语句类似,依赖语句也是定义新的配置变量。不同的是,配置变量/symbol/的取值范围将依赖于配置变量列表/dep/ …。这就意味着:被定义的配置变量所对应功能的取舍取决于依赖列表所对应功能的选择。以dep_bool为例,如果/dep/ …列表的所有配置变量都取值y,则显示/prompt/,用户可输入任意的值给配置变量/symbol/,但是只要有一个配置变量的取值为n,则/symbol/被强制成n。

不同依赖语句的区别在于它们由依赖条件所产生的取值范围不同。

5) 选择语句

choice /prompt/ /word/ /word/

choice 语句首先给出一串选择列表,供用户选择其中一种。比如 Linux for ARM 支持多种基于 ARM core 的 CPU,Linux 使用 choice 语句提供一个 CPU 列表,供用户选择:

choice 'ARM system type'

Anakin CONFIG_ARCH_ANAKIN

Archimedes/A5000 CONFIG_ARCH_ARCA5K

Cirrus-CL-PS7500FE CONFIG_ARCH_CLPS7500

……

SA1100-based CONFIG_ARCH_SA1100

Shark CONFIG_ARCH_SHARK RiscPC

Choice 首先显示 /prompt/,然后将 /word/ 分解成前后两个部分,前部分为对应选择的提示符,后部分是对应选择的配置变量。用户选择的配置变量为 y,其余的都为 n。

6) if语句

if [ /expr/ ] then

/statement/

...

fi

if [ /expr/ ] then

/statement/

...

else

/statement/

...

fi

if 语句对配置变量(或配置变量的组合)进行判断,并作出不同的处理。判断条件 /expr/ 可以是单个配置变量或字符串,也可以是带操作符的表达式。操作符有:=,!=,-o,-a 等。

7) 菜单块(menu block)语句

mainmenu_option next_comment

comment '…..'

endmenu

引入新的菜单。在向内核增加新的功能后,需要相应的增加新的菜单,并在新菜单下给出此项功能的配置选项。Comment 后带的注释就是新菜单的名称。所有归属于此菜单的配置选项语句都写在 comment 和 endmenu 之间。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭