标签:
这篇文章的目的是帮助理解如何编译一版Linux内核。熟悉Kconfig KBuild工具。无论是自己修改自己正在使用linux内核还是做嵌入式的交叉编译,都会有一些帮助。
如果大家接触过一些Linux下的开源软件,就会知道它们使用 autotools 来进行配置及编译。通过执行./config
--> make
--> make install
命令来编译源代码。Linux内核的编译也需要先配置再编译。配置使用 Kconfig , 编译使用 KBuild , 这两个工具支撑起了Linux内核的编译体系,它们在makefile的统一管理下来完成配置编译工作。
还是先下载一版内核源码,方便接下来的说明。可以到 Linux 的官网上下载自己想要的版本的内核。这里以Linux-2.6.29.tar.bz2 http://www.kernel.org/pub/linux/kernel/v2.6/ 为例。下载解压。
在 README 中,其实已经教我们如何来配置、编译、启动新内核了。我这里就按照REAME文件先给出配置、编译内核的流程。在linux内核源代码根目录下执行:
make mrproper 先清除之前的配置。
make O=/home/name/build/kernel menuconfig 使用menuconfig来配置内核,O变量为build目录,也可以不设置。
make O=/home/name/kbuild/kernel 按照配置信息,来编译内核。
sudo make O=/home/name/kbuild/kernel modules_install install 编译完成之后安装模块。将编译的模块写到 /lib/modules/ 目录下。
或许你已经按照上面的步骤将内核编译出来了。不过还是有必要深入了解一下。
Linux 内核源代码支持二十多种体系结构的处理器,还有各种各样的驱动程序等选项。因此,在编译之前必须根据特定平台配置内核源代码。Linux 内核有上千个配置选项,配置相当复杂。所以,Linux 内核源代码组织了一个配置系统。可以使用下面的模型图先来理解一下Kconfig的工作原理
其实很简单,就是解析配置文件来生成宏定义,从而控制代码的编译或者makefile中模块编译与否。这里以 make menuconfig
为例,说明下makefile中的执行流程。首先在源代码根目录下的Makefile文件中寻找该目标,如下,%表示通配符。
然后会继续执行 $(Q)$(MAKE) $(build)=scripts/kconfig $@
这个命令。其中$(build)是通过 include
的方式声明的。
然后打开 ./scripts/Kbuild.include
文件,查找 build
的定义:
那么上面的这条命令展开就是 make -f scripts/Makefile.build obj=scripts/kconfig menuconfig
这种命令格式是 linux 所使用的 kbuild makefile 方式。最终调用的是 scripts/kconfig
目录下的 Makefile 文件。那么我们继续查看 scripts/kconfig/Makefile
找到 menuconfig
如下:
它依赖于 scripts/kconfig/mconf
最终调用的命令为:scripts/kconfig/mconf arch/x86/Kconfig
以 x86 平台为例。也就是使用 mconf 这个工具来解析 arch/x86/Kconfig
文件,然后我们进行的配置,配置界面如下:
就可以在源代码根目录下生成配置好的.config文件。可以打开.config文件看看里面的内容。
为以后的编译工作做准备。如果有兴趣的同学也可以利用编译好的 mconf 工具来解析自己的所编写的 Kconfig 文件。说不定会在以后自己的项目中遇到。关于 Kconfig 配置文件的语法可以参考 /linux-2.6.29/Documentation/kbuild$ vim kconfig-language.txt 或者网上的资料。这里不再表述。
其他的配置方式原理都是一样的。只不过配置方式还有界面上的差异。这里列出一个表,可以都试一试。
配置方式 | 功能 |
---|---|
config | 通过命令行程序更新当前配置 |
menuconfig | 通过菜单程序更新当前配置 |
xconfig | 通过QT图形界面更新当前配置 |
gconfig | 通过GTK图形界面更新当前配置 |
oldconfig | 通过已提供的.config文件更新当前配置 |
randconfig | 对所有的选型随机配置 |
defconfig | 对所有的选型使用缺省配置 |
allmodconfig | 对所有的选型尽可能选择‘m‘ |
allyesconfig | 对所有的选项尽可能选择‘y‘ |
allnoconfig | 对所有选型尽可能选择‘n‘的最小配置 |
在配置完 Linux 内核之后就可以编译了。KBuild 使用一种更为通用的编译方式来进行编译。这部分内容打算重新写一篇文章整理一下。这里就暂时略过。
讲了那么多,还是为了能够将内核编译出来。这里以编译x86平台下的linux内核为例,给出图文形式的流程。
下载并解压源代码
make clean make mrproper
配置内核,新手对内核的选项未必熟悉,这里使用defconfig的方式。等以后经验多了自然对这些配置选项熟了。
编译内核,使用一个简答的 make
命令即可。
安装模块!sudo make modules_install install
如果编译正确的话,在 ./arch/x86/boot 文件夹下就生成好了新内核。
编译内核的过程中难免会出现一些错误。去Google或者Baidu上找答案呗。下面是我编译内核过程中出现的错误还有解决方法。
gcc: error: elf_i386: No such file or directory http://blog.csdn.net/chenyu123123/article/details/8481772
这篇文章讲解了内核在编译过程中所使用文件格式的。比如vmlinux 各种 Image等等。 http://www.cnblogs.com/hnrainll/archive/2011/06/10/2077961.html
标签:
原文地址:http://www.cnblogs.com/Gru--/p/5117149.html