基于3c2410的Linux2.6.22移植

经历近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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzygyp.html