这篇文章是我6个月前在老师的指导下写的论文,留在博客里,做个备份,那时我的系统环境是window 7虚拟机下的RedHat Enterprise Linux6.0 ,现在我的系统环境是Ubuntu13.04。讲的比较粗糙,有不正确的地方希望大家指出。
本文结合S3C2440处理器和GT2440开发板这个实验平台,进行了嵌入式Linux的移植,Linux内核版本号为2.6.29。通过本次实践,成功实现了Linux系统移植,从而为后续的Linux应用程序开发及设备驱动程序开发打下了基础,进而为ARM的实际工业自动化应用及其他应用打开一个良好的开端。
嵌入式系统是以应用为中心,软硬件可以裁剪,对功能、可靠性、成本、体积、功耗有严格的要求的系统。嵌入式系统的设计开发主要涉及嵌入式微处理器和嵌入式操作系统。处理器的选择是嵌入式系统的基础。目前
,市场上的
CPU种类繁多,包括
X86系列、
ARM系列、
MIPS系列及其他一些专用的
CPU,本文采用的
CPU是
ARM系列的S3C2440,它是三星的一款基于
ARM920T内核开发的
32位嵌入式处理器,为手持设备和
其它嵌入式应用提供了低功耗、低价格、高性能微控制器的解决方案
操作系统也是嵌入式系统的重要组成部分。目前的嵌入式操作系统有
WindowsCE、
Linux、
uClinux、
uC/OS-II、
Vxworks等,每种操作系统都有其各自的优点。本文选用的是现在比较流行应用广泛的
Linux系统。它是以
Unix为基础发展起来的一款开源的操作系统,是真正的多用户、多任务操作系统,具有极强的平台可伸缩性、丰富的图形用户界面及强大的网络功能。再加上它提供了强大的管理功能,因此,
Linux系统非常适于嵌入式系统开发
-
系统引导程序及移植
-
构建交叉编译环境
嵌入式
Linux的开发环境可以是
PC机上直接安装
Linux,也可以是
Windows下在虚拟机上安装
Linux。本文的实验环境是在
Windows7下使用虚拟机安装
RedHat
Linux操作系统,主机与目标板的链接主要是通过
USB口、串口、并口、以太网口建立联系的。
PC机一般称为主机,目标板称为目标机。
在移植前首先要先构建交叉编译环境。交叉编译环境是指利用运行在机器上的编译器编译某个源程序,生成在另一台机器上运行的目标代码的过程
[5]。主要的开发工具包括三个部分:
arm-linux-gcc,arm-linux-objdump,arm-linux-readelf。其中
arm-linux-gcc是编译工具,
arm-linux-objdump是反汇编工具,
arm-linux-readelf是
ELF文件查看工具。
将已经制作好的交叉编译工具的安装包
arm-linux-gcc-4.3.2.tar.gz通过
vmwaretools工具从
windows下挂载到
Linux下的
/mnt/hgfs/目录下,执行命令
[root@localhosthgfs]#
tar xvzf arm-linux-gcc-4.3.2.tar.gz -C /opt,将交叉编译工具解压到
/opt,然后修改
/etc/profile这个配置文件,通过
vim编辑器进入文件中,添加
export
PATH=$PATH:/usr/local/arm/4.3.2/bin,最后关键的一步是执行
source /etc/profile,完成交叉编译环境的安装。
2
.bootloader引导程序及移植
引导加载程序是系统加电后运行的第一段代码,类似于
PC机上的
BIOS,它包括固化在固件(
fireware)中的
boot代码和
bootloader两大部分。通过这段程序,可以初始化硬件设备、建立内存空间的映射图、为最终调用操作系统内核作好准备。
Bootloader是依赖于硬件实现的,因此在嵌入式操作系统中建立一个通用的
Bootloader是不可行的。大多数
Bootloader都分为
stage1和
stage2两大部分。依赖于
cpu体系结构的代码,比如设备初始化代码等,通常都放在
stage1中,而且通常都是汇编语言来实现,以达到短小精悍的目的。而
stage2则通常用
c语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和克移植性
[2]。
Bootloader的
stage1上电启动后通常按以下步骤执行:首先初始化硬件设备,如:
CPU内部寄存器、内存等。然后是为加载
Bootloader的
stage2准备
RAM空间,接着拷贝
Bootloader的
stage2到
RAM空间中,然后设置好堆栈,最后跳转到
stage2的
c入口点。
Bootloader的
stage2通常按以下步骤执行:初始化本阶段要使用的硬件设备,如:串口、网卡等,然后将内核映像和根文件系统映像从
flash上读到
RAM空间中,最后调用内核。
U-boot是一种通用引导程序,能够支持像
ARM,X86,XS-cale等多个处理器系列,支持
Linux,
Vxwork等多个嵌入式操作系统,具有可靠性和稳定性强的特点,拥有丰富的设备驱动源代码,拥有强大的网络支持和大量的开发调试文档。
U-boot作为一种源码开放的引导程序,源代码采用模块化编程,能够很好的在各种硬件平台上实现方便移植。本文选用的是
GT2440开发板作为
Linux操作系统移植的硬件平台,完成
U-boot的移植的步骤如下:
1.在顶层的
Makefile中为开发板添加新的配置选项
[4]。
2.在
board目录中创建一个属于新开发板的目录,并添加文件:
mkdir -p board/gt2440
cp -rf board/smkd2440 board/gt2440
3.为开发板添加新的配置文件,先复制参考开发板的配置文件,再修改。
cp include/configs/smdk2440.h include/configs/gt2440.h
4.配置开发板:
make gt2440_config具体的配置需要根据自己的开发板硬件资源的功能和应用作选择。
5.编译
U-boot:
make CROSS_COMPILE= arm-linux-,编译成功可以得到
U-boot映像。
6.将
U-boot映像通过
JTAG烧写的到
GT2440开发板的
NANDFlash的根文件分区中。
-
嵌入式linux系统移植
-
配置编译内核文件
将
Linux源码
linux-2.6.29.tar.gz通过
vmwaretools工具从
windows下挂载到
Linux下的
/mnt/hgfs/目录下,执行命令
[root@localhosthgfs]#
tar xvzf linux-2.6.29.tar.gz -C / 解压到你指定的目录。接下来配置步骤如下:
1.清除原有的配置与中间文件:
make
distclean
2.配置内核:
make
menuconfig ARCH=arm 具体的内核配置应根据硬件平台和应用需要进行选择
3.编译内核:
make
Image ARCH=arm CROSS_COMPILE= arm-linux-
编译成功后会在
arch//boot/目录下看到
uImage内核
-
Linux内核的移植
连接并启动开发板,通过
setenv命令设置
ethaddr,
ipadder, serverip等参数,再通过
saveenv命令保存设置。其中
ethaddr是网卡地址,
ipadder是开发板的
ip地址,
serverip是
tftp服务器的地址。
最后把
目录下的
uImage通过
tftp读入到起始地址为
0的
nandflash中
[5]:
U-boot〉
tftp
22200000 uImage
U-boot〉
nand write 22200000 0 200000
-
根文件系统的制作
根文件系统是
Linux启动时使用的第一个文件系统。没有根文件系统,
Linux将无法正常启动。根文件系统由一系列目录组成,目录中包含了应用程序,
c库,以及相关的配置文件。通过如下步骤制作根文件系统
:
1.创建根文件系统的目录:
mkdir rootfs
cd rootfs
mkdir bin dev etc lib proc sbin sys usr mnt tmp var
mkdir usr/bin usr/lib usr/sbin lib/modules
2.创建设备文件:
cd dev /先进入cdev目录
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
注意
Linux系统正常启动必须要有这两个设备文件
3.安装
/etc:
tar etc.tar.gz -C /XXX/rootfs
etc目录下放置了很多的配置文件,包括与系统启动、关闭有关的配置文件,这些配置
文件非常重要,没有它,系统不能正常启动。
4.编译内核模块:进入
Linux内核目录
make modules ARCH=arm CROSS_COMPILE= arm-linux
5.安装内核模块
make modules_install ARCH=arm INSTALL_MOD_PATH=/XXX/rootfs
实际上安装内核模块就是把它从内核代码拷贝到指定的位置。
6.配置
busybox 具体的配置需要根据自己的应用需求选择
7.编译安装
busybox:
make ARCH=arm CROSS_COMPILE= arm-linux-
make install
busybox是嵌入式开发中的瑞士军刀:小巧、功能强大,提供了几乎所有你需要的命令。
然后使用
mkyaffs2image工具
(同时也是一个命令)制作成
映像文件rootfs.yaffs(注意此处是制作成适合于NandFlash的yaffs型根文件系统),并将其通过串口下载到
NandFlash的根文件分区中。
最后,利用终端仿真程序
DNW和
Bootloader引导程序通过串口把内核
镜像uImage下载到
GT2440的
S3C2440上。完成后重新启动开发板,通过超级终端可以看到系统正常启动。
这时,就可以像在虚拟机上操作安装的Linux系统一样,可以在超级终端
上输入命令,来控制目标板(GT2440)上的移植的Linux系统。
3.结束语
本文结合嵌入式
Linux系统和
GT2440平台,研究并实现了
Linux操作系统向
S3C2440平台的移植,成功搭建了基于
ARM9的嵌入式系统开发平台,这对嵌入式
Linux的开发有很大的帮助,为后续的驱动器程序和应用程序的开发也奠定了基础。构建嵌入式系统是一项比较复杂的过程,其系统的稳定性,安全性,可靠性等都要使用者详细考虑。虽然本文嵌入式系统的构建是建立在
Linux操作系统和
S3C2440目标板上的,但是对于其他的操作系统和目标板来说,其原理是一样的。