2008下半年软考指定用书鸟哥的LINUX私房菜Linux命令、编辑器与Shell编程新蛋中国购物
发新话题
打印

内核原理及最新版内核2.6.18.3编译方法

内核原理及最新版内核2.6.18.3编译方法

内核编译对于很多初学者来说,似乎总感觉是个深不可测东西,要学习很多知识,有很多经验才能
完成,诚然,要真正把内核分析透,彻底掌握,绝非一朝一夕之事,但是,学习一下编译内核,并
且,实现初步的内核定制却可以是朝夕之事。本文先讲述Linux的基本构成及原理,然后,以目前
最新版本的内核2.6.18.3(笔者编译后的几天内,马上出现了2.6.18.19)为例讲述一下编译过程。

首先简单讲述一下内核的原理。
任何操作系统软件都可以被分为两部分程序,内核与外壳。
内核的功能一般都括外设管理(如网卡、声卡、显卡、硬盘等)、内存管理、进程管理、文件管理等几部分程序,网络操作系统还包括内装的

网络管理。外壳就是人机交互程序,包括两类,一类是操作界面,有CUI(命令界面)风格和GUI(图形界面)风格两种,为应用者准备的;另

一类是编程界面,也就是我们平常所说的API集合(应用程序函数接口),为开发者准备的。第三方开发厂商可以利用API在Linux上开发自己

的各种应用程序,运行在操作系统上。
    在微软的Windows系列操作系统中,这两部都是由其自己开发,自己使用,自维护的,并且,也很难将Windows内核程序与外壳程序分开,

Windows内核与外壳都存在于你安装完Windows后的Windows目录或是Winnt目录下,使用Windows的用户,感觉这两者的界限并不明显。也不存

在着内核编译或更新这一说法,因为一切都是在安装WINDOWS时一次完成的,并且,用户拿到的只是编译好的Windows的二进制程序文件。
        但在Linux下的情况就完全不同了,内核是以源代码的形式发布的,因此,用户如果需要Linux操作系统,就需要自己编译这些源代码
生成可以运行的二进制内核,当然,现在的厂商像像RedHat、NOVELL等都为用户编译好了二进制的,对于不需要编译内核的用户,可以直接使

用。
        Linux内核是用C语言开发出来的,有人可能会认为,自己即不懂太通C语言,甚至不懂编程,编译内核会遇到很大的困难,因为编译

本身就是程序设计中的操作。其实这个担心是不必的,因为,Linux内核开发者考虑到很多人会不懂C语言,因此,他们编写了几个脚本命令,

使得编译内核步骤变得十分简单,因此,即使你不懂C语言,你也可以为世界上最流行的操作系统编译当前世界上最新版的内核,这似乎是不

可想象的!但事实就是这样。
        为什么需要编译内核呢?答案很简单:就是产生一个更适合你的机器硬件需要的、速度更快更稳定的内核。
Linux内核提供了很多功能,你可能只需要其中的一部分,并且,让它们按照你的工作情况发挥作用,这时,你可以把内核中不需要功能删除

掉,重新生成一个新内核,这个过程就是自己重新编译内核。
     Linux内核(编译好之后的)由两个二进制文件(initrd-x.x.xx.x和vmlinuz-x.x.xx.x:x.x.xx.x代表版本号)、一个文本格式的文件

(System.map-x.x.xx.x)及若干数量的模块文件构成,可以说,这些文件决定了Linux操作系统的基本功能,比方说多任务、网络等。

vmlinuz又是最主要核心文件,Linux的核心功能都是由它而来的,initrd主要是在操作系统启动时起作用,当启动成功之后,它就不再使用,

System.map是个系统符号表,内部记录了内核函数的地址(Linux内核本身就是由许许多多的函数构成的一个大程序),有时编程时,需要用

到这张符号表。而模块文件是归属vmlinuz直接或间接调用的,属于内核的一部分,但是在系统 运行期间,可以随机地加载或御载,这样做的

主要是为了让内核尽量小而稳定且启动速度快,但功能又不能删除太多。
        Linux的外壳(Shell)很多,常用的有:bash、zsh、tcsh等,注意,外壳本身也是一个程序,是操作人员与内核间的传令兵,比方说

,用户要运行一个程序(启动一个进程),那么,用户输入一条启动程序的命令给外壳(Shell),外壳在确认这条命令的功能后,就把这个

功能信息传给内核,内核的进程子模块就负责创建并运行进程。外壳与内核的结构关系就像是蛋壳与蛋黄。从功能关系上讲,外壳相当于汽车
的操纵装置,内核相当于汽车的发动机系统。尽管Linux的外壳很多,每个外壳下支持的命令也不全一样,但究竟能提供给用户什么样的功能
是由内核决定的,就像汽车究竟能跑多快,是发动机决定的,而不是操纵装备决定的。用户可以根据自己的需要选择任何一种外壳程序使用,
当然,也可以自己开发。外壳本质上就是一个命令解释程序。
        Linux上的第三方的软件很多,基本上所有领域的应用都能在它上面找到需要的软件,比方说,像Web服务的Aapche、Tomcat,数据
