一、概述

  在内核编译中如何将各个目录树中的文件组织起来编译是一个很重要的问题,并且要根据用户配置来编译特有的内核。为了解决这个问题,内核使用两种文件,Makefie和Kconfig。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单,就是我们使用命令 make menuconfig(或者xconfig)后产生的配置菜单,此菜单包含多层,每个层次都是由各个目录中的Kconfig产生的。用户根据需求来选择如何编译内核,然后将配置结果保存到.config中,然后执行Makefile时就会根据.config的结果来实现内核的编译。

  这个过程是由kbuild系统来完成的,Linux编译系统会两次扫描Linux的Makefile:首先编译系统会读取Linux内核顶层的Makefile,然后根据读到的内容第二次读取Kbuild的Makefile来编译Linux内核。内核编译系统或者说kbuild,是一种在编译内核时,可以对内核配置选项进行选择的机制。2.6内核树中已经更新了这种机制,新版本的kbuild 不仅高速而且备有更完善的文档。Kbuild机制完全依赖于源代码的层次结构。

  二、Makefile文件

  面对树状结构的内核源码目录,内核编译采用了各个子目录拥有自己目录相关的Makefile(被称为sub-Makefile或kbuild Makefile),内核编译依赖于各个子目录下的子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进行编译。之后,从根目录开始进行递归。

  各个子Makefile文件比较简单,指出了该如何编译目标文件,例如/mm目录下的Makefile片段:

  16 obj-$(CONFIG_PROC_PAGE_MONITOR) += pagewalk.o

  17 obj-$(CONFIG_BOUNCE)    += bounce.o

  18 obj-$(CONFIG_SWAP)      += page_io.o swap_state.o swapfile.o thrash.o

  19 obj-$(CONFIG_HAS_DMA)   += dmapool.o

  20 obj-$(CONFIG_HUGETLBFS) += hugetlb.o

  三、Kconfig文件

  Kconfig的作用就是为了让用户配置内核,在Kconfig中定义了一些变量,用户通过设置变量的值来选择如何个性化自己的系统内核。定义的变量将在

  每个菜单都有一个关键字标识,最常见的就是config

  语法:

  config

  symbol是个新的标记的菜单项,options是在这个新的菜单项下的属性和选项

  其中options部分有:

  1、类型定义:

  每个config菜单项都要有类型定义,bool布尔类型、 tristate三态:内建、模块、移除 string字符串、 hex十六进制、 integer整型

  例如config HELLO_MODULE

  bool “hello test module”

  bool 类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个 CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个 CONFIG_HELLO_MODULE=y的配置.

  2、依赖型定义depends on或requires

  指此菜单的出现和否依赖于另一个定义

  config HELLO_MODULE

  bool “hello test module”

  depends on ARCH_PXA

  这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效。

  3、帮助性定义

  只是增加帮助用关键字help或—help—

  四、.config文件

  上面提到了利用内核配置工具自动生成名为.config的内核配置文件,这是编译内核的第一步。.config文件位于源代码根目录下,描述所有内核配置选项,可以借助内核配置工具来选择这些选项。每个内核配置选项都有相关的名字和变量值。其名字形如CONFIG_<NAME>,其中<NAME>是对相关选项的标识,在Kconfig文件中定义;变量可以有三个值:y,m或n。y代表“yes”,表示该选项将会被编译到内核源代码中,或者说会被编译到系统中。m代表“module” ,表示该选项将会以模块的方式编译到内核中。如果未选择该选项(即将该选项的变量值设为n,代表“no”),那么.config文件中就会出现下列注释:“CONFIG_<NAME> is not set”。.config文件中选项的位置根据它们在内核配置工具中的位置进行排序,注释部分说明该选项位于哪个菜单下。我们来看看一个.config文件的节选:

  1 #

  2 # Automatically generated make config: don’t edit

  3 #

  4 CONFIG_X86=y

  5 CONFIG_MMU=y

  6 CONFIG_UID16=y

  7 CONFIG_GENERIC_ISA_DMA=y

  8

  9 #

  10 # Code maturity level options

  11 #

  12 CONFIG_EXPERIMENTAL=y

  13 CONFIG_CLEAN_COMPILE=

  14 CONFIG_STANDALONE=y

  15 CONFIG_BROKEN_ON_SMP=y

  16

  17 #

  18 # General setup

  19 #

  20 CONFIG_SWAP=y

  21 CONFIG_SYSVIPC=y

  22 #CONFIG_POSIX_MQUEUE is not set

  23 CONFIG_BSD_PROCESS_ACCT=y

  上述.config文件指出第4到第7行的选项位于顶层菜单中,第12到第15行的选项位于代码成熟度选项菜单中,第20行到第23行的选项位于通用设置选项菜单中。

  所有配置工具都会产生上述菜单,并且已经看到前几个选项、代码成熟度选项、及通用设置选项都位于顶层。后面两个选项被扩展为包含多个选项的子菜单。这些菜单都是在调用xconfig命令时,由qconf配置工具提供的。配置工具显示的菜单都默认用于X86体系结构。

  五、DIY:向内核添加自己的程序

  A.在Linux内核中增加自己的程序步骤(注意这里只是程序文件):

  1.将编写的源代码复制到Linux内核源代码的相应目录中。

  2.在目录的Kconfig文件中增加新源代码对应项目的编译配置选项

  3.在目录的Makefile文件中增加对新源代码的编译条目。

  B.在Linux内核drivers/目录中增加目录和子目录步骤:

  1.所加目录为myDriver,文件如下:

  myDriver$ tree

  |– Kconfig

  |– Makefile

  |– key

  |   |– Kconfig

  |   |– Makefile

  |   `– key.c

  |– led

  |   |– Kconfig

  |   |– Makefile

  |   `– led.c

  `— test.c

  #注意此时各个目录中的Makefile和Kconfig文件是空的

  2.在新增的相应目录添加Kconfig和Makefile文件,上面的目录中已经添加。

  3.修改新增目录的父目录的Kconfig和Makefile文件,以便新增的Kconfig和

  Makefile能被引用。向父目录中的Makefile添加:

  obj-y                           += myDriver/

  表示在编译过程中包含子目录myDriver目录。然后修改Kconfig文件,添加:

  source “drivers/myDriver/Kconfig”

  表示在配置时引用子目录myDriver中的配置文件Kconfig。

  4.经过上面一步,父目录就可以找到所加的目录myDriver了,然后就是编辑各个目 录中的Makefile和Kconfig文件,在你添加的目录myDriver中的Makefile加入:

  obj-$(CONFIG_TEST) += test.o #因为在myDriver目录中要编译test.c文件

  #所以会根据CONFIG_TEST来决定编译选项

  obj-y += led/#编译myDriver目录中的子目录led

  obj-y += key/#编译myDriver目录中的子目录key

  然后Kconfig文件是:

  menu “TEST MyDriver”            #在make menuconfig时要显示的菜单入口

  comment “Test myDriver”       #menu title

  config TEST

  tristate “MyDriver test”

  source “drivers/myDriver/led/Kconfig” #将led目录下的Kconfig添加进来

  source “drivers/myDriver/key/Kconfig”

  endmenu

  再看led目录下的Makefile和Kconfig:

  Makefile为文件:

  obj-$(CONFIG_LED)+=led.o

  Kconfig文件:

  config LED

  tristate “led support”

  key目录下的Makefile和Kconfig类似。

  5.现在可以make menuconfig来配置添加自己目录myDriver的内核了!

Linux内核的Makefile和kconfig解读相关推荐

  1. linux内核和w,Linux内核中Makefile、Kconfig和.config的关系

    转载:http://emb.hqyj.com/Column/7565.html 1.Linux内核如此庞大(几万个文件),目录又分为很多层,它是如何将各层目录下的文件关联起来的? linux内核通过层 ...

  2. Linux内核中Makefile、Kconfig和.config的关系

    转载:http://emb***/Column/7565.html 1.Linux内核如此庞大(几万个文件),目录又分为很多层,它是如何将各层目录下的文件关联起来的? linux内核通过层层目录管理, ...

  3. Linux内核中Makefile、Kconfig、

    核心:学习过数据结构的童鞋应该知道,对于一棵非标准树,还是有办法将其进行遍历的,只是算法比较复杂而已.那么在Linux内核源码的这棵树,就是通过Kconfig文件建立各层子目录之间的连接,通过Make ...

  4. linux内核makefile详解,linux kernel编译Makefile和Kconfig,make menuconfig详解

    Sam需要看看2.6 kernel中USB Mouse的代码.顺便谈谈Kernel中Makefile和Kconfig文件的关系以及配合使用. 背景知识: 背景知识一:Kconfig介绍: 在#make ...

  5. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  6. Linux内核中makefile有什么作用?深入解析makefile工作过程和原理

    Table of Contents Makefile 中的变量 常用的变量有以下几类: 1) 版本信息 2) CPU 体系结构:ARCH 3) 路径信息:TOPDIR, SUBDIRS 4) 内核组成 ...

  7. 【学习笔记】编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译

    本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...

  8. 编译arm linux内核,编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译...

    转载自:http://blog.csdn.net/newthinker_wei/article/details/8022696 本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录, ...

  9. 解析linux内核中makefile,.config以及Kconfig的作用

    申明,下面这篇文章是原文,本文参考了这篇文章,这篇文章分析得比较透彻,下面是链接. https://zhuanlan.zhihu.com/p/28461589 首先我们要知道makefile文件是什么 ...

最新文章

  1. JAVA常见算法题(三十)
  2. beanUtils操作bean的属性
  3. jvm中的垃圾收集器serial、parNew、parallel Scavenge;serial old、parallel old、CMS、G1
  4. 运行测试Caused by: java.lang.UnsatisfiedLinkError: no attach in java.library.path错误解决
  5. MySQL 4种text类型的最大长度
  6. linux安装lrzsz,并使用rz sz 命令
  7. ckeditor编辑的使用方法
  8. flask结合令牌桶算法实现上传和下载速度限制
  9. 跟KingDZ学HTML5之九 HTML5新的 Input 种类
  10. 结合Control.FirefoxDialog控件,构造优秀的参数配置管理模块
  11. IBM大力抢占网络宣传阵地,拿下百度“SOA”关键字的第一位
  12. mysql5.7.9 zip achive
  13. MySQL乱码的问题
  14. qsnctf 2048 wp
  15. his服务器数据修改工具,某三甲医院基于HIS系统升级改造项目的实战分享
  16. Windows 7 IE主页被篡改,如何修复?
  17. 淘宝直通车ROI,投产比怎么算,ROI计算公式
  18. 团队作业——Alpha冲刺 1/12
  19. 西瓜视频直播显示服务器升级中,西瓜视频如何更新版本
  20. RDKit | 基于RDKit和SMARTS的化学反应处理

热门文章

  1. 糖豆人服务器要维护多久,糖豆人刚上四天,紧急维护9小时后又延长,玩家:从中午到现在了...
  2. c语言 申请1k内存,怎么解决函数内申请内存,函数外释放的问题
  3. @Select注解的使用
  4. MySQL8权限,角色
  5. (二)ElasticSearch6.1.1 Python API
  6. Leetcode143. Reorder List重排链表
  7. cookie和session 以及Django中应用
  8. SQL批量提交修改业务
  9. datatables 的导出button自定义
  10. Hibernate or 的用法