您的位置:首页 > 运维架构 > Linux

linux内核Kconfig与Makefile文件分析

2014-09-12 13:18 726 查看
部分资料参考
http://user.qzone.qq.com/308337370/blog/1270156211
内核是个复杂庞大的系统,对它进行配置、裁剪、编译原本非常的复杂和困难,但现在我们却只需要简单的2个命令make menuconfig和make uImage就搞定了,原因是在其背后有一个设计精巧的内核构造系统帮我们精确完成了各项任务。内核构造系统最关键的组成元素就是各个目录下的Kconfig文件和Makefile文件,本文将对这2类文件进行介绍,以使大家了解内核构造系统的基本情况,从而能够修改他们,以完成向内核中添加功能组件的目的。

一、Kconfig文件

Kconfig文件的作用是:控制make menucofig时,出现的配置选项;并根据用户在配置界面中的选择,将配置结果保存在.config配置文件(该文件将供Makefile使用,以决定要编译的内核组件以及如何编译)。

主(初始)Kconfig文件是arch/arm/Kconfig(打开来看看吧!并试着改一改,看看当你make menuconfig的时候会出现什么样的变化)。

Kconfig文件的语法和语义,详情可查阅内核源码中的Documentation/kbuild/kconfig-language.txt文件。

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

config REISERFS_FS_POSIX_ACL

bool

prompt "ReiserFS POSIX Access Control List”

default y

depends on REISERFS_FS_XATTR

select FS_POSIX_ACL

help

Posix Access Control Lists (ACLs) support

If you don't know what Access Control Lists are, say N

上面的config条目,各个部分的含义是:

1) REISERFS_FS_POSIX_ACL为变量名,将在.config中以CONFIG_REISERFS_FS_POSIX_ACL=y或n的形式出现;

2) bool为变量取值的类型,可为y或n

3) prompt为出现在配置菜单中的文字,没有它,将使得用户不能在配置界面中显示并配置它

4) default为变量缺省值,可被用户设置值覆盖

5) depends on表示该变量必须在REISERFS_FS_XATTR被设置的情况下才能进行设置,否则取值为n,即使default为y

6) select表示它将影响到变量FS_POSIX_ACL,使得FS_POSIX_ACL至少应该配置为y或m(如果它最终取值为y或m)

7) help中的文字将作为配置界面中的帮助信息

附加说明:

1) 无depends on ,default 为y :默认为y。 一般用于必须要设置的选项,此时不要设置prompt

2) 有depends on ,default 为y :所依赖的条目已设置,则默认为y;所依赖的条目未设置,则为n

3) 有depends on ,default 为n :所依赖的条目已设置,则默认为n;所依赖的条目未设置,则为n

4) 无depends on ,default 为n :默认为n。在未设置prompt的情况下,此选项想要被设置,需要由其它选项来select它

2、Kconfig中变量的取值类型总共有5种。其中最常见的是tristate和bool,分别对应于配置界面中[ ]和< >选项

tristate:可取y、n、m

bool (其为tristate的变体) :可取y、n

string:取值为字符串,如:CONFIG_CMDLINE="root=/dev/hda1 ro init=/bin/bash c"

hex (其为string的变体) :取值为十六进制数据,如:CONFIG_VECTORS_BASE=0xffff0000 int (其为string的变体) :取值为十进制数据,
如:CONFIG_SPLIT_PTLOCK_CPUS=4096

3、Kconfig文件的要素:menu

在menu和endmenu中间可配置若干config条目;

体现在配置菜单上为 System type --->,按下该条目后,将出现各个config条目

4、Kconfig文件的要素:choice

在choice和endchoice之间可定义若干config条目; 体现在配置菜单上为 ARM system type --->,按下该条目后,将出现各个config条目;

choice中的config条目变量只能有2种类型:bool或tristate,且不能同时有这2种类型的变量。对 于bool型变量只能在多个选择中选择1个为y;对于tristate型变量要么将多个(当然也可以是1个)设为m,要么仅将1个设为y,其余为n。这好比一个硬件有多个驱动,要么选择1个编入内核,要么把多个全编为模块

5、Kconfig文件的要素:comment

用于定义帮助信息,将出现在配置界面的第一行;并且还会出现在配置文件.config中(作为注释)

