ARM的Linux移植过程

ARM 142浏览

引言
面向A R M 微处理器构架的嵌入式操作系统的使用量将在今后五
年持续增长,在各种嵌入式操作系
统中,Linux是获得支
持最多的第三
大力量。
目前,ARM Linux 支持包括
A R M 6 1 0 、A R M 7 1 0、A R M 7 2
0 T
cores、ARM920T cores、StrongARM
110、StrongARM 1100、XScale 等

列的ARM 处理器。这些处理器
都具有M M U 单元,与之相对应是
NOMMU 的mClinux,主要是支持
ARM7TDMI
系列的微处理器。在
ARM Linux 的基础上,很多开发者
将其移植到了自己的硬件平台上,
并提交相应的Machine
Type。本文
以实例分析完整地介绍了移植的过
程,对于准备在ARM Linux 上做
应用开发的技术人员有一定的借鉴

用。
ARM Linux 的移植过程
将ARM Linux 移植到特定的硬
件平台上,大致需要分成四个步骤:
首先是准备
工作,包括下载源码、建
立交叉编译环境等;然后是配置和
编译内核,必要时还要对源码做一
定的修改;另外还需要制作RAM
disk
来挂接根文件系统;最后是下
载、调试内核并在RAM disk中添加
自己的应用程序。本文以
StrongARM
为例,说明如何将ARM
Linux 移植到SA1110 微处理器上。
下面分四个部分介绍移植工作。
内核源码及交叉编译环境的准

 内
核源码下载
标准Linux 的内核源码可以从
ftp://ftp.kernel.org
下载,在很多的
镜像ftp 站点上也可以方便地获得,
建议使用2.4 版本的内核。ARM
Linux
是基于标准Linux、内核为
A R M 做的补丁,在f t p : / /
ftp.arm.linux.org.uk
上可以下载。当
然也
可以直接下载已经针对标准内
核打好补丁的ARM Linux 源码包,
示例SkyEye 上提供的linux-2.4.18-
rmk7.tar.bz2,
就是基于2.4.18内核
和rmk7 补丁,可以直接解压之后进
行编译。
 交叉编译环境的建立
移植前需要在宿主机上建立
ARM
的交叉编译环境,主要用到的
开发工具包括三个部分:binutils、
gcc、glibc。其中,binutils 是二进制

件的处理工具;gcc 是编译工具;
glibc 是链接和运行库。所有需要用
到的工具既可以下载源码自行编
译,也可以直接下载已
经编译好的
二进制工具。本文介绍的安装方法
就是基于SkyEye 开发环境下的安
装包文件。
a. binutils
的安装
binutils 主要包含了一些辅助开
发工具,示例objdump 显示反汇编
码、nm列出符号表、readelf
显示elf
文件信息及段信息、strip 将不必要
的代码去掉以减少可执行文件大小
等。这些工具在嵌入式开发初期,尤

是移植调试操作系统时非常有用。
安装的步骤:
1) 下载安装包文件: binutils-
2.11.2.tar.gz ;
2)
解开安装包到当前目录下:
tarzxfbinutils-2.11.2.tar.gz,此时在
当前目录下生成一个binutils-
2.11.2
目录。
■ 清华大学智能技术与系统国家重点实验室李明
ARM Linux 的移植过程及分析
摘要:本文结合
实例说明了移植ARM Linux 到特定硬件平台上的实现过程,并对ARM Linux 的启动
代码做了分析。
关键词:ARM
Linux;移植;RAM disk;交叉编译
2003.7 电子设计应用www.eaw.com.cn
56
嵌入式系统嵌入式系统
3) 配置安装包: ./configure --
target=arm-linux
--prefix=/usr/local,
target 选项表示选定的目标代码格
式,一般是arm-linux,prefix 表示

执行make install 时的安装根路径。
4) 编译和安装:make、make
install。注意安装时可能需要root 权
限,
在prefix 目录下当前用户有写
权限,安装成功后,binutils工具将
安装在/usr/local/arm-linux
目录下。
b. gcc 交叉编译器
gcc 是用来编译内核代码的工
具,使用它可以编译汇编语言和C语
言的程序,生成
ARM 的代码。建议
使用gcc 2.95 以上的版本来创建ARM
开发环境,本文使用2.95.3 版本。
安装的步骤:
1)
下载安装包文件和补丁程
序: gcc-2.95.3.tar.gz ;gcc-
2.95.3.diff.bz2。
2)
解开安装包到当前目录下:
tar zxf gcc-2.95.3.tar.gz,此时在当
前目录下生成一个gcc-2.95.3 目录,

