经历近2周的时间,查阅大量的参考资料和贴子,终于成功将Linux2.6.22移植到ARM2410上。中间走了不少弯路,不过走弯路也是一种收获,因为可以碰到和解决许多问题,增长知识。因为Linux版本问题以及开发平台的不同,网上的很多文章并不完全适合自己的板子,需要自己摸索和修改。写这点东西算是对前一阶段工作的总结,以免将来忘记。
移植大体的步骤主要有:
(1) 交叉编译环境的建立(我的主机系统是Ubuntu7.04);
(2) 开发板(我用的是博创的2410)NAND flash 分区管理;
(3) LCD、网卡驱动的移植;
(4) linux内核配置和编译;
(5) rootfs的制作;
(6) 完成linux的启动和文件系统的挂载。
下面我会按照步骤逐一介绍。
一、 交叉编译环境的建立
建立交叉编译环境就是在宿主机(也就是pc机)的系统上建立一个模拟ARM的工作环境,使得在这个环境下编译产生的程序能够顺利的在ARM上的系统内运行。主要工作包括binutils、gcc以及glibc的编译生成,还有一些环境变量的设置。
(1)准备工作:
下载源代码包: binutils-2.18.tar.bz2,gcc-4.2.1.tar.bz2,glibc-2.6.1.tar.bz2,glibc-ports-2.6.1.tar.gz,linux-2.6.22.tar.bz2
补丁包: binutils-2.18-genscripts_multilib-1.patch
binutils-2.18-posix-1.patch
gcc-4.2.1-cross_search_paths-1.patch
gcc-4.2.1-posix-1.patch
gcc-4.2.1-specs-1.patch
glibc-2.6.1-cross_hacks-1.patch
glibc-2.6.1-hppa_nptl-1.patch
glibc-2.6.1-libgcc_eh-1.patch
glibc-2.6.1-RTLD_SINGLE_THREAD_P-1.patch
glibc-2.6.1-sysdep_cancel-1.patch
glibc-csu.patch
注:Binutils 是一组开发工具,包括连接器,汇编器和其他用于目标文件和档案的工具;
GCC是C编译器,用来将C代码编译成汇编代码;
Glibc就是gcc编译时需要的库了,glibc-ports是提供glibc对ARM的支持;
Linux-2.6.22.tar.bz2是内核源代码包。
需要注意的是gcc和glibc以及linux内核版本需要保持对应。如果用比较老的编译器去编译新的内核,或者用新的编译器编译老版本的内核,会出现一些莫名其妙的错误。另外补丁包也是必备的,否则编译过程中也会出错。刚开始我就深受其害。
(2)工作目录的建立:
目录的结构可以参考《Building.Embedded.Linux.Systems》。推荐整个目录放到/usr/local下,这样所有的用户都有访问权限。我当初没经验,直接放到home下了,后来会有些用户权限的小麻烦。这里给出我的目录结构:
$root@host:/home# ls
arm host
其中host是我的普通登陆用户帐号目录,arm就是工作目录了。为了方便,我平时用root登陆。
$root@host:/home# cd arm
$root@host:/home/arm# mkdir build-tools kernel rootfs tmp tools
其中编译交叉工具时的主要工作都在build-tools目录下完成,kernel目录用来存放内核源代码,rootfs目录是用来建立启动根文件系统的(后面会详细介绍),tmp是临时文件存放目录,tools目录就是最终生成的编译器gcc和glibc存放的地方。
(3)设置环境变量:
$root@host:/home/arm# export PRJROOT=/home/arm
$root@host:/home/arm# TARGET=arm-linux
$root@host:/home/arm# PREFIX=${PRJROOT}/tools
$root@host:/home/arm# TARGET_PREFIX=${PREFIX}/${TARGET}
$root@host:/home/arm# PATH=${PREFIX}/bin:${PATH}
其中TARGET定义了交叉工具的工作平台类型,PREFIX指定交叉工具的最终安装目录,PATH指定系统寻找交叉工具可执行文件所在的路径。
(4)编译前的准备:
$root@host:/home/arm# cd ${PRJROOT}/build-tools
$root@host:/home/arm/build-tools# mkdir build-binutils build-boot-gcc build-glibc build-gcc build-glibc-headers patch
将源码包放到这个目录下
$root@host:/home/arm/build-tools# ls
build-boot-gcc build-glibcbuild-binutils build-gcc build-glibc-headers patch
binutils-2.18.tar.bz2 gcc-4.2.1.tar.bz2 glibc-2.6.1.tar.bz2 glibc-ports-2.6.1.tar.gz
将补丁放到patch目录下:
$root@host:/home/arm/build-tools# cd patch
$root@host:/home/arm/build-tools/patch# ls
binutils-2.18-genscripts_multilib-1.patchbinutils-2.18-posix-1.patch
gcc-4.2.1-cross_search_paths-1.patch gcc-4.2.1-posix-1.patch
glibc-2.6.1-cross_hacks-1.patch
glibc-2.6.1-hppa_nptl-1.patch glibc-2.6.1-libgcc_eh-1.patch
glibc-2.6.1-RTLD_SINGLE_THREAD_P-1.patch
glibc-2.6.1-sysdep_cancel-1.patch glibc-csu.patch
将内核源码包放到${PRJROOT}/kernel目录下
$root@host:/home/arm# cd kernel
$root@host:/home/arm/kernel# ls
linux-2.6.22.tar.bz2