6、Kconfig文件的要素:source

由于内核源代码中大多数目录下都有各自的Kconfig文件,因此需要一种手段将所有的Kconfig文件组织为一个整体。这就是source的功能,它用于引入另一个Kconfig文件,有点类似于C语言中的#include

二、.config文件

make menuconfig配置完成退出时,选择保存,则用户所作的选择将保存在内核源代码顶层目录的.config文件中。下面.config文件的片断显示内核配置者作了如下选择:将BLK_DEV_LOOP、CONFIG_BLK_DEV_RAM功能编译进zImage;不编译BLK_DEV_COW_COMMON、BLK_DEV_CRYPTOLOOP、BLK_DEV_UB功能;将BLK_DEV_NBD功能编译为模块。

484 #

485 # Block devices

486 #

487 # CONFIG_BLK_DEV_COW_COMMON is not set

488 CONFIG_BLK_DEV_LOOP=y

489 # CONFIG_BLK_DEV_CRYPTOLOOP is not set

490 CONFIG_BLK_DEV_NBD=m

491 # CONFIG_BLK_DEV_UB is not set

492 CONFIG_BLK_DEV_RAM=y

三、Makefile文件

2.6内核的Makefile分为5个组成部分:

最顶层的Makefile

内核的.config配置文件

在arch/$(ARCH) 目录下的体系结构相关的Makefile

在s目录下的 Makefile.* 文件,是一些Makefile的通用规则

各级目录下的大概约500个kbuild Makefile文件

顶层的Makefile文件读取 .config文件的内容,并总体上负责build内核和模块。Arch Makefile则提供补充体系结构相关的信息。 s目录下的Makefile文件包含了所有用来根据kbuild Makefile 构建内核所需的定义和规则。

1.目标定义

目标定义就是用来定义哪些内容要做为模块编译,哪些要编译链接进内核。如:

obj-y += foo.o

表示要由foo.c或者foo.s文件编译得到 foo.o并链接进内核,而obj-m则表示该文件要作为模块编译。 除了y,m以外的obj-x形式的目标都不会被编译。而更常见的做法是根据.config文件的CONFIG_ 变量来决定文件的编译方式(该变量如何起作用见文末另一篇文章的链接),如:

obj-$(CONFIG_EXT2) += ext2.o

除了obj-形式的目标以外,还有lib-y library库,hostprogs-y 主机程序等目标,但是基本都应用在特定的目录和场合下

2.多文件模块的定义

最简单的kbuild Makefile如上一节一句话的形式就够了,如果一个模块由多个文件组成,那么稍微复杂一些,采用模块名加 –objs后缀或者 –y后缀的形式来定义模块的组成文件。如以下例子:

obj-$(CONFIG_EXT2) += ext2.o

ext2-y := balloc.o bitmap.o

或者写成如-objs的形式:

obj-$(CONFIG_EXT2) += ext2.o

ext2-objs := balloc.o bitmap.o

模块的名字为ext2,如果CONFIG_EXT2 的值是m,由balloc.o和bitmap.o两个目标文件最终链接生成ext2.o 直至ext2.ko文件,如果CONFIG_EXT2的值是y,生成的 ext2.o将被链接进built-in.o最终链接进内核。

3.目录层次的迭代

如下例:

obj-$(CONFIG_EXT2) += ext2/

如果CONFIG_EXT2 的值为y或m,kbuild将会将ext2目录列入向下迭代的目标中。

四、示例:添加自己的模块到内核

1.将自己的hello1.c拷贝到 /drivers/char目录下

2.#vi Kconfig

添加代码

#add myself

config MY_HELLO_WORD //变量,反映在.config文件里

bool "choose my_hello_world"//make menuconfig出现的条目

depends on ARCH_S3C64XX //依赖

default y //默认编译进内核

help

nihao heshange //帮助信息

3.make menuconfig

Device Drivers--->Character devices -->choose my hello world(NEW)



4.查看linux主目录下.config

#vi .config



5.修改 /drivers/char目录下的makefile文件,添加



6重新编译内核

在linux2.6.x/Documentation/kbuild目录下有周详的介绍有关kconfig、makefile的知识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: