linux内核Kconfig与Makefile文件分析

部分资料参考

http://user.qzone.qq.com/308337370/blog/1270156211


内核是个复杂庞大的系统,对它进行配置、裁剪、编译原本非常的复杂和困难,但现在我们却只需要简单的2个命令make menuconfigmake 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=yn的形式出现;  

2) bool为变量取值的类型,可为yn  

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

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

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

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

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

附加说明:   

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

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

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

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

 

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


tristate:可取ynm  

bool (其为tristate的变体) :可取yn  

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
menuendmenu中间可配置若干config条目;  

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

 

4、Kconfig文件的要素:choice  

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

choice中的config条目变量只能有2种类型:booltristate,且不能同时有这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_LOOPCONFIG_BLK_DEV_RAM功能编译进zImage;不编译BLK_DEV_COW_COMMONBLK_DEV_CRYPTOLOOPBLK_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的通用规则 
       各级目录下的大概约500kbuild 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的知识。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值