写在前面: 本系列文章将详细的讲述AT91RM9200引导程序的建立过程,
其中包括建立交叉编译工具链,gdb+gdbserver的编译安装使用,tftp,NFS的安装使用,超级终端或者minicom的使用,内核的编译升级,U-Boot的移植,Ramdisk、根文件系统的建立制作,busybox的编译、应用等。从而重现
完整的开发过程。在写这个文档的过程中,本人参考了许多资料,在这里要感谢互联网,感谢所有社区,论坛里无私提供帮助的同行们。特别感谢一下鲁郁先生,是
他让我在AT91RM9200上成功的移植了U-Boot1.1.4。
本人是从不懂一路走来,走的过程中将开发过程详细记述下来,从一个初学者的角度来写下这个系列的文章,以方便其他初学者能得到一些帮助,少走一些弯路。本
系列文章主要讲述开发过程及实际应用,并不能很好的讲述一些原理性的东西,所以您在看这篇文章的时候最好要参考其他资料,以形成一个完整的知识链。祝你旅
途愉快。 开发环境软件环境 宿主机:Redhat9.0
,虚拟机vmware5.5.1 U-Boot 1.1.4, busybox1.2.2.1 硬件环境 CPU:AT91RM9200
,180MHz(200MIPS) 存
储器:32M SDRAM(MT48LC8M16A2) 64Mbits
Flash(SST39VF6401B) USB接口:USB-Host
USB-Device 网络接口:
10/100M DM9161E DBGU串行调试接口 JTAG接口 移
植过程虚拟机 关于虚拟机的安装使用,这里就不介绍了。使用很方便,网上也有大量
的资料。大家可自行查阅。我们使用的是5.5.1版本,当然,你也可以使用最新的版本。
建立交叉编译工具链。 交叉编译工具链就是为了在一个平台体系结构下(如X86 PC机)能编译,链接,处理和调试另一个平台体系结构下(如ARM)的
程序,使得编译生成的程序能够在另一平台下运行。 Linux使用的工具链软件是:Binutils,gcc,glibc,gdb。 其中binutils是二进制程序处理工具。gcc是编译器。glibc是应用程序编程的函数库文件软件包。gdb是调试工具。 对交叉编译工具链的编译是很麻烦和琐碎的一件事,如果自己一个一个编译,很可能会遇到各种各样的麻
烦。幸好有人做了一套脚本程序,可以很方便的生成你所需要的交叉编译工具链。我们使用的脚本就是crosstool,关于详细内容可以访问,可以从该网站下载到它的脚本,补丁和文档。 本文以i686平
台,虚拟机vmware5.5.1,redhat9.0来建立arm交叉编译工具链。 我们采用crosstool0.42来作为我们编译交叉编译工具链的脚本。详细的用法说明请阅读网站上的文档crosstool-how to 。 [zzl@localhost] tar -xzvf crosstool-0.42.tar.gz [zzl@localhost]cd
crosstool-0.42 我们可以看到目录下有很多.sh脚本和.dat配
置文件。每一个支持的CPU都有它所相应的脚本,如我们选用demo-arm-softfloat.sh 就是建立目标为支持软浮点的arm的交叉编译工具链。其中需要我们记住的三个重要的变量: TARBALLS_DIR=$HOME/downloads
RESULT_TOP=/opt/crosstool GCC_LANGUAGES="c,c++" 第一行指明我们放置源代码软件包的目录,我的
主目录是/home/zzl。第二行指明我们生成的交叉编译工具链在/opt/crosstool下。第三行表示,我们的交叉编译工具链支持c,c++语
言。 我们需要如下压缩包: gcc-3.4.1.tar.gz glibc-2.3.3.tar.gz linux-2.6.17 binutils-2.15.tar.gz glibc-linuxthreads-2.3.3.tar.gz 所以,你的首要任务是下载这些源代码软件包,并将它们放在/home/zzl/downloads下面,保证这些包的所有者为当前用户而不是根用户。 由于我们以后的内核版本为2.6.17,所以我们还需要下载linux2.6.17的内核包,并放在/home/zzl/downloads/下。 我们选择的配置是:demo-arm-softfloat.sh,其内容具体如下:
#!/bin/sh set -ex TARBALLS_DIR=$HOME/downloads RESULT_TOP=/opt/crosstool export TARBALLS_DIR
RESULT_TOP GCC_LANGUAGES="c,c++" export GCC_LANGUAGES # Really, you should do the mkdir before running
this, # and chown /opt/crosstool to yourself so you don't need to run
as root. mkdir -p $RESULT_TOP # Build the toolchain. Takes a couple hours and a
couple gigabytes. #eval `cat
arm-softfloat.dat gcc-3.3.3-glibc-2.3.2.dat` sh all.sh --notest #eval `cat
arm-softfloat.dat gcc-3.4.0-glibc-2.3.2.dat` sh all.sh --notest eval
`cat arm-softfloat.dat gcc-3.4.1-glibc-2.3.3.dat` sh all.sh --notest #eval `cat
arm-softfloat.dat gcc-3.4.1-glibc-20040827.dat` sh all.sh
--notest echo Done. 从这一行eval `cat
arm-softfloat.dat gcc-3.4.1-glibc-2.3.3.dat` sh all.sh --notest 可以看出,我们的gcc版本采用3.4.1,glibc版本采用2.3.3。 我们再来看gcc-3.4.1-glibc-2.3.3.dat这个文件 BINUTILS_DIR=binutils-2.15 GCC_DIR=gcc-3.4.1 GLIBC_DIR=glibc-2.3.3 LINUX_DIR=linux-2.6.8 GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.3 由于我们采用的是Linux-2.6.17的内核包,所以这里要将linux-2.6.8改成linux-2.6.17。否则,脚本执行解压缩时,找不到linux源代码包。 建立我们的目标生成目录 [zzl@localhost]sudo
mkdir /opt/crosstool [zzl@localhost]sudo chown zzl /opt/crosstool 执行我们的配置文件arm-softfloat.sh [zzl@localhost]sh
demo-arm-softfloat.sh 这里要注意运行该配
置文件不能以root来运行,crosstool-0.42,
/opt/crosstool为非root用
户所有。 如果一切顺利的
话,经过一段时间的等待,得到一个新目录:(如果不顺利且始终找不到错误原因的话,我建议你重新安装redhat9.0的操作系统,然后按照先前步骤进行。:)) /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu 交叉编译工具就在该目录的bin/下 [zzl@localhost]ls
–l /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin 总用量 29184 -rwxr-xr-x 1
zzl zzl 1806212 12月 29
09:02 arm-softfloat-linux-gnu-addr2line -rwxr-xr-x 2
zzl zzl 1864030 12月 29
09:02 arm-softfloat-linux-gnu-ar -rwxr-xr-x 2
zzl zzl 3248953 12月 29
09:02 arm-softfloat-linux-gnu-as -rwxr-xr-x 2
zzl zzl 287996 12月 29
09:43 arm-softfloat-linux-gnu-c++ -rwxr-xr-x 1
zzl zzl 1761855 12月 29
09:02 arm-softfloat-linux-gnu-c++filt -rwxr-xr-x 1
zzl zzl 287111 12月 29
09:43 arm-softfloat-linux-gnu-cpp -rwxr-xr-x 2
zzl zzl 287996 12月 29
09:43 arm-softfloat-linux-gnu-g++ -rwxr-xr-x 2
zzl zzl 285852 12月 29
09:43 arm-softfloat-linux-gnu-gcc -rwxr-xr-x 2
zzl zzl 285852 12月 29
09:43 arm-softfloat-linux-gnu-gcc-3.4.1 -rwxr-xr-x 1
zzl zzl 16241 12月 29
09:43 arm-softfloat-linux-gnu-gccbug -rwxr-xr-x 1
zzl zzl 103366 12月 29
09:43 arm-softfloat-linux-gnu-gcov -rwxr-xr-x 1
zzl zzl 2286490 12月 29
09:02 arm-softfloat-linux-gnu-gprof -rwxr-xr-x 2
zzl zzl 2542659 12月 29
09:02 arm-softfloat-linux-gnu-ld -rwxr-xr-x 2
zzl zzl 1840205 12月 29
09:02 arm-softfloat-linux-gnu-nm -rwxr-xr-x 1
zzl zzl 2344807 12月 29
09:02 arm-softfloat-linux-gnu-objcopy -rwxr-xr-x 1
zzl zzl 2487727 12月 29
09:01 arm-softfloat-linux-gnu-objdump -rwxr-xr-x 2
zzl zzl 1864029 12月 29
09:02 arm-softfloat-linux-gnu-ranlib -rwxr-xr-x 1
zzl zzl 384396 12月 29
09:02 arm-softfloat-linux-gnu-readelf -rwxr-xr-x 1
zzl zzl 1712993 12月
29 09:01 arm-softfloat-linux-gnu-size -rwxr-xr-x 1
zzl zzl 1689683 12月 29
09:02 arm-softfloat-linux-gnu-strings -rwxr-xr-x 2
zzl zzl 2344806 12月 29
09:02 arm-softfloat-linux-gnu-strip -rwxrwxr-x 1
zzl zzl 19084 12月
29 09:43 fix-embedded-paths 我们可以看出,交叉编译的所有工具都在这里。 将这个路径加进PATH变
量中: [zzl@localhost]export
PATH=$PATH
:/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin 如果每次都要输入上面的shell命
令,的确是比较烦人的事情。我们可以在linux启动脚本中添加该语句。从而避免每次开机后重新输入。我是在启动脚本/etc/profile中添加了环境变量。 找到这一行export PATH USER
LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC 在其上面一行添加: PATH=$PATH
:/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin 今后我们编译程序的时候,就用arm-softfloat-linux-gnu-gcc 来编译我们的程序。 当然,应用程序的调试是开发过程中必不可少的环节之一。Linux下
的GNU的调试器即是GDB。所以我们有了这个交叉编译工具链之后,可以用它来编译gdb和gdbserver。如果你暂时不需要GDB的话,也可以先略过这一步。 GDB的编译安装 目前比较新的是版本是GDB6.6。其官方网站是。 下载gdb-6.6.tar.gz源代码包到/usr/src下。 [root@localhost]tar –zxvf gdb-6.6.tar.gz [root@localhost]cd
gdb-6.6 配置很简单,只需要指定目标板体系结构和安装路径即可。 [root@localhost]mkdir
/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6 [root@localhost]./configure
--target=arm-softfloat-linux-gnu --prefix=/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6
-v [root@localhost]make [root@localhost]make
install 顺利的话,则在gdb6.6下生成新的目录,其中gdb工具就在bin目
录下。 [root@localhost]ls
–l /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6 /bin 总用量 30476 -rwxr-xr-x 1
root root 14335251 12月
29 15:53 arm-softfloat-linux-gnu-gdb -rwxr-xr-x 1
root root 14335296 12月 29
15:53 arm-softfloat-linux-gnu-gdbtui -rwxr-xr-x 1
root root 2489663 12月 29
15:52 arm-softfloat-linux-gnu-run 同样在环境变量中添加gdb的
路径 [root@localhost]export
PATH=$PATH
:/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6/bin 今后调试程序的时候,用arm-softfloat-linux-gnu-gdb 来调试。 gdbserver的编译 [root@localhost]cd
gdb-6.6 [root@localhost]cd
gdb/gdbserver [root@localhost] ./configure
--target=arm-softfloat-linux-gnu –-host=arm-softfloat-linux-gnu [root@localhost] make CC=/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc 如果不出错的话,将在当前目录下生成两个可执行文件:gdbserver和gdbreplay。以后就可以用gdb+gdbserver调试我们开发板上的程序了。至此,我们的交叉编译工具链已经基本建立。可以用来作为我们bootloader的编译环境了。 GDB+GDBServer的使用 在目标系统上启动gdbserver,其实就是在超级终端下或者minicom下启动gdbserver。这里将gdbserver放在宿主机的NFS设置的共享目录下/home/zzl,该目录挂载在目标板/work下。宿主机的ip为192.168.1.1,目标板的ip为192.168.1.33 超级终端或者minicom下 [root@localhost]cd
/work [root@localhost]./gdbserver
192.168.1.1:1234 hello 出现提示: Process /work/hello
created: pid=69 Listening on port 1234 这时切换到宿主机的控制台,运行 [root@localhost]
arm-softfloat-linux-gnu-gdb hello (gdb) target
remote 192.168.2.33:1234 出现提示: Remote debugging using 192.168.1.33:1234 [New
thread 80] [Switching to thread 80] 0x40002a90 in ??() 同时在minicom下提示: Remote debugging from host
192.168.2.100 (gdb) 连接成功,这时候就可以输入各种gdb命令如list、continue、next、step、break等进行程序调试了。 对于GDBServer出现的问题 1. GDBServer调试时出现packet
error 问题。 主要是虚拟机与目标机的网络连接要经过windows,数据包容易丢失。换到Linux系统下则恢复正常。 |