博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

arm 内核编译

Posted on 2008-05-19 00:56  breathing  阅读(1718)  评论(0编辑  收藏  举报

1、决定在什么地方编译你的内核

首先,你需要决定在什么地方编译你的ARM Linux内核。你的HOME目录是一个编译内核的好地方。如果你希望使用其它的目录,可以适当地取代$HOME目录。但是不推荐在/usr/src/linux目录下编译内核。

2、决定内核的版本

对于任何的内核版本 x.y.z,

◎x-主要版本号

◎y-次要版本号,其中偶数表示稳定版本,奇数表示开发或测试版本

◎z-补丁的级别

在ARM的内核树中,你会发现内核版本号后面有一个后缀:-rmkN, or -vrsN,其中'N'是补丁版本号。例如,2.4.26-vrs1表明这个ARM内核的补丁应该应用于2.4.26的内核。

注意:从2.6.0-test2以后的内核版本不在需要-rmk或者-vrs的补丁,因为内核中已经合并了对ARM体系结构的支持。

其它得维护者,如Nicolas Pitre,会创作额外得补丁,并且会增加额外得后缀来表明他们得版本。Nicolas Pitre的补丁增加一个-np后缀,如2.4.21-rmk2-np1。为了得到2.4.21-rmk2-np1的内核源码,你需要2.4.21的内核源码,2.4.21-rmk2的补丁和2.4.21-rmk2-np1的补丁。

3、下载维护者的特殊补丁

在某些情况下,你需要给内核打上某些维护者的特殊补丁,这些补丁增加了针对各种机器的额外的特性或者其它的设备驱动。可是,在通常情况下,当维护者对改变感到高兴时,会将他们的补丁合并到-rmk或-vrs树中去。

4、下载一个ARM补丁

当你使用一个低于2.6.0-test2的内核版本时,才需要这个步骤。2.6.0-test2之后的内核没有-rmk或者-vrs的补丁。 你可能需要下载一个内核补丁,包括所有针对某一个特殊内核版本的ARM特殊更新。可以在ftp://ftp.arm.linux.org.uk/pub/armlinux/source/kernel-patches/. 上找得到。内核版本根据相应的主版本号和次要版本号分别存放在不同的目录。

独立的文件使用patch-x.y.z-rmkN.gz或者patch-x.y.z-vrsN.gz的命名方式,'x', 'y', 'z'和'N'表示版本号,与上面提到的一样。你应该选择下载最新的内核补丁到$HOME目录。它不是拥有最多的特性,就是修正了最多的bug。在下载完主要的内核源码后,你会需要这个版本的补丁。

注意:一些文件命名为pre-patch-x.y.z-rmkN.gz。这些是alpha或者beta补丁,可能是不可靠的。除非你确定你知道自己在干什么并且对目标系统的稳定性不在意,否则你不应该使用这些补丁。然而,它们对于某些新想法的试验是有帮助的。

注意2:有些内核是基于Alan Cox系列的内核。这些内核的名字类似于patch-x.y.z-acm-rmkN.gz,其中x.y.z是linux版本号,N是Alan的版本号。在这种情况下,你需要从内核服务器上的/pub/linux/kernel/people/alan/linux-2.4/获取Alan Cox的相应补丁。

5、下载主要的内核源码

一个补丁文件本身不包含任何可编译的代码。它是一种可用于计算机处理的,描述变化一个文本文件集。你需要获取主要内核源码树。

内核源码可以在任何一个kernel.org的FTP站点上找到,它们分布在世界各地,采用统一的命名方案。所有的站点都以'ftp'开始,并以'.kernel.org'结束,中间放置的是国家标志符。例如:

◎ftp.uk.kernel.org

◎ftp.us.kernel.org

◎ftp.de.kernel.org

等等。你可以通过访问http://www.kernel.org/获取更多的信息。

通常内核源码被存储在/pub/linux/kernel的子目录中,每一个内核版本有以下几种文件:

linux-x.y.z.tar.gz

linux-x.y.z.tar.bz2

patch-x.y.z.gz

patch-x.y.z.bz2

你可以下载linux-x.y.z.tar.gz 文件到你的$HOME目录,你应该寻找一个与你之前获得的patch相匹配的内核版本。这些文件>=14MB。

6、解压ARM内核源码

解压缩你下载的存档文件:

bash$ cd $HOME

bash$ tar zxvf linux-x.y.z.tar.gz

这样会在你的home目录下创建一个名为linux-x.y.z的新目录。进入这个新创建的目录,使用补丁,如:

bash$ cd linux-2.4.26

bash$ zcat ../patch-2.4.26-vrs1.gz | patch -p1

这些补丁是层次结构的,你需要在正确的顺序中使用它们。较长扩展名的补丁依赖于较短扩展名的补丁,所以你需要在-rmk-np补丁之前使用-rmk的补丁。

7、配置内核的编译环境

通常,内核编译系统会在本地机器的体系结构上编译内核。但在交叉编译中是不合适的,所以你需要更改顶级的内核Makefile文件中的两行:ARCH和CROSS_COMPILE。

在2.4.x内核中,如:

ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)

