linux内核的配置机制及其编译过程

linux内核的配置机制及其编译过程

国嵌第一天第三节:讲解的是内核在X86平台上的配置、安装过程,制作自己的Linux系统,并双系统启动。

《Linux系统移植》第四章

http://blog.csdn.net/zhengmeifu/article/details/7682373

Linux内核具有可定制的特点,具体步骤如下:

1.1.1 配置系统的基本结构

Linux内核的配置系统由三个部分组成,分别是:

1、Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则;

2、配置文件(config.in(2.4内核,2.6内核)):给用户提供配置选择的功能;

3、配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于Ncurses图形界面以及基于Xwindows图形界面的用户配置界面,各自对应于Make config、Make menuconfig和make xconfig)。

这些配置工具都是使用脚本语言,如Tcl/TK、Perl编写的(也包含一些用C编写的代码)。本文并不是对配置系统本身进行分析,而是介绍如何使用配置系统。所以,除非是配置系统的维护者,一般的内核开发者无须了解它们的原理,只需要知道如何编写Makefile和配置文件就可以。

1.1.2 清除临时文件、中间文件和配置文件.

l  make clean

remove most generated files but keep the config

仅仅删除生成的 .o 文件保留配置

l  make mrproper

remove all generated files + config files

l  make distclean

Mrproper + remove editor backup and patch files

确定目标系统的软硬件配置情况,比如CPU的类型、网卡的型号,所需支持的网络协议等。

1.1.3 使用如下命令配置内核:

a) make config:基于文本模式的交互式配置。

b) make menuconfig:基于文本模式的菜单型配置。(推荐使用)

c) make oldconfig:使用已有的配置文件(.config),但是会询问新增的配置选项。

d) make xconfig:图形化的配置(需安装图形化系统)。

make menuconfig 是最为常用的内核配置方式,使用方法如下:

1、使用方向键在各选项间移动;

2、使用“Enter”键进入下一层选单;每个选项上的高亮字母是键盘快捷方式,使用它可以快速地到达想要设置的选单项。

3、在括号中按“y”将这个项目编译进内核中,按“m”编译为模块,按“n”为不选择(按空格键也可在编译进内核、编译为模块和不编译三者间进行切换),按“h”将显示这个选项的帮助信息,按“Esc”键将返回到上层选单。

操作:官网下载内核  https://www.kernel.org/ linux-2.6.29

该命令一定要在内核的根目录下进行,../../linux-x.x.x

[root@embedclub linux-2.6.29]# make distclean

清除以往编译的所有文件,下面进行内核操作,可以用文本的显示,也可以以菜单显示。

[root@embedclub linux-2.6.29]# make menuconfig

可能出现以下错误1:

//Your display is too small to run Menuconfig!

//It must be at least 19 lines by 80 columns.

//make[1]: *** [menuconfig] 错误 1

//make: *** [menuconfig] 错误 2

原因:终端窗口太小,最大化即可解决。

可能出现以下错误2:

***Unable to find the ncurses libraries or the 

***required header files. 

***make menuconfig‘requires the ncurses libraries. 

***Install ncurses(ncurses-devel)and try again. 

make[1]:***[scripts/kconfig/dochecklxdialog]错误1 

make:***[menuconfig]错误2 

 

解决办法:Installing ncurses-devel

输入命令:

sudo apt-get install ncurses-dev 

问题解决后弹出内核配置框。点击空格可以改变选择。

技术分享

使用方法:

在括号中按“y”将这个项目编译进内核中,按“m”编译为模块,按“n”为不选择(按空格键也可在编译进内核、编译为模块和不编译三者间进行切换),按“h”将显示这个选项的帮助信息,按“Esc”键将返到上层选单选择Y(即*)相应的A.c文件变为A.o并最终链接生成到uImage(内核)中,选择M后相应的A.c变为A.o模块。

不进行任何操作,保存内核退出,输入ls -a(-a显示隐藏文件)命令显示多了.config文件,这就是我们配置的结果。

[root@embedclub linux-2.6.29]# ls -a

接下来就可以进行配置了,那么如何进行配置菜单的选择呢?

1.1.4  makefile menuconfig过程讲解

当我们在执行make menuconfig这个命令时,系统到底帮我们做了哪些工作呢?

这里面一共涉及到了一下几个文件我们来一一讲解

? Linux内核根目录下的scripts文件夹

? arch/$ARCH/Kconfig文件、各层目录下的Kconfig文件

? Linux内核根目录下的makefile文件、各层目录下的makefile文件

