编译Linux内核过程记录

下载linux kernel 2.6.x版本,官方网站下载 http://www.kernel.org/pub/linux/kernel/v2.6/ 。我下载的是2.6.18,下载这个版本来编译并没有什么特别的理由,我随机选择的。

将压缩包解压在usr/src目录下新建的linux-2.6.18目录下,然后cd linux-2.6.18进入该目录。

make menuconfig 使用文本方式配置编译选项。使用此命令编译前,需要安装libncurses5-dev,否则会报告

“? In ? file ? included ? from ? scripts/kconfig/lxdialog/checklist.c:24:
scripts/kconfig/lxdialog/dialog.h:31:20: ? error: ? curses.h: ? 没有那个文件或目录”

这个编译错误。

如果一切顺利,make menuconfig这个命令将会调出配置菜单窗口:

linux make menuconfig

linux make menuconfig

可以根据上图中的操作说明在配置菜单中选择编译参数。这里有比较详细的Linux内核编译选项说明,可以参考。

配置完成后,就可以输入make命令来开始编译了。

我在编译的时候遇到了如下两个错误:

1。 ‘PATH_MAX’ undeclared , 是在编译/scripts/mod目录下的sumversion文件时遇到了未定义的宏PATH_MAX,解决方法: 在/scripts/mod目录下的sumversion.c文件开始部分加入#include 即可,在include/linux目录下的limits.h文件中定义了这个宏。

2。 undefined reference to `__udivdi3′,undefined reference to `__umoddi3′,根据网上查到的资料,是因为gcc4.3的版本较新,编译较老的内核版本时会出现这个问题,其实是GCC的一个bug。参考这两个文档:12。解决方法:在根目录下的Makefile文件中,找到下面的内容:

CFLAGS?? := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -fno-common

增加一行,修改成:

CFLAGS?? := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -fno-common \
-fno-tree-scev-cprop

除此两处之外,没遇到其他的error,但是warning还是有一些的,对这些warning没仔细分析和清除。这样,n小时之后,make编译就成功完成了。

然后,make modules编译内核模块;make modules_install安装模块;make install安装内核。

cd /boot
mkinitramfs -o initrd.img-2.6.18 2.6.18 创建内核镜像。

update-grub 更新grub引导后,reboot重启,就可以在grub中选择新的内核来引导了。

参考资料:

Kernel compile(Ubuntu)

编译内核操作流程

How to: Compile Linux kernel 2.6

Mini HowTO: Compile the Linux Kernel (2.6.*)

The Linux Kernel HOWTO

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>