热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

当前位置 :| 主页>Linux教程>内核研究>

Linux内核编译完整过程

来源: 作者: 时间:2007-04-17 Tag: 点击:

通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过程中的一些实际经验。

内核简介

内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源程序代码。全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内核则是这些特点的最直接的代表。

想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系统是如何工作的。通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方夜谭。其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要重新编译内核。在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得莫名其妙过。再次,我们可以对内核进行修改,以符合自己的需要。这意味着什么?没错,相当于自己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是要增加并实现自己需要的功能。在Windows下,除非你是微软的核心技术人员,否则就不用痴心妄想了。

内核编译模式

要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内核中(build-in),也可以把该部分编译成模块(module),动态调用。如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块。

实际的内核编译阶段:

一、Linux内核源代码包的获取http://www.kernel.org,编译内核需要root权限,以下操作都假定你是root用户。请把你需要升级的内核拷贝到/usr/src/下(下文中以2.4.18的内核的linux-2.4.18.tar.gz为例),命令为

 

#cp linux-2.4.18.tar.gz /usr/src

 

二、解压源代码包和建立相应的链接:

在当前的/usr/src内容里,注意到有一个linux- 2.4的符号链接,指向一个linux-2.4.7-10(以REDHAT7.2为例)的目录。这就是你所装linuxkernel源代码,删除这个链接。

现在解压我们下载的源程序文件。如果所下载的是.tar.gz.tgz)文件,请使用下面的命令:#tar -zxvf linux-2.4.18.tar.gz.tar.gz

如果你所下载的是.bz2文件,例如linux-2.4.18.tar.bz2,请使用下面的命令

#bzip2 -d linux-2.4.18.tar.bz2

#tar -xvf linux.2.4.18.tar

文件将解压到/usr/src/linux目录中,我们把它稍作修改:

#mv linux linux-2.4.18

#ln -s linux-2.4.18 linux(重新建立指向刚刚解压的linux-2.4.18的链接)

三、检查源代码目录下有没有不正确的.o文件以及文件的互相依赖,运行以下命令:

cd /usr/src/linux

make mrproper

 

四、创建指向你所编译内核的asm  linux  scsi链接

为确保/usr/include/目录下的asmlinuxscsi等链接是指向要升级的内核源代码的。它们分别链向源代码目录下的真正的、该计算机体系结构(对于PC机来说,使用的体系结构是i386)所需要的真正的include子目录。如:asm指向/usr/src/linux/include/asm-i386 等。若没有这些链接,就需要手工创建,按照下面的步骤进行:

# cd /usr/include/

# rm -r asm linux scsi

# ln -s /usr/src/linux/include/asm-i386 asm

# ln -s /usr/src/linux/include/linux linux

# ln -s /usr/src/linux/include/scsi scsi

  这是配置非常重要的一部分。删除掉/usr/include下的asmlinuxscsi链接后,再创建新的链接指向新内核源代码目录下的同名的目录。这些头文件目录包含着保证内核在系统上正确编译所需要的重要的头文件。

 

五、内核配置

    接下来的内核配置过程比较烦琐,但是配置的适当与否与日后linux的运行直接相关,有必要了解一下一些主要的且经常用到的选项的设置。

配置内核可以根据需要与爱好使用下面命令中的一个:

#make config(基于文本的最为传统的配置界面,不推荐使用)

#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)

#make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)

#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)

  这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,那么就推荐你使用这个命令,界面如下:

  如果你不能使用Xwindow,那么就使用make menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了,下图为make menuconfig的界面:

  选择相应的配置时,有三种选择,它们分别代表的含义如下:

  Y-将该功能编译进内核

  N-不将该功能编译进内核

  M-将该功能编译成可以在需要时动态插入到内核中的模块

  如果使用的是make xconfig,使用鼠标就可以选择对应的选项。如果使用的是 make menuconfig,则需要使用空格键进行选取。你会发现在每一个选项前都有个括号但有的是中括号有的是尖括号,还有一种圆括号。用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*""M"。这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。



相关文章:
精通initramfs构建step by step
Linux利用kexec迅速切换内核
进程上下文VS中断上下文
内核通知链 学习笔记
linux spi子系统驱动分析
menuconfig 配置选项
《Linux操作系统内核实习》之练习一
udev详解
什么叫微内核,宏内核?
Linux 信号signal处理机制
开发简单的 Linux2.6 内核模块
删除内核的perl脚本
Linux2.6内核usb gadget驱动移植
GCC hacks in the Linux kernel
iomem
kernel学习的想法
让自己的驱动支持udev
linux内核编译步骤
内核的等待队列
Linux内核wait_queue深入分析
升级和删除内核
SD卡驱动分析2
Linux Kernel VDSO本地权限提升漏洞
内核中的TCP的追踪分析-15-TCP(IPV4)的客户端与
linux 2.6内核可加载模块的编译
内核模块HelloWorld
在环回接口上发送一个数据报
ARP初始化
1分钟编译FreeBSD内核
linux设备模型之uart驱动架构分析