码迷,mamicode.com
首页 > 系统相关 > 详细

编译Linux内核

时间:2016-01-09 21:26:52      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:

这篇文章的目的是帮助理解如何编译一版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内核源代码根目录下执行:

  1. make mrproper 先清除之前的配置。

  2. make O=/home/name/build/kernel menuconfig 使用menuconfig来配置内核,O变量为build目录,也可以不设置。

  3. make O=/home/name/kbuild/kernel 按照配置信息,来编译内核。

  4. sudo make O=/home/name/kbuild/kernel modules_install install 编译完成之后安装模块。将编译的模块写到 /lib/modules/ 目录下。

或许你已经按照上面的步骤将内核编译出来了。不过还是有必要深入了解一下。

Kconfig

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‘的最小配置

KBuild

在配置完 Linux 内核之后就可以编译了。KBuild 使用一种更为通用的编译方式来进行编译。这部分内容打算重新写一篇文章整理一下。这里就暂时略过。

编译流程

讲了那么多,还是为了能够将内核编译出来。这里以编译x86平台下的linux内核为例,给出图文形式的流程。

  1. 下载并解压源代码

  2. make clean make mrproper

    技术分享

  3. 配置内核,新手对内核的选项未必熟悉,这里使用defconfig的方式。等以后经验多了自然对这些配置选项熟了。

    技术分享

  4. 编译内核,使用一个简答的 make 命令即可。

  5. 安装模块!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

编译Linux内核

标签:

原文地址:http://www.cnblogs.com/Gru--/p/5117149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!