库服务的Oracle、MySQL等,域名服务的Bind等,游戏、媒体播放办公自动化、图形处理等,Linux上的软件相当丰富。这一点,Linux诞生之初

的状况与现在的情况已经不可同日而语了,目前,Linux对程序开发的支持在不断地扩充扩充,比方说,有像微软Visual Stdio SDK一样优秀

的开发工具包(使用过它的程序员都说它比VS好用)。

        到这里,我们知道,Linux系统 本身可以分为三个部分:内核、外壳及第三方开发的应用程序。而内核又为分两部分:三个核心文件
和一组可加载模块。我们说的核心编译就是要编译内核。与外壳和它上面的各应用程序无关。内核的核心部分存放在/boot目录下,可加载模

块存放在/lib/modules/内核版本号/kernel下载。



        编译过程


        第一步当然是要获取内核源代码,你可以从Linux的安装盘里安装源代码,Linux发行商都将内核源代码打成包可以安装。我们用的是
最新版的内核,只能从网上下载到,进入www.kernel.org可以下载最新版的内核 源代码,只要点击第一项The latest stable version of

the Linux kernel is: 一行后面的F链接,就可以下载。你可以选择2.6.18.19笔者十一月份最近几天,第一次编译的是2.6.18.1,过了几天

,马上出现了2.6.18.3当今天发表本文时,已经出现了2.6.18.19,这些版没有大差别,只是小错误的修正。注意,版本号的含意:第一位是主

号,第二位是次号,第三位是主修正号,第四位是次修正号。
        第二步在,将源代码在解压拆包到Linux的/usr/src/kernels/目录下。注意,如果你的LInux能上网,你可以直接在Linux用Mozzila

浏览器下载,如果是在Windows下载的,并且你对于挂载外设不熟悉,建意你在Windows上安装FTP,然后,在Linux自带的FTP客户端登录

WINDOWS FTP目录,将内核源代码 下载到Linux里。如果是在X-WINDOWS下载操作,只需要双击下载的压缩,就会自动完成解缩与拆包的过程,
注意解缩与拆锯是两个操作。如果在终端命令行下,可以输入 “bunzip2 文件名 回车”解压,这里你的目录下会多出一个后缀为.tar 的文

件。然后,输入入tar -xvf tar文件名 回车,就可以拆包。
        第三步,在命令终端下,用cd 命令进入内核源代码 目录,一般是linux-2.6.18.19这样的目录,进去之后,就准备编译了。
       
                最新版内核(2.6.18.xx)开始,编译过程与安装过程变得十分简单。下面说明一下。
                整体上分为三步:1、配置内核(就是确定哪些功能要保留在编译好的内核中,哪些功能要从内核中删除),生成一个编译

配置文件.config
                                2、编译内核。3.安装内核。


                使用的命令如下:
                        1.配置内核 make menuconfig或make xconfig   (前者用在命令端下,后者必须启动X-Windows并且要求安装了Qt

库)
                        2.编译核心 make
                        3.编译模块 make modules_install
                        4.安装核心 make install       (注意,你输入这个命令时,它会提示你/lib/modules/下缺少一个名称为版本号

的目录,你须先用 mkdir /lib/modules/版本号 创建这个目录,这个目录就是核心可加载模块存放的地方)
                        5.安装模块 make modules_install

                        这样之后,只要重新机动机器 ,你就会发现在你的机器上多出来了一个名称为新内核版本号的菜单,只要选择它

回车就可以启动新内核。



                注意事项:
                        1.在配置时,在一个项上,按Y就是把一个功能编译到核心中,按N就是去该功能,按M就是将该功能编译成模块,

并且,不是所有的功能都能编译成模块,通常是一些驱动程序可以编译成模块。
                        2.配置时,有几个项必须被编译到内核,而不能去掉或是编译成模块,否则编译好的内核肯定不能正常启动。
                        这几个模块是File System菜单下的Ext3 journalling file system support子项下所有的项。注意,Ext3

journalling file system support下面又含有两个子项:Ext3 extended attributes和JBD(ext3) debugging support,这些项全部选中Y,

以便将其编译进内核。
                        3.如果上面的都做过了,开机时,新内核还是不能正常 使用,那么,就进入旧内核,把/etc/selinux中的config

中的SELINUX项给禁止掉即可。
                        4.对于笔记本电脑,带DVD-光驱的,注意,还必须选中File System项下的Micellaneous Filesystem support下的

UFS开关的一项,否则有可能启动不了。
发新话题