[...]

CROSS_COMPILE =

在2.6.x内核中:

ARCH ?= $(SUBARCH)

CROSS_COMPILE ?=

编辑这两行:

ARCH ?= arm

CROSS_COMPILE ?= /usr/local/bin/arm-linux-

用你的ARM Linux工具链的路径取代/usr/local/bin/arm-linux- 。

下一步就是进行内核的配置和选择你的平台所需要的驱动。在下一步之前,你可能需要阅读linux/README和linux/Documentation/arm/README.这两个文件提供更多关于你的内核版本的具体信息。

8、配置内核源码

有一系列的make目标文件,为你选择的特殊的机器配置内核源码提供默认设置集。对于2.6内核,这一步骤变得更加简单。

2.4内核的配置:

对于2.4内核使用<机器名>_config格式,例如:

a5k_config

ebsa110_config

netwinder_config

rpc_config assabet_config

你应该选择任何一个作为随后的基本配置,并紧跟着运行make oldconfig:

bash$ make netwinder_config

bash$ make oldconfig

oldconfig步骤会提示你在提交默认的机器配置文件后增加了哪些新的配置选项。通常在这些新选项上选择'N'是安全的。

配置2.6内核

对于2.6内核,过程是类似的。使用<机器名>_defconfig来选择机器,例如:

bash$ make netwinder_defconfig

在这种情况下,不需要单独运行oldconfig步骤。

9、编译内核源码

如果你是为其它的程序安装内核源码树,那么你已经完成了。如果你要编译一个新内核,还要输入以下命令:

bash$ make clean

bash$ make dep

bash$ make zImage

bash$ make modules

最后两个命令会真正地编译内核和内核模块。

注意:对于2.6内核,make dep的步骤是不需要的。

10、安装内核

在成功编译内核之后,你会有内核映像,arch/arm/boot/zImage。 如果你是交叉编译,请跳到"Installing a cross compiled kernel"部分。 如果你是本地编译,请继续。

11、安装本地内核

因为你将要升级系统文件,你需要成为'root'。敲入:

bash$ su

Password:

bash#

高度推荐你保存现有内核和模块的备份。你需要做的是独立于机器的。一旦你需要恢复到原来的版本,一个不错的方法是保存一个原有的、已知的、好的内核和模块的版本。如下面的例子所示(对于2.4.3-rmk内核):

bash# cd /lib/modules

bash# mv 2.4.3-rmk1 2.4.3-rmk1.old

bash# cd /boot bash# mv vmlinuz vmlinuz.bak

bash# mv System.map System.map.bak

bash#

现在,安装新的内核模块:

bash# cd $HOME/linux

bash# make modules_install

bash#

这样会拷贝模块到/lib/modules/x.y.z目录下。下一步,安装内核映像(通常是在/boot):

bash# cd /boot

bash# cat $HOME/linux/arch/arm/boot/zImage >vmlinuz

bash# cp $HOME/linux/System.map

bash#

注意,拷贝新内核的命令是cat而不是通常使用的cp。Unix通常不会在文件系统中为包含0数据的文件段分配空间,而是在文件中创建空洞。一些内核引导程序不能识别有空洞的文件,因此使用cat可以保证这种情况不会发生。

12、运行loadmap

Loadmap是运行在Acorn机器上的Linux引导程序的一部分,与带有IDE硬盘的EBSA285机器中使用的EBSA285BIOS一样。对于其它的机器,请参考你机器的文档。 编辑引导配置文件/etc/boot.conf,以便你可以启动vmlinuz.bak或者vmlinuz映像。如果你将vmlinuz内核放在第一,将会成为内核引导程序使用的缺省内核。

运行boot loader map工具:

bash# loadmap -v

bash#

更新map。

在完成之后,准备重启你的机器,试验你的新内核。如果有问题,请跳到下面的"problem"步骤。

13、安装交叉编译内核

内核模块被安装在目标系统的/lib/modules/x.y.z目录下,虽然在宿主系统中通常会是另一个目录。这个目录依赖于你的安装,我们称之为$TARGETDIR。安装模块到$TARGETDIR:

bash$ make modules_install INSTALL_MOD_PATH=$TARGETDIR bash$

这样将把模块放置到宿主机的$TARGETDIR/lib/modules/x.y.z目录下,然后可以放置到合适的文件系统,或者传送到目标机器上。请注意,不要安装这些内核模块到宿主文件系统,因为他们不适合你的宿主内核,将导致你的宿主系统不能启动。

内核会在$HOME/linux/arch/arm/boot/zImage ,内核符号信息会在$HOME/linux/System.map。具体如何安装已经超出本文档的范围。保持System.map文件的安全非常重要-它包含了内核需要的符号信息。如果你需要调试或报告问题,就需要用到它。

14、报告错误

请参考在内核源码树中的REPORTING-BUGS向导。但是要使用linux-arm-kernel邮件列表来报告问题,而非使用linux-kernel邮件列表。