Kconfig与Kbuild Makefile 的驱动方向简单解析

来源:互联网 发布:手机端更改头像 js 编辑:程序博客网 时间:2024/06/05 13:22

首先我们来学习什么Makefile,什么是Kconfig ,什么是.config     
        Makefile:一个文本形式的文件,其中包含一些规则告诉make编译哪些文件以及怎样编译这些文件。

        Kconfig:一个文本形式的文件,其中主要作用是在内核配置时候,作为配置选项,内容为选择编译源文件的方式。

                         y为build-in,生成的*.o文件将在链接过程中$(LD)被添加到 build-in.o被上层Makefile读取。

                         m为moudle,文件被编译为模块,并不会被编译到build-in.o 中,在内核需要时会添加不需要时可删除(对应shell命令为insmod rmmod 查看dmesg)

                         其他任何非y,m的类型都不会被编译。

         .config:文件是在进行内核配置的时候,经过配置后生成的内核编译参考文件。在Kconfig配置完成后由系统生成,Makefile在make时会读取.config中的信息

 

当执行#make menuconfig时会出现内核的配置界面,所有配置工具都是通过读取"arch/$(ARCH)Kconfig"文件来生成配置界面,这个文件就是所有配置的总入口,它会包含其他目录的Kconfig

Kconfig的作用:Kconfig用来配置内核,它就是各种配置界面的源文件,内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config

Kconfig的语法可以参考“Documentation/kbuild/kconfig-language.txt

 

Kconfig文件的基本要素:

 

1.config条目(entry)

  config TMPFS_POSIX_ACL

    bool "Tmpfs POSIX Access Control Lists"

    depends on TMPFS

    default y

    select GENERIC_ACL

    help

      POSIX Access Control Lists (ACLs) support permissions for users and

      groups beyond the owner/group/world scheme.

 

      To learn more about Access Control Lists, visit the POSIX ACLs for

      Linux website <http://acl.bestbits.at/>.

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

解析:

   config是关键字,表示一个配置选项的开始;紧跟着的TMPFS_POSIX_ACL是配置选项的名称,省略了前缀"CONFIG_"

    bool表示变量类型,即"CONFIG_ TMPFS_POSIX_ACL "的类型,有5种类型:bool、tristate、string、hex和int,其中tristate和string是基本的类型

              bool变量的值:    y和n

              tristate变量的值:y、n和m

              string变量的值:  字符串

bool之后的字符串“Tmpfs POSIX Access Control Lists”是提示信息,在配置界面中上下移动光标选中它时,就可以通过按空格或回车键来设置

CONFIG_ TMPFS_POSIX_ACL的值,这个值会在配置完成后写入.config。在make时以obj-$(CONFIG_ TMPFS_POSIX_ACL) += tmpfs_posix_acl.o引用

    depends on:表示依赖于XXX,“depends on TMPFS”表示只有当TMPFS配置选项被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项

 

 

    select反相依赖:这个关键字表示了当本配置项选中后,其他的配置项也需要选中。

 

2.source条目

   source条目用于读取另一个Kconfig文件,如:

        source "net/Kconifg"

 

3.menu条目

   menu条目用于生成菜单,其格式如下:

         menu "Floating poing emulation"

         config FPE_NWFPE

         ..............

         config FPE_NWFPE_XP

         .............

         endmenu

   menu之后的Floating poing emulation是菜单名,menu和endmenu间有很多config条目,在配置界面中如下所示:

         Floating poing emulation--->

                       [] FPE_NWFPE

                       [] FPE_NWFPE_XP

4.choice条目

   choice条目将多个类似的配置选项组合在一起,供用户单选或多选

       choice

             prompt "ARM system type"

             default ARCH_VERSATILE

 

             config ARCH_AAEC2000

                  .........

             config ARCH_REALVIEW

                  .........

        endchoice

      prompt "ARM system type"给出提示信息“ARM system type”,光标选中

  后回车进入就可以看到多个config条目定义的配置选项

     choice条目中定义的变量只有bool和tristate

5.comment条目

   comment条目用于定义一些帮助信息,出现在界面的第一行,如在arch/arm/Kconifg中有如下代码:

menu "Floating point emulation"

                                                                                          

comment "At least one emulation must be selected"

                                                                                              

config FPE_NWFPE

.........                                                                               

config FPE_NWFPE_XP

 

Kbuild Makefile

参阅http://blog.csdn.net/liduxun/article/details/38709537

简单写一下必须了解的

 

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 主机程序等目标,但是基本都应用在特定的目录和场合下。

tips:

Kbuild Makefile 规定所有编译进内核的目标文件都存在$(obj-y)列表中。而这些列表依赖内核的配置。

Kbuild编译所有的$(obj-y)文件。然后,调用"$(LD) -r"将它们合并到一个build-in.o文件中。稍后,该build-in.o会被其父Makefile联接进vmlinux中。


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目录列入向下迭代的目标中。

下面我们以实例来说明这几个文件的作用

Step1:编辑配置文件Kconfig,加入驱动选项,使之在make menuconfig 的时候出现   
打开 linux-2.6.32.2/drivers/char/Kconfig 文件,添加如图所示:

image

保存退出,这时在linux-2.6.32.2 目录位置运行一下make menuconfig 就可以在Device   
Drivers Character devices 菜单中看到刚才所添加的选项了,按下空格键将会选择为<M>,    
此意为要把该选项编译为模块方式;再按下空格会变为<*>,意为要把该选项编译到内核中,    
在此我们选择<M>,如图:

image

Step2:通过上一步,我们虽然可以在配置内核的时候进行选择,但实际上此时执行编译内核还是不能把mini2440_hello_module.c 编译进去的,还需要在Makefile 中把内核配置选项和真正的源代码联系起来,打开linux-2.6.32.2/drivers/char/Makefile,如图添加并保存退出:

image

 

Step3:这时回到linux-2.6.32.2 源代码根目录位置,执行make modules,就可以生成我们所需要的内核模块文件 mini2440_hello_module.ko 了,如图:至此,我们已经完成了模块驱动的编译。

image

 

 

 

 

0 0
原创粉丝点击