您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术Linux 内核中的配置系统结构分析 正文
Linux 内核中的配置系统结构分析

Linux 内核中的配置系统结构分析

点击数:7389 次   录入时间:03-04 11:56:25   整理:http://www.55dianzi.com   嵌入式系统-技术

    ......

    CROSS_COMPILE 定义了交叉编译器前缀 arm-linux-,表明所有的交叉编译工具都是以 arm-linux- 开头的,所以在各个交叉编译器工具之前,都加入了 $(CROSS_COMPILE),以组成一个完整的交叉编译工具文件名,比如 arm-linux-gcc。

    CFLAGS 定义了传递给 C 编译器的参数。

    LINKFLAGS 是链接生成 vmlinux 时,由链接器使用的参数。LINKFLAGS 在 arm/*/Makefile 中定义,比如:

    # arch/arm/Makefile

    LINKFLAGS :=-p -X -T arch/arm/vmlinux.lds

    6) 配置变量CONFIG_*

    .config 文件中有许多的配置变量等式,用来说明用户配置的结果。例如 CONFIG_MODULES=y 表明用户选择了 Linux 内核的模块功能。

    .config 被顶层 Makefile 包含后,就形成许多的配置变量,每个配置变量具有确定的值:y 表示本编译选项对应的内核代码被静态编译进 Linux 内核;m 表示本编译选项对应的内核代码被编译成模块;n 表示不选择此编译选项;如果根本就没有选择,那么配置变量的值为空。

    2.3 Rules.make 变量

    前面讲过,Rules.make 是编译规则文件,所有的 Makefile 中都会包括 Rules.make。Rules.make 文件定义了许多变量,最为重要是那些编译、链接列表变量。

    O_OBJS,L_OBJS,OX_OBJS,LX_OBJS:本目录下需要编译进 Linux 内核 vmlinux 的目标文件列表,其中 OX_OBJS 和 LX_OBJS 中的 "X" 表明目标文件使用了 EXPORT_SYMBOL 输出符号。

    M_OBJS,MX_OBJS:本目录下需要被编译成可装载模块的目标文件列表。同样,MX_OBJS 中的 "X" 表明目标文件使用了 EXPORT_SYMBOL 输出符号。

    O_TARGET,L_TARGET:每个子目录下都有一个 O_TARGET 或 L_TARGET,Rules.make 首先从源代码编译生成 O_OBJS 和 OX_OBJS 中所有的目标文件,然后使用 $(LD) -r 把它们链接成一个 O_TARGET 或 L_TARGET。O_TARGET 以 .o 结尾,而 L_TARGET 以 .a 结尾。

    2.4 子目录 Makefile

    子目录 Makefile 用来控制本级目录以下源代码的编译规则。我们通过一个例子来讲解子目录 Makefile 的组成:

    #

    # Makefile for the linux kernel.

    #

    # All of the (potenTIal) objects that export symbols.

    # This list comes from 'grep -l EXPORT_SYMBOL *.[hc]'.

    export-objs := tc.o

    # Object file lists.

    obj-y :=

    obj-m :=

    obj-n :=

    obj- :=

    obj-$(CONFIG_TC) += tc.o

    obj-$(CONFIG_ZS) += zs.o

    obj-$(CONFIG_VT) += lk201.o lk201-map.o lk201-remap.o

    # Files that are both resident and modular: remove from modular.

    obj-m := $(fiLTEr-out $(obj-y), $(obj-m))

    # Translate to Rules.make lists.

    L_TARGET := tc.a

    L_OBJS := $(sort $(filter-out $(export-objs), $(obj-y)))

    LX_OBJS := $(sort $(filter $(export-objs), $(obj-y)))

    M_OBJS := $(sort $(filter-out $(export-objs), $(obj-m)))

    MX_OBJS := $(sort $(filter $(export-objs), $(obj-m)))

    include $(TOPDIR)/Rules.make

    a) 注释

    对 Makefile 的说明和解释,由#开始。

    b) 编译目标定义

    类似于 obj-$(CONFIG_TC) += tc.o 的语句是用来定义编译的目标,是子目录 Makefile 中最重要的部分。编译目标定义那些在本子目录下,需要编译到 Linux 内核中的目标文件列表。为了只在用户选择了此功能后才编译,所有的目标定义都融合了对配置变量的判断。



www.55dianzi.com

    前面说过,每个配置变量取值范围是:y,n,m 和空,obj-$(CONFIG_TC) 分别对应着 obj-y,obj-n,obj-m,obj-。如果 CONFIG_TC 配置为 y,那么 tc.o 就进入了 obj-y 列表。obj-y 为包含到 Linux 内核 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-。Linux 内核推荐使用新式定义,不过由于 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 的编写,另外一个重要的工作就是把新功能加入到 Linux 的配置选项中,提供此项功能的说明,让用户有机会选择此项功能。所有的这些都需要在 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 列表,供用户选择:

上一页  [1] [2] [3]  下一页


本文关键字:Linux  嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术