zoukankan      html  css  js  c++  java
  • [转载] make menuconfig/.config/Kconfig解析

    [转载]make menuconfig/.config/Kconfig解析

    在对linux进行编译,常用的命令是make menuconfig,使用图形界面来对整个系统进行裁剪。当然,除了这条指令,还包括很多配置命令,比如make defconfig, make oldconfig等。这里主要就make menuconfig的执行过程进行解析。

    一.准备工作

    包括(交叉)编译环境的建立,linux源码的下载与解压等。

    二.初步介绍

             跟make menuconfig这个命令相关的文件,包括三类,包括.config,Kconfig,Makefile。为什么不说三个,而说三类呢?因为Kconfig和Makefile是配合使用的,在很多的子目录都存在,而.config只存在于根目录中。这三个文件的作用分别是:

    Kconfig:定义了配置项

    .config:对配置项进行赋值

    Makefile:建立配置项的生成法则

             看到这里,可能有人就头疼了,到底什么是配置项,什么是生成法则。这里要求具有理解Makefile的能力,如果不懂的话,可以去找Makefile的相关资料。

    如果使用举例的话,比较容易理解。比如,我编写了mytest.c的文件,这里不关心mytest.c的内容。如果想把mytest.c编译到内核中,需要按照以下的步骤来完成。

    1)       将test.c放到任何一个目录中,这个目录只要求已存在Kconfig和Makefile中,比如源码根目录/arch/arm/目录中。

    2)       在这个目录的Kconfig中添加

    config MY_TEST

    bool “My Test”

    3)       在Makefile中添加

    obj-$(CONFIG_MY_TEST) += mytest.o

    4)       在.config中可以添加 CONFIG_MY_TEST = y来选中。

    或者在执行make menuconfig时,找到显示名为My Test的选项,使用空格选中。

             总而言之,就是如果需要向系统内核中添加一个功能,那么首先定义一个配置项对应于这个功能,添加到特定的Kconfig文件中。然后在Makefile里,定义这个配置项需要编译哪些文件。最后就可以通过make menuconfig或者直接修改.config来使能这个配置项。

             .config作为全局配置项的使能信息,存在于根目录中。里面内容基本上都是以下形式:

             CONFIG_XX_XX=y/n/m/0xFFFFFF/32/”XXXXXXX”

    其实,.config就是将执行make menuconfig后,对配置项的修改保存到一个文件中而已。如果没有.config时,make menuconfig会按照默认值来显示。

    三.配置的必要性

    在下载linux内核的时候,应该注意到了linux内核一般都很大,大概有70-80MB。这么大的内核对于PC来说,可能不是很大,但是对于嵌入式来说,那可就很大了。因为内核很大一部分都是常驻内存的,所以对于内存和硬盘来说,都是一种浪费。而且,内核中很大一部分也不需要被编译,比如arch目录是表示不同平台的信息,由于我们烧写的内核只用于一种平台,那么其他的目录完全是不需要烧写到内核里的。这样就要求,一部分文件需要编译,一部分文件不需要编译,这样就有了内核裁剪(配置)的需要了。而对于不同的配置方式,可能使用的手段是不同的,但是目的都是一样的,就是配置内核中需要编译的文件。通过编译后,内核的大小基本上是2.5MB。

    四.Kconfig语法

    1. 基本构成

             基本构成包括五种,menu/endmenu,menuconfig,config,choice/endchoice,source。下面就对每种详细介绍:

    (1)     menu/endmenu

    menu的作用,可以理解成一个目录,menu可以把其中一部分配置项包含到一个menu中,这样有利于配置的分类显示。menu与endmenu是一组指令,必须同时出现。menu和endmenu中包含的部分就是子目录中的配置项。

    比如,在init/Kconfig中24行(可能不同)显示为:

    menu "General setup"

    这样,就会生成一个目录,特征就是右侧会出现一个箭头,如图1中第一行。当点击确认键时,会进入这个菜单项,如图2。

    图1

    图2

    (2)     menuconfig

    menuconfig有点类似menu,但区别就在于menu后面多了一个config,这个menu是可以配置的,如图2中的第二行,前面比menu类型多了一个方框,通过空格可以修改这个配置项的选中状态。而且从格式上来看,也是有区别的。格式如init/Kconfig中1131行:

    menuconfig MODULES

    bool "Enable loadable module support"config

    if MODULES

    xx

    endif

    也就是说,配置项是位于if和endif中。其中的部分就是MODULES子目录显示的内容。如果选中了MODULE,那么if和endif中的内容可以显示。如果没有定义,就只能进入一个空目录。 

    (3)     config

    config是构成Kconfig的最基本单元,其中定义了配置项的详细信息。定义的格式参考arch/arm/Kconfig中的第8行。

    config ARM

             bool

             default y

             select xxxxxxxxxx

             help

               ???????????

    可知,config需要定义名称,与menuconfig相同。这个名称不但用于裁剪内核中,还用于配置项之间的相互依赖关系中。

    config的类型有5种,分别是bool(y/n),tristate(y/m/n),string(字符串),hex(十六进制),integer(整数)。其中,需要特别介绍一下bool和tristate,bool只能表示选中和不选,而tristate还可以配置成模块(m),特别对于驱动程序的开发非常有用。

    其他语法如下:

    1)       prompt:提示,显示在make menuconfig中的名称,一般省略。下面两种写法相同。

    a.       bool “Networking Support”

    b.       bool

    prompt “Networking Support”

    2)       default:默认值

    一个配置项可以有多个默认值,但是只有第一个被定义的值是有效的。

    3)       depends on/requires:依赖关系

    如果依赖的配置项没有选中,那么就当前项也无法选中。

    4)       select:反向依赖

    如果当前项选中,那么也选中select后的选项。

    5)       range:范围,用于hex和integer

    range A B表示当前值不小于A,不大于B

    6)       comment:注释

    (4)     choice/endchoice

    choice的作用,多选一,有点像MFC中的Radio控件。参考arch/arm/Kconfig第205行。

    choice

             prompt "ARM system type"

             default ARCH_VERSATILE

             ???????

             config ARCH_S3C2410

             bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443"

             select GENERIC_GPIO

             select ARCH_HAS_CPUFREQ

             select HAVE_CLK

    ???????

             endchoice

    显示的结果如图3,进入这一项后,显示结果如图4.

    图3

    图4

    可见,choice有点类似于menu,是在子窗口里选择,但是不同的是子窗口中只能选择一项。在prompt后会显示当前选择项的名称。 

    (5)     source

    source只是将另外一个Kconfig文件直接复制到当前位置而已。但它的作用也是明显的,可以将这个系统贯穿在一起。从开始位置arch/arm/Kconfig,来将整个系统都作为配置型。 

    五.配置分析

             当我们进入了linux源码的根目录时,输入make menuconfig。假设,此时根目录已经存在了.config,如果不存在,会自动生成。这时,在命令行显示如图5.

    图5

    显然,在执行make menuconfig时,会自动调用scripts/Kconfig/mconf arch/arm/Kconfig开始系统的配置,那么arch/arm/Kconfig就是配置的起点。这个文件会通过source指令来调用其他目录下的Kconfig文件,从而完成整体配置。这样,arch/arm/Kconfig就可以理解成main函数,而source指令就有点类似于include。可以按照上面的语法,来分析Kconfig文件。

    转载自 "http://blog.csdn.net/huanhaisia/article/details/6855809"

  • 相关阅读:
    高精度计算
    高精度除以低精度
    P1258 小车问题
    POJ 2352 stars (树状数组入门经典!!!)
    HDU 3635 Dragon Balls(超级经典的带权并查集!!!新手入门)
    HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)
    POJ 1703 Find them, Catch them(确定元素归属集合的并查集)
    HDU Virtual Friends(超级经典的带权并查集)
    HDU 3047 Zjnu Stadium(带权并查集,难想到)
    HDU 3038 How Many Answers Are Wrong(带权并查集,真的很难想到是个并查集!!!)
  • 原文地址:https://www.cnblogs.com/skywang12345/p/Driver_config.html
Copyright © 2011-2022 走看看