论文导读:有Linux、uClinux、WinCE、VxWorks等。本文叙述了嵌入式Linux操作系统在AMR9平台上的移植过程。它基于ARM920T内核。是韩国MIZI公司为其ARM9系列产品而研发的Bootloader。
关键词:Linux,嵌入式系统,移植,Bootloader,内核
0引言
嵌入式系统是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。
目前,可以使用的嵌入式操作系统有很多,有Linux、uClinux、WinCE、VxWorks等。其中,Linux操作系统是一种性能优良、源码公开且被广泛应用的免费操作系统。由于其体积小、可裁剪、运行速度快、安全性能高等优点,常被制作成嵌入式Linux,广泛地应用于嵌入式系统中。嵌入式Linux是指对标准Linux经过小型化裁剪处理之后,能够固化在容量只有几K或者几M字节的存储器芯片或者单片机中,适合于特定嵌入式应用场合的专用Linux操作系统。
本文叙述了嵌入式Linux操作系统在AMR9平台上的移植过程,以及构建一个完整嵌入式Linux开发环境的方法。
1系统平台
1.1 硬件平台
本文使用的硬件平台为武汉创维特信息技术有限公司研发的JXARM9-2410系列AMR9嵌入式教学实验系统。核心CPU采用韩国三星公司的主流ARM9处理器S3C2410X。它基于ARM920T内核,主频高达203MHz,带MMU(内存管理单元),片上资源丰富,性/价比极高,是目前ARM9处理器中,出货量最大的一款主流芯片。
主板包含的硬件资源:(1)64MBSDRAM,由两片16位数据宽度的SDRAM存储器组成,地址范围为0x30000000~0x33fffffff;(2)32MB NOR Flash存储器,其数据宽度为32位,地址范围为0x00000000~0x01ffffff;(3)8MB NAND Flash;(4)3个UART接口:UART0和UART1用作RS232串行接口,UART2用作RS485接口;(5)以太网接口;(6)USB接口;(7)MMC/SD卡接口;(8)彩色LCD显示器加触摸屏;(9)JTAG接口等。
1.2 软件平台
1.2.1 准备工作
我们将在一台安装了RedHat Linux 9.0操作系统的PC机下完成大部分的工作:要在主机上将源文件变成最终可以在目标机上执行的二进制文件,然后下载到目标机上执行,完成移植。在开始移植之前,先要从网上下载需要的源代码:
(1)vivi源代码。vivi是韩国MIZI公司为其ARM9系列产品而研发的Bootloader,小而灵巧,这里选用它作为嵌入式Linux系统的Bootloader。
(2)Linuxkernel源代码。用来裁剪成需要的嵌入式Linux系统,选用的是2.6.18.8版本。论文大全,Bootloader。
(3)交叉编译工具链。cross toolchain2.95.2(用来编译vivi)和4.0.0(用来编译内核)。使用两个版本的原因是vivi用4.0.0交叉编译器,编译出错,所以需选择用2.95.2交叉编译器。
1.2.2 配置开发环境
(1)安装cross toolchain工具,搭建交叉编译环境。构建交叉编译环境的方法有好几种,通过Crosstool脚本工具来实现一次编译生成交叉编译工具链,该方法简单,并且出错的机会也较少,这里使用该方法构建交叉编译工具链。
(2)配置主机网络设置,建立TFTP服务器,设置NFS Server。
(3)需要使用串口实现主机与目标机的通信,在Redhat Linux操作系统下使用的串口通信工具是minicom。
2移植实现
一个最基本的Linux操作系统应该包括:引导加载程序、Linux内核与文件系统三部分。实现移植就是要在开发主机上安装开发工具,编辑、编译目标板所需的引导程序、内核和文件系统,使其能在目标板上运行。
2.1 移植Bootloader
引导程序Bootloader是嵌入式系统在加电后执行的第一段代码,我们需要通过它来初始化必要的硬件设备,将操作系统映像装载到内存中,然后跳转到操作系统所在的空间,启动操作系统运行。Bootloader是依赖硬件实现的,所以我们要根据开发板的设备来构建合适的Bootloader。
(1)修改vivi根目录下的Makefile文件中的相关设置:
lCROSS_COMPILE =…../toolchain/2.95.2/bin/arm-linux-
lARM_GCC_LIB =…../toolchain/2.95.2/lib/gcc-lib/arm-linux/2.95.2
lLINUX_INCLUDE_DIR =…../kernel/linux-2.6.18.8/include
(2)修改arch/s3c2410/smdk.c文件中的default_mtd_partitions[],设置NAND flash。如下表1所示。
文件 |
地址空间 |
标志 |
存储空间 |
vivi |
0x00000000 0x00020000 |
0 |
128K=0x00020000 |
param |
0x00020000 0x00030000 |
0 |
64K=0x00010000 |
kernel |
0x00030000 0x00300000 |
0 |
2M+832K=0x002d0000 |
root |
0x00300000 0x00600000 |
4 |
3M=0x00300000 |
user |
0x00600000 0x04000000 |
8 |
48M=0x03000000 |
表1 Nand Flash 分区表
(3)编译生成vivi.bin可执行文件。
(4)将vivi烧写到Flash。用开发板上自带的JTAG线和开发板连接,使用三星公司提供的SJF工具将上面生成的vivi.bin文件烧写到开发板上。
(5)正确烧写完vivi后,断开JTAG线,连上串口线,给开发板上电,检验vivi是否正常启动。
2.2 Linux内核移植
(1)修改Makefile文件。Linux 2.6内核加入了对S3C2410芯片的支持,驱动的交叉编译非常简单,在其Makefile中修改交叉编译器:
lARCH = arm
lCROSS_COMPILE = arm-linux-
其中ARCH=arm表示是以arm为体系结构,CROSS_COMPILE=arm-linux-表示是以
arm-linux-为前缀的交叉编译器。注意,需要把交叉编译工具链的路径添加到环境变量中,否则CROSS_COMPILE必须使用交叉编译工具链的绝对路径。
(2)修改arch/arm/mach-s3c2410/devs.c文件。我们使用NAND Flash作为Flash存储器,所以需要建立一个NAND Flash分区表来实现空间划分,定义分区存放的起始地址以及大小等。Flash分区信息必须与vivi的Flash分区信息相一致。论文大全,Bootloader。若两者不同,则很可能导致不能正常启动内核或读取文件系统。同时,要建立内核对NAND Flash的支持,加入NAND Flash的驱动程序。
(3)修改arch/arm/mach-s3c2410/mach-smdk2410.c文件。添加对NAND Flash分区表的初始化配置,使上面的修改生效。
(4)修改drivers/mtd/nand/s3c2410.c文件。禁止Flash ECC校验,因为Bootloader通过软件已经产生ECC校验码,这与内核ECC校验码不一致。
(5)内核定制。makemenuconfig显示一个基于文本的图形化配置菜单,是目前被公认为使用最广泛的配置内核方式。在终端下输入命令make menuconfig,将内核中不必要的功能除去,留下一些最基本的功能模块。根据我们开发板的情况,做了几点针对硬件的配置:
l选择处理器的类型——SamsungS3C2410
l加入内核对S3C2410 DMA的支持
l配置可加载模块的支持
l设置文件系统,支持devfs以及cramfs
配置保存后,生成.config文件,接下来的编译工作就是根据这个配置文件来进行的。
(6)内核编译。在内核2.4版本之前,编译内核相对复杂,需要使用好几个命令配合完成。在内核2.6上,可以简单地输入make来完成内核image的生成和模块的编译。在执行完make操作,会在arch/arm/boot目录下生成image和zImage两个内核映像文件,其中image为正常大小的映象文件,而zImage为压缩后的映像文件。压缩的Linux内核映像文件zImage就是将要在目标板上运行的Linux系统的核心。
(7)内核下载。使用minicom在vivi命令行下使用tftp服务下载内核。
2.3 Linux文件系统的移植
此时下载的内核文件在断电后不能保存,要想固化内核和模块到开发板需要添加根文件系统。Cramfs是针对Linux内核2.4之后的版本所设计的一种新型文件系统,是压缩和只读格式的。在嵌入式的环境下,内存和外存资源都需要节约使用,所以这里采用Cramfs文件系统。
(1)下载mkcramfs和cramfsck工具。mkcramfs用来创建Cramfs文件系统,cramfsck用来进行Cramfs文件系统的释放以及检查。
(2)建立根文件系统目录。论文大全,Bootloader。论文大全,Bootloader。根据FHS定义建立一个根文件顶层目录:bin,boot,dev,etc,home,lib,mnt,opt,proc,root,sbin,tmp,usr,var。
(3)借助BusyBox软件进行功能裁剪。BusyBox是很多标准 Linux工具的一个单个可执行实现。输入命令make menuconfig,我们通过界面化的配置得到一个自己需要的Linux工具库。
(4)修改BusyBox的Makefile内容,使用交叉编译环境进行编译。然后执行make install进行安装,将生成目录下的相应文件(bin,sbin,urs/bin,usr/sbin)复制到所构建文件系统的相应目录下。
(4)使用mkcramfs工具制作Cramfs根文件系统的映像,生成rootfs.cramfs映像文件。
(5)下载rootfs.cramfs映像文件到开发板上。
3结语
基于2.6内核的Linux凭借其突出的嵌入式特性与性能优越的ARM9 S3C2410相结合,在嵌入式领域有着广阔的应用天地。论文大全,Bootloader。文章详细阐述了Linux系统在S3C2410处理器上的移植方法,对其中的关键技术和重要步骤都给出了具体说明。论文大全,Bootloader。嵌入式操作系统的制作与移植是进行嵌入式开发的基础,必须熟练掌握。
参考文献:
[1]陈赜.ARM9嵌入式技术及Linux高级实践教程[M]. 北京航天航空出版社, 2005年.
[2]邹颖婷李绍荣.ARM9上的嵌入式Linux系统移植[J]. 计算机应用, 2009年第28卷第6期.
[3]田磊.Linux体系结构及嵌入式Linux的移植与应用[J].西安邮电学院学报, 2009年5月第14卷第3期.
[4]杜文军侯立刚王艳梅.基于ARM的Linux移植分析与实现[J].辽宁石油化工大学学报, 2009年6月第29卷第2期..
[5]王晓宁王振臣张少兵姚帆.Linux操作系统在ARM9处理器上的移植[J].化工自动化及仪表,2010年第37卷第2期.
|