引言
面向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 已充电而电池被移走
时,故障保 护特性可以保证开关正
确、安全地工作。■