日期:2014-05-16  浏览次数:20865 次

Linux下编译内核
现在我们来学习在Linux下编译内核。
    编译之前,必须知道为什么要编译内核以及内核是一个什么样的东西。
    Linux操作系统包括四个部分:
    实用工具集;shell;系统程序和运行期库;内核
    内核所起的作用——可以为其他所有的程序以及服务提供运行环境,分配各种软硬件资源
    在操作系统中,内核的作用类似于人的大脑。
    由于LInux操作系统,是一个开源软件,开放所有的源代码,这为我们定制内核提供了便利条件;
    在Windows操作系统中,我们常常被很多问题困扰,比如说我们的操作系统在使用一段时间之后,会发现运行速度越来越慢,操作系统所在的磁盘分区容量越来越多,但是由于windows系统不开源,我们不知道为什么会出现这种情况。不过在linux中,由于所有的内核代码都是开放的,所以只要我们有足够的能力,就可以对这个内核进行定制,以满足我们自己的需求。
    这种定制包括:
    我们的硬件功能很强,包括很多附加设备。但是使用的linux操作系统目前没有打开对这些功能和设备的支持,因此可以通过内核编译去获取这些功能。
    反过来,如果我们的硬件功能很弱,而linux系统中自带的很多功能和硬件的支持我们都不需要,也可以通过内核定制和编译去掉这些功能以加强我们的系统性能。或者杜绝一些错误和漏洞的存在。
    总之,因为linux系统中给我们提供了定制内核的条件(开源),我们就应该和有能力使用这个条件去打造适合我们自己需要的操作系统。
    好了,我们知道了为什么要进行内核编译,下面来演示一下内核编译的步骤:
    1.在编译之前,我们要了解当前计算机的软硬件信息。
            由于/proc目录下存储的是当前内存的运行值,其实这个文件夹不是硬盘中的数据,而是内存中的数据,因此我们可以通过
            这个目录下的文件来获得当前系统的硬件环境信息。
            比如说cpu、内存、文件系统、pci设备、版本等相关信息。
            大家看到了,我们刚才通过less命令看到了cpuinfo meminfo pci filesystem  partition version等信息
          
    2.然后第二步,开始获取内核源代码包:
            内核源代码包获取分两种情况,第一种是通过在系统安装光盘中获得当前系统的内核源码,这种内核包的格式多数是rpm的
                                        第二种是通过在www.kernel.org获得更高版本的内核源码,这种内核包的格式多数是tar.gz的
            我们现在来讨论第一种方法,从光盘获取——需要挂载第二张光盘。大家刚才看到的这个37M的软件包就是内核源码包
            如果没有安装的话,我们使用rpm -ihv kernel-source-2.4.20-8.i386.rpm命令来安装,
            如果成功,该包会安装在/usr/src目录下,产生一个linux-2.4.20的文件夹,里面就是内核源码的内容
    3.但是上面这一步的执行,需要系统的一些底层环境的支持,也就是说需要事前在系统中具备和安装相应的软件包。
      否则无法安装内核包,或者安装内核包之后,会在下一步操作中提示出错。
            这些软件包括:gcc ncurses make dev86 glibc-kernheader cpp binutils
            那么我们现在先来检查一下——使用rpm -qa | grep packagename就行
      好了,看来该装的软件都已经有了,所以执行rpm -ihv  kernel-source-2.4.20-8.i386.rpm就行了。
  
    4.安装完成之后,我们的/usr/src目录里面就有了内核的源码文件:
      就是刚才显示出来的两个目录,其实都是一个目录,另一个链接文件指向的是linux-2.4.20目录,
      所以cd /usr/src   cd linux-2.4.20
    5.现在开始编译:(由于2.4和2.6内核的编译方法不是完全一样,所以我们分开两种情况讨论)
      编译2.4内核:                                编译2.6内核
      第一步:make mrproper --清理内核源代码树(清理垃圾信息)        make mrproper
      第二步:make menuconfig   --配置内核以及内核模块            make menuconfig
      (相关的命令还有make config、make oldconfig、make xconfig)
                      (交互问答式)(通过旧内核生成)(图形界面下编译)
 &nbs