内核,是一个操作系统的核心,Linux操作系统最英明之处就是把内核源代码公布,这样我们根据自己的机器配置就可以做自己的系统内核。有心的人会发现,Windows的安装时间越来越长,“块头也越来越大”,为什么呢?它要做好兼容那么就不得不把很多不属于你的机器使用的驱动或者其他的支持库打包进你的机器,当然这跟本文没有太大关系,放下不提。

那么,为什么要对内核要进行重新编译呢?放着好好地现成的内核不用,折腾自己去新搞一个内核。且听我慢慢道来。

Linux作为一个自由软件,内核版本更新速度极快,想我十天以前刚下的内核现在已经过时了。新的内核不仅修订了旧内核的bug,而且会增加许多新的特性,这一点在你配置内核的时候后面显示(NEW)的东西就是新加的。如果你想定制一个更高效,更稳定的内核,就需要重新编译内核。经常对内核进行更新对每个Linux的使用者都是很重要的。
  为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个方面考虑: 

1、自己定制编译的内核运行更快(具有更少的代码) 
  2、系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中) 
  3、不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞 
  4、将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些 ”

(以上四点转载自博客园博客)

关于Linux内核的编译步骤在我的其他文章中已经写到,这里不再重复,重点讲述Linux内核编译时如何进行工作的。

当解压好内核之后,首先要做的是根据自己的机器配置和需要,配置内核编译模块。这里对模块做一下讲解,具体的模块编译方法可以在我的其他文章中找到。内核模块说白了就是一个特殊的object文件,其后缀名为.ko,要产生该文件需要在Makefile开头中加上obj-m:=sourcefile.o即可。在make之后即可在产生.o文件的同时产生.ko文件,当然,源代码也要引用正确的内核头文件才行,不让在内核中执行不了。

而所谓的内核配置过程就是选择你在编译内核的过程中要生成那些.ko,不生成哪些.ko,同时选择这些.ko是如何被加入内核的,是直接打入内核,还是作为模块单独存在,到需要时由系统自动挂载,最终的配置结果会生成.config文件。

接下来,执行bzImage或zImage命令时,make程序会根据.config的内容来生成vmlinux文件,也就是在开机过程中首先启动的Linux内核,这个可以理解成你这个系统的最核心部分,是我们要用的最小系统。

下一步,执行modules命令时,make程序会根据.config的内容来生成不同的内核模块,即.ko文件,有了这些kernel object,在系统需要加载一些内核模块式都回到/usr/lib/modules中寻找,并且加载、运行。

在接下来就是modules_install命令了,这个命令执行起来非常快,因为实际上这个过程中已经不会再产生什么新的文件了,只是将编译好的.ko文件都拷贝到相应的目录,或者是替换现有内核的相应文件。

在内核编译的最后是install命令,不得不说这个命令极大方便了我这种菜鸟更换内核,尤其是在使用grub2的Linux系统中,网上没有很多关于grub2下引导内核加载的文章,大部分都是针对grub写的。而install命令把所有要做的事情已经集成好了,只需要一个install命令就可以完成内核引导的更换,自动化程度进一步提升。

以上就是我自己对内核编译过程的基本原理的臆测,其实也说不上是原理,只是一个过程的大致推测吧,一切都是根据makefile或者是我自己在更换过程中的一些小发现的臆测,有不正之处还希望各位大神能够批评指正!

                                                             By Air_Fighter

                                                                  2012.7.21