前言之前言:谁是这篇文章的读者?
不习惯读英文资料的非LINUX高手
声卡不响光驱不转连不上网等等,只要有问题就行
开发嵌入式操作系统
现在流行的ODL(only disk linux)中做内核部分,那些文章不介绍此点内容。我正在做
,完工后整理资料。
BY THE WAY ,想成为LINUX高手吗?你需要熟练掌握KERNEL COMPILE 、XCONFIGRATER
、LINUXCONFIG、 SAMBA四大利器,你随时可以找到后三者的大量相关资料,但内核编译
就只好啃为数不多的英文了。
笔者耗时3月,搜集并整理大量资料,在儿童节前连续工作18个小时后,给小企鹅送了这
份礼物。
笔者自信是目前为止KERNEL编译方面最完备的中文资料(将不断翻译补充),这可是毕
业论文哪!
为什么要放网上呢?首先找这方面资料太难了,文章对各位LINUX爱好者会有所帮助。其
次,取之于网用之于网。
欢迎使用这篇文章,请随便引用,这才符合LINUX自由软件的精神嘛,不过别忘了提提我
的名字,就算为我的辛苦付了点稿酬。
介于内核方面资料较少,欢迎在这篇文章中添加和修改内容,但不要过多删除,笔者列
表要加入你的名字,让我们为把它变成数百页的资料而努力。OK,交个朋友吧, 我是玉
玉安,email :ziboyuyuan@263.net <ZIBOyuyuan@263.net>
目录
序言
第一章 内核编译的基础
第一节内核简介
第二节内核版本
第三节编译原因
第四节准备工作
第二章 内核编译的流程
第一节编译开始
第二节配置内核 {核心内容}
1.代码成熟等级
2..处理器类型和特色
3.对模块的支持
4.基本的选择
5.即插即用支持
6.块设备支持
7.网络选项
8.电话支持
9.SCSI设备的支持
10.I2O接口适配器
11.网络设备支持
12.配置业余无线广播
13.红外支持
14.ISDN的文件系统
15.旧型光驱类型(非IDE界面的光驱)
16.字符设备
17.USB支持
18.文件系统
19.控制台驱动
20.声卡驱动
21.Kernel hacking
第三节编译内核
第四节启用内核
附录:LILO分析
第三章 内核编译的应用
第一节嵌入式Linux技术
第二节你的Linux有多大(及实践结果)
结束语
参考文献
序言
近几年,linux大行其道,令不满windows蓝屏的使用者跃跃欲试,结果发现linux安装不
及windows方便,界面不及windows友好,配置不及windows容易,软件不及windows丰富
,以至浅尝辄止。
其实, Linux有windows无可比拟的两个优势:网络应用和嵌入式技术,这也正是未来最
有前途的方向。同时此课题是从理论上设计具有嵌入式Linux操作系统器件的重要组成部
分。
如要涉足这两个方面,就必须对内核有深刻理解。当然,您可以从源代码入手,但前提
是您拥有程序设计和操作系统等多方面专业知识,否则,就利用现成的Linux kernel从
编译内核开始吧。不幸的是,内核编译方面的资料匮乏。以上两个原因使我写这篇论文
成为必要。我可以自信得说,这是目前最详尽的内核编译方面的中文资料。
值得一提的是,我在搜集翻译资料的过程中,获得了操作系统、程序设计、硬件设备、
网络通信等各方各面的知识,极大的拓宽了视野,真正学有所获。
感谢所有为Linux发展作出贡献的人,感谢所有Linux中文网站为促进Linux在中国的发展
作出的不懈努力,他们是我搜集资料的来源。
特别感谢我的指导老师——官伯然教授和高斌博士,正是他们的辛勤指导让我顺利完成
毕业设计。
西电科大 :李玉元 2001/6/1
备注:#----------后跟小的选项
##---------后还有更细选项
注意------上机实践结果
第一章 内核编译的基础
第一节 内核简介
内核,是一个操作系统的核心,它负责管理系统的进程、内存、设备驱动程序、文件和
网络系统,决定着系统的性能和稳定性。 就好比DOS下的IO.SYS和MSDOS.SYS一体,我
们可以把这两个文件叫做DOS的核心。Linux也有它的核心,通常在根目录下,一个叫vm
linuz的文件。我们用这个文件来控制我们的整台PC,包括周边设备和软硬磁盘机、CD-
ROM、声卡等。简单地说,核心就是操作系统本身。没有了它,就像一个无人住的家,没
有人去维持这个家的动作。一个安定的家需要一个很用心已能当机立断的主人:一部电
脑也需要很有效率已稳定的核心,也就是操作系统。因此,核心是整个系统维持下去的
关键。
Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/
linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源程序代
码。任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明
显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内核则是这
些特点的最直接的代表。
想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系统是如何
工作的。通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方
夜谭。其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要
重新编译内核。在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得
莫名其妙过。再次,我们可以对内核进行修改,以符合自己的需要。这意味着什么?没
错,相当于自己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是
要增加并实现自己需要的功能。在Windows下,除非你是微软的核心技术人员,否则就不
用痴心妄想了。
先介绍一下编译核心的选项,希望能对大家消除对内核的神秘感有所帮助。
1.代码成熟等级
2..处理器类型和特色
3.对模块的支持
4.基本的选择
5.即插即用支持
6.块设备支持
7.网络选项
8.电话支持
9.SCSI设备的支持
10.I2O接口适配器
11.网络设备支持
12.配置业余无线广播
13.红外支持
14.ISDN的文件系统
15.旧型的光驱类型(非IDE界面的光驱)
16.字符设备
17.USB支持
18.文件系统
19.控制台驱动
20.声卡驱动
21.Kernel hacking
第二节 内核版本
由于Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布
给他人使用。Linux的开发采用的是集市模型(bazaar,与cathedral--教堂模型--对应
),为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。一个树是稳
定树(stable tree),另一个树是非稳定树(unstable tree)或者开发树(developm
ent tree)。一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所
做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同
的改进。一旦开发树经过了足够的发展,开发树就会成为新的稳定树。开发数就体现在
源程序的版本号中;源程序版本号的形式为x.y.z:对于稳定树来说,y是偶数;对于开
发树来说,y比相应的稳定树大一(因此,是奇数)。确定是以″ root ″的身份签入,
然后cd 到 /usr/src 。uname -r 这个指令将会显示版本。内核版本的更新可以访问<h
ttp://www.kernel.org/>。
第三节 编译原因
Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了
旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的
系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。
通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、更稳
定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是
Linux使用者的必要操作内容。
为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主
要有下面四个考虑:
---自己定制编译的内核运行更快(具有更少的代码)
---系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)
---不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞
---将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些
以上是针对成熟的Linux套件如Redhat Linux而言,我的目的是为建造嵌入式Linux操作系
统做准备,也是必由之路。
第四节 准备工作
第一部分 新版本内核的获取和更新
Linux内核版本发布的官方网站是<http://www.kernel.org/>,国内各大ftp上一般都可
以找到某些版本的内核。新版本的内核的发布有两种形式,一种是完整的内核版本,另
外一种是patch文件,即补丁。完整的内核版本比较大,比如linux-2.4.0-test8.tar.b
z2就有18M之多。完整内核版本一般是.tar.gz(.tgz)文件或者是.bz2文件,二者分别
是使用gzip或者bzip2进行压缩的文件,使用时需要解压缩。patch文件则比较小,一般
只有几十K到几百K,极少的会超过1M。但是patch文件是针对于特定的版本的,需要找到
自己对应的版本才能使用。
编译内核需要root权限。把需要升级的内 拷贝到/usr/src/下(下文中以2.2.16的内核
的linux-2.2.16tar.gz为例),命令为
#cp linux-2.2.16tar.gz /usr/src
先查看当前/usr/src的内容,注意到有一个linux的符号链接,它指向一个类似于linux
-2.2.14(对应于现在使用的内核版本号)的目录。首先删除这个链接:
#cd /usr/src
#rm -f linux
现在解压下载的源程序文件。如果所下载的是.tar.gz(.tgz)文件,使用命令:
#tar -xzvf linux-2.2.16tar.gz
如果下载的是.bz2文件,例如linux-2.2.16tar.bz2,使用命令
#bzip2 -d linux-2.2.16tar.bz2
#tar -xvf linux-2.2.16tar
现在再来看一下/usr/src下的内容,发现现在有了一个名为linux的目录,里面就是需要
升级到的版本的内核的源程序。还记得那个名为linux的链接么?之所以使用那个链接就
是防止在升级内核的时候会不慎把原来版本内核的源程序给覆盖掉了。现在也需要同样
处理:
#mv linux linux-2.2.16
#ln -s linux-2.2.16 linux
如果还下载了patch文件,比如patch-2.2.16,就可以进行patch操作(下面假设patch-
2.2.16已经位于/usr/src目录下了,否则需要先把该文件拷贝到/usr/src下):
#patch -p0 < patch-2.2.16
第二部分 准备主机板和相关硬件的说明手册
其实也不用太详细,只要知道您的硬件是属于哪一类型就行了。例如:有一张SCSI卡,
那就要知道这张卡的名字,有一台cd-rom,就要知道这台光驱是哪一种牌子的,是否为标
准的IDE/ATAPI界面,还是另有专属接口卡呢?或者,主机版是否有支持Triton芯片(通
常586以上的电脑常有),这些信息能帮助我们,使得设定变得清楚且容易。
因此,不管您有什么使用手册,准备好吧。即使现在不用,将来还是会用到的(设X-w
indow system时要显示卡的手册)。
第三部分 检查声卡的IRQ设定和其种类
如果配有一张声卡,除了要知道卡的种类外(例如 Sound Blaster)还需要知道这张卡
的IRQ地址。一般来说,卢卡的IRQ地址是5或7而IO地址则为220。DMA则l,不过,有时不
同的声卡可能会有不同的设定。因为稍后的选项里,就会要填入这些数字。
第四部分 编译核心的硬件需求
在编译核心时,确定您的RAM最好在8MB以上, 否则可能会很慢而且问题会很多,记得查
看swap有没有打开(用free指令)。此外,最好不要超频,不然很有可能会发生signal
11的错误,使得编到一半的核心停了下来,其实编译核心就好比编译程序一样,只是因
为构成核心的程序太多了,因此我们能小心尽量小心。
第二章 内核编译的流程
概述编译的流程:
编译开始----- make mrproper;检查所需的连接
配置核心
编译核心
编辑/etc/lilo.conf
重新启动新核心
重新启动机器
发现并修理故障(仔细看我的文章,应该没多少问题了)
第一节 编译开始
通常要运行的第一个命令是:
#cd /usr/src/linux
#make mrproper
该命令确保源代码目录下没有不正确的目标.o文件以及文件的互相依赖。如使用刚下载
的完整的源程序包进行编译,本步可以省略。而如果多次使用了这些源程序编译内核,
那么最好要先运行一下这个命令。
确保/usr/include/目录下的asm、linux和scsi等链接是指向要升级的内核源代码的。它
们分别链向源代码目录下的真正的、该计算机体系结构(对于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下的asm、linux和scsi链接后,再创
建新的链接指向新内核源代码目录下的同名的目录。这些头文件目录包含着保证内核在
系统上正确编译所需要的重要的头文件。也是上面又在/usr/src下"多余"地创建了个名
为linux的链接的原因之一.
一旦万事俱备,转到/usr/src/linux。现在你也许想停下细读一下文档文件,实际
上如果你有些特别的硬件,或几种光驱驱动程需要自己动手设置,他们通常这样做,当
引导时这些驱动程序将给出警告,这并不碍事他们照常工作少,阅读扩展名为.txt .h.
c的文件。通常我发现他们具有共性且易于配置。如果你不想冒险,你没必要做。记住你
照样可以解开tar文件(或再次安装.rpm文件)恢复前的文件。
第二节 配置内核 核心内容
接下来的内核配置过程比较烦琐,但是配置的适当与否与日后Linux的运行直接相关,有
必要了解一下选项的设置。
配置内核可以根据需要与爱好使用下面命令中的一个:
#make config(基于文本的最为传统的配置界面,不推荐使用)
#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用,必须安装ncurse
s-dev和tk4-dev库)
#make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)
#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦
)
如果不能使用Xwindow,那么就使用make menuconfig好了。界面虽然比上面一个差
点,总比make config的要好多了。
选择相应的配置时,有三种选择,它们分别代表的含义如下:
Y--将该功能编译进内核
N--不将该功能编译进内核
M--将该功能编译成可以在需要时动态插入到内核中的模块
在每一个选项前都有个括号, 但有的是中括号有的是尖括号,还有一种圆括号。 用空格
键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*"和"M"。
这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模
块。而圆括号的内容是要在所提供的几个选项中选择一项。
在编译内核的过程中,最烦杂的事情就是这步配置工作了,不清楚到底该如何选取这些
选项。实际上在配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同
的需要选择。选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编
译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的
环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部
分功能代码直接编译到内核中。下面对选项分别加以介绍。