第3章 构建内核

内核的构建系统kbuild基于GNU Make,是一套非常复杂的系统。我们本无意着太多笔墨来分析kbuild,因为作为开发者可能永远不需要去改动内核映像的构建过程,但是了解这一过程,无论是对学习内核,还是进行内核开发都有诸多帮助。所以在构建内核之前,本章首先讨论了内核的构建过程。

对于编译内核而言,一条make命令就足够了。因此,构建内核最困难的地方不是编译,而是编译前的配置。配置内核时,通常我们都能找到一些参考。比如,对于桌面系统,可以参考主流发行版的内核配置。但是,这些发行版为了能够在更多的机器上运行,几乎选择了全部的配置选项,编译了全部的驱动,不仅增加了内核的体积,还降低了内核的运行速度。再比如,对于嵌入式系统,BSP(Board Support Package)中通常也提供内核,但他们通常也仅是个可以工作的内核而已。显然,如果要一个占用空间更小、运行更快的内核,就需要开发人员手动配置内核。而且,也确实存在着在某些情况下,我们找不到任何合适的参考,这时我们只能以手动方式从零开始配置。

但是,面对内核中成千上万的配置选项,开发人员通常不知从何下手。但正所谓万事开头难,一旦迈过了这个坎,读者就不会在内核前望而却步。因此,在本章中,我们摸着石头过河,带领读者以手动的方式配置内核。

在内核启动的最后,内核要从根文件系统加载用户空间的程序从而转入用户空间。因此,在本章的最后,我们准备了一个基本的根文件系统来配合内核的启动。我们也采用手动的方式构建这个根文件系统,通过手动的方式,读者将会更透彻地了解到动辄几个GB的根文件系统是如何组织和安排的。