? Linux内核根目录下的的.config文件、arm/$ARCH/下的config文件

? Linux内核根目录下的 include/generated/autoconf.h文件

整体流程:make menuconfig----make zImage(生成zImage) ---- make modules ----make modules_install----init ramdisk 

1)scripts文件夹存放的是跟make menuconfig配置界面的图形绘制相关的文件,我们作为使用者无需关心这个文件夹的内容

2)当我们执行make menuconfig命令出现上述蓝色配置界面以前,系统帮我们做了以下工作:

首先系统会读取arch/$ARCH/目录下的Kconfig文件生成整个配置界面选项(Kconfig是整个linux配置机制的核心),那么ARCH环境变量的值等于多少呢?

它是由linux内核根目录下的makefile文件决定的,在makefile下有此环境变量的定义:

技术分享

或者通过make ARCH=arm menuconfig命令来生成配置界面,默认生成的界面是所有参数都是没有值的。

比如教务处进行考试,考试科数可能有外语、语文、数学等科,这里相当于我们选择了arm科可进行考试,系统就会读取arm/arm/kconfig文件生成配置选项(选择了arm科的卷子),系统还提供了x86科、milps科等10几门功课的考试题。

3)菜单配置比较麻烦,内核配置通常在一个已有的配置文件基础上,通过修改得到新的配置文件Linux内核提供了一系列可供参考的内核配置文件,位于/linux-2.6.28-omap/Arch/$arm/configs

假设教务处比较“仁慈”,为了怕某些同学做不错试题,还给我们准备了一份参考答案(默认配置选项),存放在arch/$ARCH/configs下,对于arm科来说就是arch/arm/configs文件夹:

技术分享

此文件夹中有许多选项,系统会读取哪个呢?内核默认会读取linux内核根目录下.config文件作为内核的默认选项(试题的参考答案),我们一般会根据开发板的类型从中选取一个与我们开发板最接近的系列到Linux内核根目录下(选择一个最接近的参考答案)。

#根目录下操作

#cp  arch/arm/configs/s3c2410_defconfig  .config

4).config

假设教务处留了一个心眼,他提供的参考答案并不完全正确(.config文件与我们的板子并不是完全匹配),这时我们可以选择直接修改.config文件然后执行make menuconfig命令读取新的选项

但是一般我们不采取这个方案,我们选择在配置界面中通过空格、esc、回车选择某些选项选中或者不选中,最后保存退出的时候,Linux内核会把新的选项(正确的参考答案)更新到.config中,此时我们可以把.config重命名为其它文件保存起来(当你执行make distclean时系统会把.config文件删除),以后我们再配置内核时就不需要再去arch/arm/configs下考取相应的文件了,省去了重新配置的麻烦,直接将保存的.config文件复制为.config即可.

5)经过以上两步,我们可以正确的读取、配置我们需要的界面了

那么他们如何跟makefile文件建立编译关系呢?

当你保存make menuconfig选项时,系统会除了会自动更新.config外,还会将所有的选项以宏的形式保存在

Linux内核根目录下的include/generated/autoconf.h文件下

技术分享

内核中的源代码就都会包含以上.h文件,跟宏的定义情况进行条件编译。

当我们需要对一个文件整体选择如是否编译时,还需要修改对应的makefile文件,例如:

技术分享

我们选择是否要编译s3c2410_ts.c这个文件时,makefile会根据CONFIG_TOUCHSCREEN_S3C2410来决定是编译此文件,此宏是在Kconfig文件中定义,当我们配置完成后,会出现在.config及autconf中,至此,我们就完成了整个linux内核的编译过程。

最后我们会发现,整个linux内核配置过程中,留给用户的接口其实只有各层Kconfig、makefile文件以及对应的源文件。

比如我们如果想要给内核增加一个功能,并且通过make menuconfig控制其声称过程。

首先需要做的工作是:修改对应目录下的Kconfig文件,按照Kconfig语法增加对应的选项;

其次执行make menuconfig选择编译进内核或者不编译进内核,或者编译为模块,.config文件和autoconf.h文件会自动生成;

最后修改对应目录下的makefile文件完成编译选项的添加;

最后的最后执行make bzImage命令进行编译。

1.2 内核配置选项说明

因s6410和6400的资源差不多,主频和外设有点差别,故在board/samsung/下建立自己开发板的项目,取名叫smdk6410。并将smdk6400里的所有文件复制到smdk6410中,进入smdk6410文件夹将smdk6400.c更名为smdk6410.c,并且打开此文件,将里面的6400全部改为6410。打开Makfile,将里面的6400改为6410。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。