基于ATMEL AT91RM9200的嵌入式Linux移植笔记(1)

2019-07-12 23:48发布

http://linux.chinaunix.net/bbs/thread-985578-1-1.html 文章说明:calmarrow(lqm)原创
文章引自:
http://piaoxiang.cublog.cn

初学嵌入式Linux,感觉需要学习的东西太多了。把学习过程中的收获和问题记录在这里,算是一份经验吧。 
2006-08-10
   前面利用开发板带的现成的东西step by step让Linux
2.4.19在开发板上跑起来了,对于开发的流程也有了一定的认识。现在想对每一步进行详细深入的探讨,好好学习一下,把笔记记录下来,省得忘记了。有些
内容是从看过的书中摘要过来的,大部分是自己实践后的心得。我想记得详细点,也好为后面总结打好基础。
先谈一下对于嵌入式开发流程和嵌入式开发环境拓扑结构的认识。
刚开始比较盲目,看得书也不多,现在才算是大体上有了些了解。从开发产品的角度简单的描述如下:
一、嵌入式开发流程简介 
假设我们现在进行一项嵌入式开产品的开发,比如说智能电力系统终端,那么我想首先应该对完整的开发流程有一个大致的了解,才不致于在以后的工作中被动。下面对嵌入式linux开发简单的介绍一下。 
1、系统的需求分析 
2、硬件平台的选择和设计 
3、软件开发 
(3-1)建立开发环境。 
(3-2)引导装载程序。 
(3-3)内核裁减与编译。 
(3-4)建立文件系统。 
(3-5)应用程序开发。 

图1
因为我想要做的是软件开发,所以对前两步就不作深入探索了。只想要对软件开发的每一步熟悉起来,让我定制的系统跑得稳定,开发的程序能很好的完成其功能。这是个很艰巨的任务,万里长征刚刚走了第一步:)
二、嵌入式开发环境拓扑结构简介 
嵌入式开发环境一般由:宿主机(Linux Server)、工作站、嵌入式目标系统(target board)和将它们连在一起的网络环境。 
1、linux server:嵌入式linux内核编译、应用程序编译的公共平台,有单独的一台pc机充当,安装标准的linux操作系统,比如redhatdebian等等。 
2、工作站:为普通局域网计算机,以支持小组项目开发。工作站一般安装windows,需要linux服务器时,可以从工作站远程登陆到linux server。 
3、target board:这是需要开发的最终产品,可以根据需要与工作站连接(通常通过串口或者usb接口),或连至局域网。 
4、工作站需要安装ftp客户端(cuteftp、flashfxp等)和telnet客户端程序(secureCRT等),linux服务器应该开通ftp和telnet服务,还有ssh。 

述过程:开发人员在一台工作站进行操作,通过远程登陆的方式操作linux server,并且使用ftp在linux
server和工作站进行文件传输,同时target
board需要与网络连接,其串口与工作站的RS232接口连接。使用工作站上的超级终端作为嵌入式目标系统输入/输出端。

对于开发流程有了一定的了解后就有了目标,这样才能够不是太郁闷。
我的开发环境:[color="#006666"]Windows XP SP2+VMWARE+RedHat 9.0
首先规划一下,我先建立了一个用户armlinux,我的全部工作都是在这个用户根目录下完成。
$pwd
/home/armlinux
$mkdir bootloader debug images software source kernel rootfiles sysapps tmp tools program
$ls
bootloader   images   program software   sysapps   tools
debug    kernel   rootfiles   source tmp
然后建立环境变量,直接在.bash_profile中改就可以了。
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
       . ~/.bashrc
fi

# User specific environment and startup programs
[color="#ff0000"]export TARGET=arm-linux
export PRJROOT=/home/armlinux
export PREFIX=${PRJROOT}/tools
export TARGET_PREFIX=${PREFIX}/${TARGET}
export PATH=$PATH:$HOME/bin:$PREFIX/bin:/sbin:/usr/sbin:/usr/local/sbin

unset USERNAME 
这样在下一次进入此用户时,环境变量就生效了。如果想立刻生效,那么可以用下面的命令:$source .bash_profile。这种方法可以使这些环境变量在进入用户armlinux后就会成效,比较方便。

