您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > Linux教程之Linux内核的Makefile和kconfig解读
千锋3G嵌入式移动互联网技术研发培训中心一、概述二、Makefile文件三、Kconfig文件1、类型定义2、依赖型定义dependson或requires3、帮助性定义四、.config文件五、DIY:向内核添加自己的程序千锋3G嵌入式移动互联网技术研发培训中心在内核编译中如何将各个目录树中的文件组织起来编译是一个很重要的问题,并且要根据用户配置来编译特有的内核。为了解决这个问题,内核使用两种文件,Makefie和Kconfig。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单,就是我们使用命令makemenuconfig(或者xconfig)后产生的配置菜单,此菜单包含多层,每个层次都是由各个目录中的Kconfig产生的。用户根据需求来选择如何编译内核,然后将配置结果保存到.config中,然后执行Makefile时就会根据.config的结果来实现内核的编译。千锋3G嵌入式移动互联网技术研发培训中心这个过程是由kbuild系统来完成的,Linux编译系统会两次扫描Linux的Makefile:首先编译系统会读取Linux内核顶层的Makefile,然后根据读到的内容第二次读取Kbuild的Makefile来编译Linux内核。内核编译系统或者说kbuild,是一种在编译内核时,可以对内核配置选项进行选择的机制。2.6内核树中已经更新了这种机制,新版本的kbuild不仅高速而且备有更完善的文档。Kbuild机制完全依赖于源代码的层次结构。千锋3G嵌入式移动互联网技术研发培训中心面对树状结构的内核源码目录,内核编译采用了各个子目录拥有自己目录相关的Makefile(被称为sub-Makefile或kbuildMakefile),内核编译依赖于各个子目录下的子makefile(sub-Makefile)文件,这些sub-Makefile定义了根据该子目录下的源码文件构建目标文件的规则,并且仅对该目录下的文件作适当的修改。顶层Makefile采用递归的方式调用位于init/,drivers/,sound/,net/,lib/,usr/等目录下的各个子目录中的Makefile文件。在递归调用之前,kbuild首先要确定是否已经满足一些必要的条件,包括在必要时更新include/Linux/version.h文件,并设置符号链接include/asm,使之指向与目标体系结构相关的文件。例如,如果为PPC编译代码,则include/asm指向include/asm-ppc。kbuild还要对文件include/Linux/autoconf.h和include/Linux/config进行编译。之后,从根目录开始进行递归。千锋3G嵌入式移动互联网技术研发培训中心各个子Makefile文件比较简单,指出了该如何编译目标文件,例如/mm目录下的Makefile片段:16obj-$(CONFIG_PROC_PAGE_MONITOR)+=pagewalk.o17obj-$(CONFIG_BOUNCE)+=bounce.o18obj-$(CONFIG_SWAP)+=page_io.oswap_state.oswapfile.othrash.o19obj-$(CONFIG_HAS_DMA)+=dmapool.o20obj-$(CONFIG_HUGETLBFS)+=hugetlb.o千锋3G嵌入式移动互联网技术研发培训中心Kconfig的作用就是为了让用户配置内核,在Kconfig中定义了一些变量,用户通过设置变量的值来选择如何个性化自己的系统内核。定义的变量将在每个菜单都有一个关键字标识,最常见的就是config语法:configsymbol是个新的标记的菜单项,options是在这个新的菜单项下的属性和选项其中options部分有:千锋3G嵌入式移动互联网技术研发培训中心每个config菜单项都要有类型定义,bool布尔类型、tristate三态:内建、模块、移除string字符串、hex十六进制、integer整型例如configHELLO_MODULEbool“hellotestmodule”bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.千锋3G嵌入式移动互联网技术研发培训中心指此菜单的出现和否依赖于另一个定义configHELLO_MODULEbool“hellotestmodule”dependsonARCH_PXA这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效。千锋3G嵌入式移动互联网技术研发培训中心只是增加帮助用关键字help或—help—千锋3G嵌入式移动互联网技术研发培训中心上面提到了利用内核配置工具自动生成名为.config的内核配置文件,这是编译内核的第一步。.config文件位于源代码根目录下,描述所有内核配置选项,可以借助内核配置工具来选择这些选项。每个内核配置选项都有相关的名字和变量值。其名字形如CONFIG_NAME,其中NAME是对相关选项的标识,在Kconfig文件中定义;变量可以有三个值:y,m或n。y代表“yes”,表示该选项将会被编译到内核源代码中,或者说会被编译到系统中。m代表“module”,表示该选项将会以模块的方式编译到内核中。如果未选择该选项(即将该选项的变量值设为n,代表“no”),那么.config文件中就会出现下列注释:“CONFIG_NAMEisnotset”。千锋3G嵌入式移动互联网技术研发培训中心.config文件中选项的位置根据它们在内核配置工具中的位置进行排序,注释部分说明该选项位于哪个菜单下。我们来看看一个.config文件的节选:1#2#Automaticallygeneratedmakeconfig:don’tedit3#4CONFIG_X86=y5CONFIG_MMU=y6CONFIG_UID16=y千锋3G嵌入式移动互联网技术研发培训中心7CONFIG_GENERIC_ISA_DMA=y89#10#Codematurityleveloptions11#12CONFIG_EXPERIMENTAL=y13CONFIG_CLEAN_COMPILE=14CONFIG_STANDALONE=y15CONFIG_BROKEN_ON_SMP=y1617#18#Generalsetup千锋3G嵌入式移动互联网技术研发培训中心19#20CONFIG_SWAP=y21CONFIG_SYSVIPC=y22#CONFIG_POSIX_MQUEUEisnotset23CONFIG_BSD_PROCESS_ACCT=y上述.config文件指出第4到第7行的选项位于顶层菜单中,第12到第15行的选项位于代码成熟度选项菜单中,第20行到第23行的选项位于通用设置选项菜单中。千锋3G嵌入式移动互联网技术研发培训中心所有配置工具都会产生上述菜单,并且已经看到前几个选项、代码成熟度选项、及通用设置选项都位于顶层。后面两个选项被扩展为包含多个选项的子菜单。这些菜单都是在调用xconfig命令时,由qconf配置工具提供的。配置工具显示的菜单都默认用于X86体系结构。千锋3G嵌入式移动互联网技术研发培训中心A.在Linux内核中增加自己的程序步骤(注意这里只是程序文件):1.将编写的源代码复制到Linux内核源代码的相应目录中。2.在目录的Kconfig文件中增加新源代码对应项目的编译配置选项3.在目录的Makefile文件中增加对新源代码的编译条目。B.在Linux内核drivers/目录中增加目录和子目录步骤:千锋3G嵌入式移动互联网技术研发培训中心1.所加目录为myDriver,文件如下:myDriver$tree|–Kconfig|–Makefile|–key||–Kconfig||–Makefile|`–key.c|–led||–Kconfig千锋3G嵌入式移动互联网技术研发培训中心||–Makefile|`–led.c`—test.c#注意此时各个目录中的Makefile和Kconfig文件是空的2.在新增的相应目录添加Kconfig和Makefile文件,上面的目录中已经添加。3.修改新增目录的父目录的Kconfig和Makefile文件,以便新增的Kconfig和Makefile能被引用。向父目录中的Makefile添加:obj-y+=myDriver/千锋3G嵌入式移动互联网技术研发培训中心表示在编译过程中包含子目录myDriver目录。然后修改Kconfig文件,添加:source“drivers/myDriver/Kconfig”表示在配置时引用子目录myDriver中的配置文件Kconfig。4.经过上面一步,父目录就可以找到所加的目录myDriver了,然后就是编辑各个目录中的Makefile和Kconfig文件,在你添加的目录myDriver中的Makefile加入:obj-$(CONFIG_TEST)+=test.o#因为在myDriver目录中要编译test.c文件千锋3G嵌入式移动互联网技术研发培训中心#所以会根据CONFIG_TEST来决定编译选项obj-y+=led/#编译myDriver目录中的子目录ledobj-y+=key/#编译myDriver目录中的子目录key然后Kconfig文件是:menu“TESTMyDriver”#在makemenuconfig时要显示的菜单入口comment“TestmyDriver”#menutitleconfigTEST千锋3G嵌入式移动互联网技术研发培训中心tristate“MyDrivertest”source“driv
本文标题:Linux教程之Linux内核的Makefile和kconfig解读
链接地址:https://www.777doc.com/doc-2880992 .html