`
java-mans
  • 浏览: 11409281 次
文章分类
社区版块
存档分类
最新评论

内核Kconfig 与 Makefile 文件分析

 
阅读更多

一.内核构造系统简介

内核是个复杂庞大的系统,对它进行配置、裁剪、编译原本非常地复杂和困难,但现在却只需要简单的两个命令:(1)make menuconfig ;(2)make uImage 就搞定了,原因是在其背后有一个设计精巧的内核构造系统帮助我们精确的完成了各项任务。内核构造系统最关键的组成元素就是各个目录下的Kconfig 文件和 Makefile文件,本节将对这两类文件进行介绍,以使大家了解内核构造系统的基本情况,从而能够修改它们,以完成向内核中添加功能组件的目的。

二. Kconfig 文件精解

* Kconfig 文件的作用是:

1.控制make menuconfig 时, 出现的配置选项;

2.根据用户配置界面的选择,将配置结果保存在.config 配置文件(该文件将提供给Makefile使用,用以决定要编译的内核组件以及如何编译)。

初始Kconfig文件是arch /arm/Kconfig ( Kconfig文件的语法和语义,详情可查阅内核源码中的Documentation /kbuild/kconfig-language.txt 文件 )

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

configYAFFS_FS

tristate " YAFFS2 file system support "

default y

depends onMTD_BLOCK

selectYAFFS_YAFFS1

selectYAFFS_YAFFS2

help

YAFFS2 , or Yet Another Flash Filing System , is a filing system

optimised for NAND Flash chips.

To compile the YAFFS2 File system support as a module, choose M here :the module will be called yaffs2.

Ifunsure , say N

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

(1)YAFFS_FS为变量名,将在.config 中以CONFIG_YAFFS_FS=y 或 n 的形式出现,如图

(2)tristate 为出现在配置菜单中的文字,没有它,将使得用户不能在配置界面中显示并配置它,同时它也为变量取值的类型,可为y 、n 、m

(3)default :为变量默认值,可被用户设置值覆盖。

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

(注:原来我的.config 文件中出现的形式时#CONFIG_YAFFS_FS is not set ,所以一致后来在make menuconfig菜单中找不到YAFFS2 file system support的选项,就是因为这个原因,后来设置成CONFIG_YAFFS_FS=y还是没有YAFFS2 file system support的选项,因为没有理解depends on MTD_BLOCK ,后来理解了,再次到.config文件中设置了此选项,菜单中终于有了"YAFFS2 file system support"的选项)

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

(6) help :中的文字将作为配置界面中的帮助信息。

附加说明:

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

*** 有depends on ,default 为y :所依赖的条目己设置,则默认为y ; 所依赖的条目未设置,则为n.

*** 有depends on ,default 为n :所依赖的条目己设置,则默认为n; 所依赖的条目未设置,则为n.

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

二.Kconfig 中变量的取值类型

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

(1)tristate :可取y 、n 、m。

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

(3)string :取值为字符串,如:CONFIG_CMDLINE = "root =/dev/hdalro init = /bin/bash console =ttySAC0 "

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

(5)int (其为string的变体):取值为十进制数据,如:CONFIG_SPLIT_PTLOCK_CPUS=4096

三.Kconfig 文件的要素:source

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

(举例:在内核的fs/Kconfig 中增加一行: source "fs/yaffs2/Kconfig" 就是如此)

续篇:.config 文件说明

make menuconfig 配置完成退出时,选择保存,则用户所做的选择将保存在内核源代码顶层目录文件中.config文件中。下面.config文件的片段显示内核配置者作了如下选择:将YAFFS_FS 、YAFFS_YAFFS1功能编译进uImage;不编译BFS_FS、EFS_FS、YAFFS_9BYTE_TAG功能;

续篇:Makefile 文件说明

下面是内核drivers/net/Makefile 文件的片段:

12 obj - $ (CONFIG_ATL1) += atl1/

13 obj - $ (CONFIG_GIANFAR) += gianfar_driver.o

14

15 gianfar_driver - objs : = gianfar.o \

16 gianfar_ethtool.o \

17 gianfar_mii.o \

18 gianfar_sysfs.o

26 obj - $ (CONFIG_PLIP) + = plip.o

它的含义是:

(1)第26行,如果.config文件中变量CONFIG_PLIP=y,那么将编译本目录下的plip.文件并将其功能集成进uImage ;如果.config文件中变量CONFIG_PLIP=m,那么将编译本目录下的plip.c文件生成模块plip.ko;否则,将不编译plip.c。

(2)第13~18行,如果config文件中变量CONFIG_GIANFAR=y,那么将编译本目录下的cgianfar.c、gianfar_ethtool.c、gianfar_mii.c、gianfar_sysfs.c文件并将其功能集成进uImage ;如果config文件中变量CONFIG_GIANFAR=m,那么将编译本目录下的cgianfar.c、gianfar_ethtool.c、gianfar_mii.c、gianfar_sysfs.c文件生成模块并将其功能集成进gianfar_driver.ko ;否则不编译cgianfar.c、gianfar_ethtool.c、gianfar_mii.c、gianfar_sysfs.c文件。

(3)第12行,如果.config 文件中变量CONFIG_ARL1=y,将递归进入本目录的子目录atl1,并将根据子目录下的Makefile文件内容决定改子目录如何进行编译;否则,将不进入本目录的子目录atl1进行编译。

例如:

下面是内核fs/Makefile 文件的片段:如图:

之后进入yaffs2子目录下的Makefile 看看:如图:

分享到:
评论

相关推荐

    Kconfig简介

    Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件。基本上,Linux 内核中每一个目录下边都会有一个Kconfig文件和一个Makefile文件。Kconfig和Makefile就好似一个城市的地图,地图引导我们去 认识一个城市,...

    Kconfig和Makefile

    Linux内核源码树的每个目录下都有两个文档Kconfig和Makefile。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单。在执行内核配置make menuconfig时...

    linux 驱动之Kconfig文件和Makefile文件实例

    linux 驱动之Kconfig文件和Makefile文件实例 在Linux编写驱动的过程中,有两个文件是我们必须要了解和知晓的。这其中,一个是Kconfig文件,另外一个是Makefile文件。如果大家比较熟悉的话,那么肯定对内核编译需要的...

    Makefile基础知识及Makefile Kconfig 内核配置 内核裁剪.rar

    免分放送,自己收集的资料。。如题。。大家赶快下吧。。

    ( Linux教程之Linux内核的Makefile和kconfig解读

    ( Linux教程之Linux内核的Makefile和kconfig解读

    龙芯内核开发

    根据龙芯平台 Linux 内核实际情况,将内核的源码文件分为三部分: 驱动部分、体系架构相关部分 以及公共部分。 a) 驱动部分: 包含内核 driver 目录下所有的...Kconfig 与 Makefile 等文件都是源码文件对应的配置文件

    linux下kconfig语法

    kconfig 语法详细介绍,要看内核必看makefile,要看makefile必看kconfig,要看kconfig必要了解kconfig语法。 万里长征第一步,大家走好。

    linux-driver-setup.rar_2.6.30.4_kconfig

    怎样给内核版本为2.6.30.4添加驱动,本例为一个空的驱动,主要是修改Kconfig和Makefile文件,采用modules动态加载

    Linux内核修炼之道

    很好Linux内核休息书籍 第一层次修炼的内容包括了前三章, ...代码的工具,最后,突出强调了内核源码分析过程中极为重要的两个角色——Kconfig 和 Makefile,并以 USB 子系统为例,演示了如何利用这两个角色进行代码分析。

    内核配置_yaffs2补丁

    将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie; 将yaffs2 源码目录的Kconfig文件复制到内核fs/yaffs2目录下; 将yaffs2源码目录下的*.c *.h文件复制到内核fs/yaffs2目录下.

    yaffs2压缩包

    将yaffs2源码目录下的Makefile.kernel复制为内核fs/yaffs2/Makefile文件 将yaffs2源码目录下的Kconfig文件复制到内核fs/yaffs2/目录下 将yaffs2源码目录下的*.c,*.h文件(不包括子目录下的文件)复制到内核fs/yaffs2/...

    探索Linux内核:Kconfig的秘密

    为了探索Linux内核是如何编译的,本文将深入研究Kconfig/kBuild内部进程,解释.config文件和vmlinux/bzImage文件是如何生成的,并介绍一个用于依赖性跟踪的智能技巧。 Kconfig 构建内核的第一步总是配置。Kconfig...

    Huawei LiteOS组件仓库主要存放组件的补丁及相关的sha256校验文件

    Huawei LiteOS组件仓库,主要存放组件的补丁及相关的sha256校验...新增组件或demo,都需要新建其自身的Kconfig、Makefile、.mk文件,本文档以新增组件为主题,新增demo的方法和新增组件类似,本文档不再赘述。curl-7.5

    mini6410_2.6.38内核_uart1_platform_device驱动

    2.6.38内核的uart1 串口驱动,使用platform_device方式,压缩包里面有驱动源代码、编译好了的ko文件、使用说明文档、用户例程的源代码和可执行程序,但是并没有给出直接编译驱动和测试程序的相应的Makefile,...

    把鸿蒙Liteos-a移植到STM32MP157.zip

    1. 准备工作与说明 1.1 准备工作 1.2 说明 2. Makefile编译系统分析 2.1 从最终的链接命令看Liteos-a的组成 2.2 Makfile中常用变量 2.3 包含的文件 2.4 把Makefile全部展开 2.5 分析在kernel/liteos_a下执行make的...

    HelloWorld程序编写及内核驱动

    HelloWorld 程序编写及编入内核驱动, 创建一个 hello 的驱动,在...1,增加驱动文件 hello.c 和对应的 Makefile、Kconfig 2,修改上一级的 Makefile 与 Kconfig 3,使用 Make menuconfig 进行配置 4,编译,烧录和运行

    《Android系统源代码情景分析》

    2.1.2 修改内核Kconfig文件 2.1.3 修改内核Makefile文件 2.1.4 编译内核驱动程序模块 2.1.5 验证内核驱动程序模块 2.2 开发C可执行程序验证Android硬件驱动程序 2.3 开发Android硬件抽象层模块 2.3.1 ...

    Linux那些事儿之我是Block层

    从2.6.15的内核开始,顶层目录下面有了一个叫做block的目录,内核目录结构变成了现在这个样子: localhost-1:/usr/src/linux-2.6.22.1 # ls COPYING Documentation MAINTAINERS README arch crypto fs init kernel mm...

    Linux移植wifi驱动

    背景:需要更换wifi厂家...2:查看驱动源码目录下的Kconfig和Makefile是否齐全,一般厂家提供时会全部提供。 3: realtek目录中打开Kconfig,添加source “drivers/net/wireless/realtek/rtl8723BU/Kconfig”。 4:rea

Global site tag (gtag.js) - Google Analytics