交叉编译基于ARM的Linux内核之前,我们作以下的准备工作:
1、已经安装好一套你熟悉的交叉编译工具(建立好交叉编译环境)。
2、选择一套你熟悉的功能足够你使用的内核,当然,这个内核是适合用你的交叉编译工具编译的。
掌握以上2点,基本上就差不多了。这里默认你知道的一些常用知识----命令&VI&常识什么的你已经了解。
开始编译:
1、下载内核:
下载一个你觉得可以满足你的设计要求又不至于太陌生的Linux内核,对开发是非常有好处的,我选择的是:
linux-2.6.26内核 & arm-linux-gcc-3.4.1工具链。
理由很充分:linux-2.6.26内核满足我到需要而且看起来足够新,并且arm-linux-gcc-3.4.1工具链对linux-2.6.x内核的支持也足够出色!
下载内核压缩文件:linux-2.6.26.tar.bz2
2、建立开发目录:
这个就简单多了,把压缩包copy到一个路径清晰的新建文件夹下(你不会忘了起名字吧),开始解压缩 :tar -xvjf linux-2.6.26.tar.bz2
等待………………………………………………
你的目录中出现了linux-2.6.26文件夹,说明你解压功夫很过硬。
delete(不是命令,是要你敲击键盘) linux-2.6.26.tar.bz2。原因嘛:看见它就费劲(但还是建议你要备份)!
3、浏览内核文件夹:
这里出现了许多文件和文件夹(我就不说文件夹是“目录”了),其中,和本文有关系的并且也是你一定要关心的:Makefile,arch,再有就是尚未出现的.config文件。
Makefile不多说了,.config也一会儿在提,这里我们感兴趣的是arch目录(哎,又说“目录”了)。
arch目录下存在一个我们目前非常感兴趣的arm目录,其他到目录在将来可能你也会感兴趣的,但那是将来的事情!
arch目录下我们可以看到一大堆和硬件体系结构相关的代码,有了他们,我们就不必再像移植uC/OS-II那样,一行行自己动手编写和目标体系结构密切相关的一大堆
汇编代码了,想起移植uC/OS-II的日子,多么蹉跎的岁月呀…………………………………………
4、编译第一步:改写Makefile文件:
内核文件夹内的目录中,每层都会出现或大或小的Makefile文件,我们在这里只去关心根文件夹下的这个Makefile文件,它像是整个编译过程的总指挥,运筹帷幄。
改它太简单了,大妈都会:在内核文件根目录下:vi Makefile
直接找到第193行:ARCH ?= $(SUBARCH)
第194行:CROSS_COMPILE ?=
干掉他们:
第193行:#ARCH ?= $(SUBARCH)
第194行:#CROSS_COMPILE ?=
在他们下面添两行:
第193+X行:ARCH ?= arm
第194+X行:CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
要注意,第194+X行的内容是和你选择的编译工具链密切相关的,这里涉及到有关编译链的知识是:它的位置&各个工具的名称。
这就搞定了,ARCH ?= arm 意在告诉内核(其实说编译器才准确),我要编译基于arm体系结构的内核。
CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux- 意在说明你要用的编译器/工具在什么地方!
如果安装了好多编译工具,可以随时更改CROSS_COMPILE ?= ,你就可以使用不同的编译工具来编译你的内核了。
5、编译第二步:配置内核。
显而易见,Linux内核对于嵌入式应用而言,庞大而臃肿,“瘦身”的时候到啦。选你要的,干掉你不想要的。
首先,make mrproper,这个能清理掉你上次编译产生的一堆没用文件。我们还一次都没编译过,这里就可以省略掉(如果你选择在改写Makefile文件前做这一步,也未尝不可)。
键入:make menuconfig命令(使用make xconfig或者make config也都成,但如果你和我一样,懒惰又无知,那还是老老实实用make menuconfig好了)。
看到了什么?----------------似曾相识的BIOS设置界面!吼吼吼,你一看就会操作了吧。
然而关键在于:我不知道怎么配置----不知道要什么,不要什么。可是你绝对不用担心,Linux强大的对上百种体系结构的支持功能早替你想到了这个问题。
在linux-2.6.26/arch/arm/configs中有一大堆“预配置”好的文件,名字大都:XXXXX_defconfig,这些文件是针对各个公司生产的各种主流型号芯片的典型“配置文件”,
你可以直接copy到linux-2.6.26根目录下直接使用,但,不推荐这么用,因为我没用过,也没见到谁这么使用。这绝不意味着它就没啥大用,恰恰相反,我们可以把它“导入”
并且在它的基础上修改,不然的话几百条配置选项,累死你活该喽。
我们这么干:选择 Load an Alternate Configation File 回车
看到.config,不理它,直接删掉。
输入linux-2.6.26/arch/arm/configs中你要选择的XXXXX_defconfig文件的绝对路径:/home/Potheas/………/………/…………
比如,你选择使用三星的arm芯片:s3c2440,你就可以选择linux-2.6.26/arch/arm/configs中的s3c2410_defconfig文件,因为对它的配置和对s3c2440的
最为接近,你完全可以在它的基础上修改,如果你想找s3c2440_defconfig,对不起,没有---这个真没有!你总不能啥也不干吧。
但对于我这样的菜鸟,我就真的啥也没干,因为我不知道还要配置啥,就算知道也不在这里说啦,不是本文的主旨。
于是我就 Save an Alternate Configation File 回车。
看到一大串刚才我为导入XXXXX_defconfig文件输入的路径,直接删掉!输入.config回车,"OK"!这时,在linux-2.6.26下面多了个以前没有的文件.config。
我要说的是:配置工作作完了。你可以到linux-2.6.26文件夹下看看,多了什么: ls -l
傻眼了:我们需要的.config居然没有!不过别急,.config是默认的隐藏文件,我就是因为不知道这个才TMD找来找去浪费了很多时间。
于是:ls -al:豁然开朗啊,有了!
6、编译第三步:make!make!还是make!
剩下的事情就简单多了,make zImage 回车,等待!
等待…………………………。
好了,在linux-2.6.26/arch/arm/boot文件夹中出现了名为zImage的文件,一切搞定!
7、如果………………………………
如果不爽,你就:make mrproper…………………………重来一遍!!
我试过,可是并不成功,编译有错,可能跟作者的环境不一样,不过作为入门,也可以参考一下。