三、建立交叉编译环境
这一步工作我已经很顺利的完成了。刚开始时,手动建立交叉编译工具链,很困难,出现了很多问题,幸亏网上有不少
的资料可以参考。关于手动建立交叉编译工具链的过程我已经做了总结,放到blog上了。现在可以获得已经编译好的工具链,这样比较方便些,毕竟几个小时的
手动建立过程太繁琐,太容易出错了。
3.1 获取交叉编译工具链
网站:
http://www.arm.linux.org.uk
在linux server上以ftp方式登陆:
#ftp 
ftp.arm.linux.org.uk
这是系统提示输入用户名和密码,不要随便输,那样可能会连接失败。该ftp站点是允许匿名访问的,所以你可以用下面的用户名:anonymous登陆,密码无,直接回车就可以了。
进入后执行:
ftp>cd pub/armlinux/toolchain/
ftp>bin
ftp>get cross-2.95.3.tar.bz2
ftp>get cross-3.0.tar.bz2
ftp>get cross-3.2.tar.bz2
ftp>get README
ftp>bye
Linux
2.4.xx及其以下的内核源码用2.95.3的交叉编译器来编译就可以了;而2.6.xx的内核源码一般要用到cross-3.x以上的版本来编译。所
以我全都下载下来了,备用。要想用更新的版本,则可以到网站ftp://ftp.handhelds.org/projects/toolchain下
载,这里可以下在到cross-3.3.2和cross-3.4.1,默认路径是/usr/local/arm/。
从手动编译就可以知道,根据环境变量PREFIX指定了安装目标文件夹,那么上面提供的编译好的工具链也必须安装到指定的文件夹才可以使用。可以在README中知道安装方法:
This works for both gcc-2.95.3 and gcc-3.0.
How to install:
   cd /usr/local
   mkdir arm
   cd arm
   tar Ixvf cross-.tar.bz2
Add /usr/local/arm//bin to your path to use the cross compiler.
在Linux下面要养成看README、INSTALL文件的习惯,虽然是英文,但是写得都比较具体,比较简洁,没有很困难的。
明确了方法就比较简单了。
#mkdir /usr/local/arm
#cd /usr/local/arm
#tar jxvf cross-2.95.3.tar.bz2
然后添加路径:
$cd
$ls -a
$vi .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
       . ~/.bashrc