入该目录。
3) 对当前的安装包打补丁:
bzcat ../gcc-2.95.3.diff.bz2 | patch -
p1。
4)
修改gcc/config/arm/t-linux 文
件,在文件最后加上如下条件编译
选项:
T_CFLAGS=-Dinhibit_libc
-
D__gthr_posix_h。
5) 配置安装包:./configure --
target=arm-linux--prefix=/usr/local
-
-with-headers=arm linux源码目录下
的include 目录。这里前两个选项和
上面binutils
的安装类似,--withheaders
是用来指定内核头文件的目
录,一般就可以使用上面A R M
linux
的include 目录。需要注意的
是这里的路径需要用全路径名,而
不能使用相对路径。
6 ) 编译源码: m a k e
LANGUAGE=“C
”。这里因为还没
有一个ARM 可用的glibc,所以只
能编译C 语言的交叉编译工具。如
果在编译好glibc
之后,就可以回
来重新编译gcc,以支持其他语言。
7) 安装编译好的工具: make
install
LANGUAGE=“C”。安装成
功以后,arm-elf-gcc 将安装在/usr/
local/arm-linux 目录下。

了安装好的binutils 和gcc 工
具,就可以用来编译ARM Linux 内
核了。如果需要在ARM Linux 做应

程序的开发,就还需要一个glibc
库的支持。
c. glibc 库
glibc 的编译需要为刚才做好的
ARM
交叉编译器指定编译器;否则
编译出的glibc 代码将会是同时有
ARM 和x86 代码的混和体。
1) 解开安装包: tar
zxf glibc-
2.2.3.tar.gz。此时在当前目录下生
成一个glibc-2.2.3 目录,进入该目
录。
2)
解开glibc-linuxthreads安装
包: tar zxvf ../glibc-linuxthreads-
2.2.3.tar.gz。
3)
设置编译器: CC=arm-linuxgcc

4) 配置安装包: ./configure armlinux--
build=i586-linux--prefix=/usr/
local/arm-linux
-enable-add-ons。
arm-linux 表示选ELF 格式的可执
行格式,--build=i586-linux
表示用
来制作交叉开发环境的宿主机的机
器类型,--prefix=/usr/local/armlinux
表示安装的路径,这里
不能指
定为/usr/local,否则会把/usr/local
下的库覆盖掉,需要非常留意。
5) 编译和安装: make;
make
install。安装成功后,glibc 库将安装
在/usr/local/arm-linux 目录下。
ARM
Linux 的内核配置与编译
 内核配置选项
在安装完内核源码和所需的开
发工具之后,需要对内核进行配
置,主要包括:
a
. 选择处理器类型:选择
SA1100-based
System Type
(SA1100-based) ARM
system
type
b. 选择板级支持: 选择Assabet 板
SA11x0 Implementations
--->
[*] Assabet
c. 选择对RAM disk 支持: 选择
RAM disk 支持,大小为512k
字节
Block devices --->
[*] RAM disk support
(512) Default RAM
disk size
[*] Initial RAM disk (initrd)
support
d. 选择设备驱动支持:
选择串
口设备驱动,这样在内核启动时就
可以从串口打印出启动信息。
Character devices --->
Serialdrivers
--->
[*] SA1100 serial port support
[*] Console on SA1100
serial
port
(9600) Default SA1100 serial
baudrate
e.
选择文件系统支持:选择
Ext2
[*] Second extended fs support
 编译内核
根据最后生成
的内核是直接在
RAM 中运行还是从ROM 中启动,
www.eaw.com.cn
电子设计应用2003.7 57
嵌入式系统嵌入式系统
69
www.eaw.com.cn
电子设计应用2003.7 69
电源技术电源技术
时,会切断内部电源。通常情况下,
开关由电池通过13 引脚供电,低电

肖特基二极管阻止非充电电池被
外部电源充电。V CC 由第10 引脚的
开关取出,大多数应用中,这个电
压还要由后面的电压调节
器进行调
理。一旦检测到外部电源电压,微
控制器接通开关1和4,断开开关3。
输出电容C 在VCC 由开关3 切向开关
4
的过程中为系统提供电源。为了
保护电池,当开关4 闭合时,必须始
终保持开关3 处于断开状态。外部
电源移走后,开关4和1断
开而开关
3 闭合。当外部电源电压高于电池
电压,或电池已深度放电时接入外
部电源,或C 已充电而电池被移走
时,故障保
护特性可以保证开关正
确、安全地工作。■