• 沒有找到結果。

内核源码结构

在文檔中 目 录 (頁 168-171)

第 7 章 配置编译内核

7.2 配置编译内核源码

7.2.1 内核源码结构

由于内核版本是不断升级更新的,最好下载使用最新版本的内核源代码。但是,有时候 也需要比较分析老版本的内核。

浏览http://kernel.org站点,可以查看 Linux 官方发布的内核版本,从而确定需要的内核

版本。然后可以通过 HTTP 或者 FTP 下载相应的源码包。

Linux 的下载工具,例如:gftp、kget、wget 等。其中,wget 下载工具就很好用,它可

tyw藏书

以支持 FTP 和 HTTP,还支持断点续传,不过是命令行的方式。下面都以 wget 为例来下载 源码包。

下例就是下载内核源码包和电子签名文件到当前目录。由于源码包一般都在 30MB 以上,

可以使用断点续传的下载方式,加上选项“-c”。下载命令如下。

$ wget -c http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2

$ wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2.sign 下载完成以后,先验证一下电子签名。

$ gpg –verify linux-2.4.26.tar.bz2.sign

如果没有问题,就可以使用源码包了。可以把源码包解压到工作目录下。

$ cd ~/workspace

$ tar jxvf ~/linux-2.6.14.tar.bz2

新版本的内核分两种,一种是完整源码版本,另外一种是 patch 文件,即补丁。完整的 内核版本比较大,一般是 tar.gz 或者是.bz2 文件,二者分别是使用 gzip 或者 bzip2 进行压缩 的文件,使用时需要解压缩。patch 文件则比较小,一般只有几十 K 到几百 K,但是 patch 文 件是针对于特定的版本的,你需要找到自己对应的版本才能使用。

每一个补丁都反映了最近的 2 个正式版本之间的差别。也就是说,上一个版本的 Linux 内核源码,通过打补丁可以得到下一个版本。

另外,Linux 社区经常有开发版本、分支版本或者非官方修改,都是以补丁的形式发 布的。

假设已经下载了 Linux-2.6.14 版本,kernel.org 又发布了 Linux-2.6.15 内核。这时下载补 丁 patch-2.6.14.15,就可以升级到新的版本。下载命令如下。

$ wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.14.15.bz2

$ wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.14.15.bz2.sign 下载完成后,也要检查电子签名。

$ gpg –verify patch-2.6.14.15.bz2.sign

通常使用*.bz2 文件,因为*.bz2 的压缩比更高一些。这里我们不需要解压补丁文件,直 接使用 bzcat 来读取文件信息就行了。

$ cd linux-2.6.14/

$ bzcat ../patch-2.6.14.15.bz2 | patch –p1

上面通过管道的方式,把补丁内容传递给 patch 命令,应用到内核源代码中去。然后,

可以把 Linux-2.6.14 的目录名称改成 Linux-2.6.15,就得到新版本的 Linux 内核源码了。

那么补丁文件是什么呢?不妨分析一下补丁文件的内容。补丁文件是通过 diff 命令比较 两个源码目录中文件的结果,把两个目录中所有文件的变化体现出来。下面是补丁文件中的

tyw藏书

一段,说明了 Makefile 文件的一些修改。

diff --git a/Makefile b/Makefile index 1fa7e53..497884d 100644 --- a/Makefile

+++ b/Makefile

@@ -1,8 +1,8 @@

VERSION = 2 PATCHLEVEL = 6 -SUBLEVEL = 14 +SUBLEVEL = 15 EXTRAVERSION =

-NAME=Affluent Albatross +NAME=Sliding Snow Leopard

上面是 a 目录和 b 目录比较的结果,也就是从 a 目录到 b 目录的变化。“−”表示删除当 前行,“+”表示添加当前行,这样可以实现代码的修改替换。上面的 SUBLEVEL 从 14 变成 了 15。

patch 命令可以根据补丁文件内容修改指定目录下的文件。几种命令使用方式如下。

$ patch –p<n> < diff_file

$ cat diff_file | patch –p<n>

$ bzcat diff_file.bz2 | patch –p<n>

$ zcat diff_file.gz | patch –p<n>

其中,<n>代表按照 patch 文件的路径忽略的目录级数,每个“/”代表一级。例如:

p0 是完全按照补丁文件中的路径查找要修改的文件;

p1 则使用去掉第一级“/”得到相对路径,再基于当前目录,到相应的相对路径下查找 要修改的文件。

接下来,就可以仔细阅读内核源代码。Linux 内核源代码非常庞大,随着版本的发展不 断增加。它使用目录树结构,并且使用 Makefile 组织配置编译。

初次接触 Linux 内核,要仔细阅读顶层目录的 readme,它是 Linux 内核的概述和编译命 令说明。readme 的说明更加针对 X86 等通用的平台,对于某些特殊的体系结构,可能有些特 殊的地方。

顶层目录的 Makefile 是整个内核配置编译的核心文件,负责组织目录树中子目录的编译 管理,还可以设置体系结构和版本号等。

内核源码的顶层有许多子目录,分别组织存放各种内核子系统或者文件。具体的目录说 明见表 7.1。

7.1 Linux 内核源码顶层目录说明

arch/ 体系结构相关的代码,例如:arch/i386,arch/arm,arch/ppc

tyw藏书

crypto

drivers/ 各种设备驱动程序,例如:drivers/char drivers/block … Documentation/ 内核文档

fs/ 文件系统,例如:fs/ext3/ fs/jffs2 …

include/

内核头文件:

include/asm 是体系结构相关的头文件,它是 include/asm-arm、include/asm-i386 等目录的链接。

include/linux 是 Linux 内核基本的头文件 init/ Linux 初始化,例如:main.c

ipc/ 进程间通信的代码

kernel/ Linux 内核核心代码(这部分很小)

lib/ 各种库子程序,例如:zlib, crc32

mm/ 内存管理代码

net/ 网络支持代码,主要是网络协议

sound 声音驱动的支持

scripts/ 内部或者外部使用的脚本

usr/ 用户的代码

在文檔中 目 录 (頁 168-171)