Linux-Kernel-Learning
Linux-Kernel-Learning copied to clipboard
Linux kernel 2.6.26 编译
前一段时间一直在Ubuntu 12.04下编译Linux kernel 2.6.24,但一直没 成功。其原因是高版本的Ubuntu自带的gcc编译器的版本比较高,一般在4.6以上。但2.6.24版本的内核相对于现在来说比较老,高版本的gcc对一些比较老的C语言和Make文件特性支持的不是很好,因此在编译的时候经常出错,解决这个问题的有两种方案,其一,重新安装一个比较低版本的gcc编译器,经测试,4.5.1版本的gcc能够编译成功2.6.26版本的内核。其二,观察编译内核过程中的错误信息,根据相关错误信息修改相应的.c文件盒Makefile文件,从而达到消除错误的目的,这个过程比较繁琐,工作量很大,而且特别耗时。
出现的各种乱七八糟的问题:
我使用的是Fedora 14操作系统来编译2.6.26版本的内核,下面简述编译过程中遇到的相关问题及其解决方案和相关的编译步骤:
- 问题1:编译过程中出现如下错误代码:
It fails with the following error:
Makefile:1550: *** mixed implicit and normal rules. Stop.
make[1]: Leaving directory ‘/home/Jan/devel/boox/rootfs/kernel/linux-2.6.26'
解决方案:这是由于make工具版本过高导致的。Fedora 14自带的make工具的版本是3.82,它不支持Makefile文件的一些比较老的特性,所以我们需要重新安装3.81版本的make工具。
- 问题2:在使用命令make menuconfig时,系统提示如下错误:
Install ncurses(ncurses-devel) and try again
解决方案:这是由于系统缺少ncurses-devel系统库所致,我们下载安装该库文件即可解决该问题
- 问题3:在使用命令make bzImage时,系统提示如下错误: 当出现:
scripts/unifdef.c:209:25: error: conflicting types
for ‘getline’
解决方案:修改linux 内核文件根目录下的scripts/unifdef.c文件,把(共3处的)getline改为别的名字,比如get_line:
①//static Linetype getline(void);
static Linetype get_line(void);
② for (;;) {
linenum++;
//lineval = getline();
lineval = get_line();
trans_table[ifstate[depth]][lineval]();
③static Linetype
//getline(void)
get_line(void)
{
即可。
- 问题4:在编译2.6.24版本内核时,出现如下错误:(2.6.26版本内核编译时不存在这个问题)
解决方案:在所在行用"=q"替换"=r"即可。(replace "=r" with "=q" in the affected line."dil" (lower 8 bits part of [RE]DI) register is inexistent underx86-32, only available under x86-64.)
编译内核的详细过程为:
- 1.使用命令uname –r 查看自己linux系统的内核版本
- 2.从中心ftp上下载最新的内核tar包到/usr/src/kernels目录,并解压。解压命令如图:
- 3.进入解压后的内核源码包目录,接着使用命令 make mrproper ,命令的作用是在每次配置并重新编译内核前需要先执行 “make mrproper”命令清理源代码树,包括过去曾经配置的内核配置文件“.config”都将被清除。即进行新的编译工作时将原来老的配置文件给删除到,以免影响新的内核编译。
- 4.使用make menuconfig 命令,进行内核定制,选择自己想要的功能,这里以编译内核,让linux内核支持ntfs文件系统为例来讲解,具体过程见图: 调出文字界面的配置菜单,接下来选择文件系统选项: 敲回车后,继续选择能支持Windows 文件系统类型的选项: 最后选择我们需要的NTFS文件系统类型,编译到内核模块里,并且选择exit 退出: 最后选择退出: 选择yes,保存新的内核配置文件: 看一下生成的.config文件的位置和属性
- 5.在编译内核之前,需要使用“make dep”命令生成内核功能间的依赖关系,为编译内核做好准备。
- 6.使用“make bzImage”命令进行内核编译,编译过程将持续相当长的时间(20分钟以上),请耐心等候。
- 7.使用“make modules”命令编译内核模块,编译过程将持续相当长的时间(30分钟以上),请耐心等候。
-
- 内核模块编译好后需要安装到Linux系统的相应目录中才可以使用,使用“make modules_install”命令安装内核模块。“/lib/modules/”目录用于存放Linux系统中的内核模块,内核的各个版本都在该目录下建有子目录用于存放内核模块。
- 9.使用“make install”命令安装新内核到系统中,并且自动为是用新内核作必要的配置。
- 10.查看编译成功后,在/boot/目录下会生成vmlinuz-2.6.23.9 的文件和能看到/boot/grub/grub.conf里的启动项。
- 11.到/lib/modules/2.6.23.9/kernel/fs 目录下查看新生成的支持NTFS文件系统的内核模块。
- 12.重启计算机,看到开机画面后,敲回车键选择新的内核引导系统。
- 13.进入系统后可以使用“uname -r”查看新内核版本,至此内核编译已经成功完成。