fi
# User specific environment and startup programs
export TARGET=arm-linux
export PRJROOT=/home/armlinux
export PREFIX=${PRJROOT}/tools
export TARGET_PREFIX=${PREFIX}/${TARGET}
export [color="#ff0000"]PATH=$PATH:$HOME/bin:$PREFIX/bin:/usr/local/arm/2.95.3/bin:/sbin:/usr/sbin:/usr/local/sbin
unset USERNAME
看见红 {MOD}的行就是修改好的。只需要把你的路径添加到后面就可以了。
这样可以验证一下了。
验证:
$cd
$cd program
$vi hello.c
-------------------------------------------
#include 
int main()
{
       int i;
       for(i=1;i
--------------------------------------------
保存后退出。
$arm-linux-gcc hello.c -o hello-arm
$file hello-arm
hello-arm: ELF 32-bit LSB executable, ARM, version
1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs),
not stripped
这就说明生成的hello-arm是可以工作在ARM平台上的,也证明了你的交叉编译工具链是有效并且可用的。
在下载的2.95.3的工具链中没有包含调试工具gdb和目标板的gdbserver。在这里一起搭建好。
首先从
ftp://ftp.gnu.org/gnu/gdb
中获得gdb套件。解压缩关于路径就不多说了。
$cd
$cd debug
$mkdir build-gdb build-gdbserver
$cd
$cd software
$../source/gdb-5.2.1/configure --target=$TARGET --prefix=$PREFIX
$make
$make install
这样就可以顺利的完成gdb-5.2.1的安装了。
要想对目标板进行交叉编译,gdb显得太大了些,所以需要gdbserver。下面建立gdbserver。
$cd
$cd debug/build-gdbserver
$chmod +x ../../software/gdb-5.2.1/gdb/gdbserver/configure
$CC=arm-linux-gcc ../../software/gdb-5.2.1/gdb/gdbserver/configure --host=$TARGET --prefix=$TARGET_PREFIX
$make
$make install
n=`echo gdbserver | sed 's,x,x,'`;
if [ x$n = x ]; then n=gdbserver; else true; fi;
/usr/bin/install -c gdbserver /home/armlinux/tools/arm-linux/bin/$n;
/usr/bin/install -c -m 644 ../../software/gdb-5.2.1/gdb/gdbserver/gdbserver.1 /home/armlinux/tools/arm-linux/man/man1/$n.1
/usr/bin/install: 无法创建一般文件‘/home/armlinux/tools/arm-linux/bin/gdbserver’: 没有那个文件或目录
/usr/bin/install: 无法创建一般文件‘/home/armlinux/tools/arm-linux/man/man1/gdbserver.1’: 没有那个文件或目录
make: *** [install-only] Error 1
此处错误不难理解,主要是因为交叉编译工具放到/usr/local/arm里面了。前面的安装目录tools里面缺少几个文件夹,只需要建立就可以了。
$cd $PRJROOT/tools
$mkdir arm-linux
$cd arm-linux
$mkdir bin man
$cd man 
$mkdir man1
$cd $PRJROOT/debug/build-gdbserver
$make install
这样就没有问题了,当然也可以修改makefile,但是自己还没有学好shell语言,所以采取上述方法解决了。这样首先用strip处理一下,目的是gdbserver不需要附带上调试的信息,把它们都剥离去就是了。
$arm-linux-strip $TARGET_PREFIX/bin/gdbserver
$ls -l $TARGET_PREFIX/bin/
总用量 24
-rwxr-xr-x 1 armlinux armlinux 23132   8月 10 11:33 gdbserver
也就是说,gdbserver经过strip处理之后还剩下23KB多一点,已经挺小了,适合目标板了。
附:
在CU论坛上看到tree工具可以查看目录树,觉得不错。也想要安装一个。
$cd
$cd source
$ftp mama.indstate.edu
Connected to mama.indstate.edu (139.102.70.201).
220 ProFTPD 1.3.0 Server (ProFTPD Default Installation) [139.102.70.201]
Name (mama.indstate.edu:armlinux): anonymous
331 Anonymous login ok, send your complete email address as your password.
Password:
230 Anonymous access granted, restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd linux/tree
250 CWD command successful
ftp> ls
227 Entering Passive Mode (139,102,70,201,149,53).
150 Opening ASCII mode data connection for file list
drwxr-xr-x 2 root     root       4096 Jun   4   2001 binary
drwxr-xr-x 2 root     root       4096 May 19   1999 slack
-rw-r--r-- 1 root     root       406 Oct 11   1996 tree-1.1.lsm
-rw-r--r-- 1 root     root        13135 Oct 11   1996 tree-1.1.tgz
-rw-r--r-- 1 root     root       405 Jan   6   1997 tree-1.2.lsm
-rw-r--r-- 1 root     root        16362 Jan   6   1997 tree-1.2.tgz
-rw-r--r-- 1 root     root       436 Feb 21   2002 tree-1.3.lsm
-rw-r--r-- 1 root     root        25060 Feb 21   2002 tree-1.3.tgz
-rw-r--r-- 1 root     root       432 Feb 21   2002 tree-1.4b1.lsm
-rw-r--r-- 1 root     root        27536 Feb 21   2002 tree-1.4b1.tgz
-rw-r--r-- 1 root     root        27891 Mar 25   2002 tree-1.4b2.tgz
-rw-r--r-- 1 root     root       432 Jun 18   2003 tree-1.4b3.lsm
-rw-r--r-- 1 root     root        29366 Feb   6   2003 tree-1.4b3.tgz
-rw-r--r-- 1 root     root       466 Aug 20   2004 tree-1.5.0.lsm
-rw-r--r-- 1 root     root        26543 Aug 16   2004 tree-1.5.0.tgz
226 Transfer complete.
ftp> get tree-1.5.0.tgz
ftp> bye
221 Goodbye.
$mv tree-1.5.0.tgz tree-1.5.0.tar.gz
$cd ../software
$tar xvzf ../source/tree-1.5.0.tar.gz
$make
$make install
然后就可以了,安装路径查看makefile文件知道在/usr/local/bin,也可以用which查看。现在可以用tree命令来查看一下自己的目录结构了。
示例:
$cd
$tree -L 1     //显示一级目录,当然也可以显示二级目录了。
.
[color="#0000ff"]|-- bootloader
|-- debug
|-- images
|-- kernel
|-- program
|-- rootfiles
|-- software
|-- source
|-- sysapps
|-- tmp
`-- tools
这样对自己的组织比较好。等用tree熟悉了,在补充它的用法。
四、引导装载程序bootloader
因为u-boot的功能比较强大,所以选择了u-boot。这几天想先研究研究它的代码,好好分析一下启动过程。原来做过一次,不过是利用原来开发板做好的,熟悉过程是可以,但是不明白原理仍然不行。这次要学习掌握原理部分。
待续。。。。