基于ARM的嵌入式Linux系统构建Word文档下载推荐.docx
《基于ARM的嵌入式Linux系统构建Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于ARM的嵌入式Linux系统构建Word文档下载推荐.docx(8页珍藏版)》请在冰豆网上搜索。
S3C2410microprocessor;
1引言
随着信息产业的发展和集成电路技术的进步,嵌入式系统已经广泛地应用到移动计算设备、网络设备、工控设备、信息家电和仪器仪表等领域。
嵌入式系统,是
以应用为中心、以计算机技术为基础、软硬件可裁剪,能适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
这种系统具有软件代码少、响应速度快、高度自动化等特点,用于实现对其它设备的控制、监视或管理等功能,特别适用于要求实时的和多任务的应用[1]。
ARM嵌入式芯片是一种高性能、低功耗的RISC芯片。
他由英国ARM公司设计,世界上几乎所有的主要半导体生产商都生产基于ARM体系结构的通用芯片,或在其专用芯片中应用相关ARM技术,S3C2410是韩国Samsung公司基于ARM公司的ARM920T处理器核,采用0.18um制造工艺的32位嵌入式微处理器。
Linux是免费发
①收稿时间:
2010-03-19;
收到修改稿时间:
2010-04-18行的、快速高效的操作系统,它的出现在计算机世界引发了一场革命。
Linux以其代码开放、功能强大又易于移植等特点成为嵌入式操作系统的新兴力量。
在所有的嵌入式操作系统中,Linux是发展最快、应用最广泛的。
利用Linux搭建嵌入式系统是近年来出现的最令人振奋的方案之一[2,3]。
嵌入式Linux是按照嵌入式操作系统的要求设计的一种小型操作系统,由一个内核以及一些根据需要进行定制的系统模块组成。
其内核很小,一般只
有几百kb,即使加上其他必要的模块和应用程序,所需的存储空间也很小,非常适合于嵌入式系统。
本文将详细论述在基于ARM920T核心的S3C2410平台上构建嵌入式Linux系统的过程,包括交叉开发环境的建立,引导加载程序U-Boot、Linux操作系统内核针对特定目标平台的移植,以及根文件系统的建立等。
2交叉开发环境的建立
嵌入式软件开发中所采用的编译为交叉编译,所谓交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。
搭建交叉编译环境是嵌入式开发的第一步,也是必备的一步,选择合适的交叉编译器对于嵌入式开发是非常重要的。
交叉编译器的安装一般涉及到多个软件的安装,这包括binutils、gcc、glibc等软件。
其中,binutils主要用于生成一些辅助工具,如objdump、as、ld等;
gcc是用来生成交叉编译器,主要生成arm-linux-gcc交叉编译工具;
而glibc主要是提供用户程序所使用的一些基本的函数库。
社区的开发者和一些芯片厂商已经编译出了常用体系结构的工具链,使用这些工具链,将使得工作量大大降低。
将工具链压缩包arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2解压至/workspace/tools目录:
#cd/workspace/tools
#tarjxvfarm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2
在/etc/bashrc文件末尾加入如下一行:
PATH=$PATH:
/workspace/tools/gcc-3.4.5-glibc-2.3.6/bin
3嵌入式Linux系统的构建
3.1引导加载程序U-Boot的移植
系统上电之后,需要一段程序来进行初始化:
关闭WATCHDOG、改变系统时钟、初始化存储控制器、将更多的代码复制到内存中等。
如果它能将操作系统内核复制到内存中运行,无论从本地(如Flash还是从远端(如网络,就称这段程序为BootLoader。
简单地说BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。
通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好环境。
对于一个嵌入式系统来说,可能有的包括操作系统,有的小型系统也可以只包括应用程序,但是在这之前都需要BootLoader为它准备一个正确的环境。
通常,BootLoader是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的BootLoader是很困难的。
U-Boot,全称为UniversalBootLoader,即通用BootLoader,是遵循GPL条款的开放源代码项目,并且已经成为ARM平台事实上的标准BootLoader,其名字“通用”有两层含义:
可引导多种操作系统、同时支持多种架构CPU[4]。
本文所用U-Boot版本为u-boot-1.3.4,将所获取的源码压缩包u-boot-1.3.4.tar.bz2解压得到全部源码,首先需要分析一下它已支持的开发板,比较出硬件最接近的开发板。
本文将在u-boot-1.3.4已经支持的smdk2410板的基础上进行移植。
3.1.1新建、修改目标板对应目录及文件
在board目录下将smdk2410复制为my2410目录,将此目录下的smdk2410.c文件重命名为my2410.c;
将include/configs/smdk2410.h复制为my2410.h;
在顶层Makefile中添加如下两行my2410_config:
unconfig
@$(MKCONFIG$(@:
_configarmarm920tmy2410NULLs3c24x0
然后在board/my2410/Makefile中修改COBJS:
COBJS:
=my2410.oflash.o
3.1.2修改SDRAM配置
本文将目标板HCLK设为100MHz,根据SDRAM芯片的具体参数重新计算REFCNT寄存器的值,对board/my2410/lowlevel_init.S文件作如下部分修改:
#defineREFCNT0x4f4/*period
7.8125us,HCLK=100Mhz,(2048+1-7.8125*100*/
3.1.3支持目标板NANDFlash
对NANDFlash的支持有新旧两套代码,新代码在drivers/mtd/nand目录下。
选择用此新代码来支持目标板NANDFlash。
要让U-Boot支持NANDFlash,首先在include/configs/my2410.h的宏CONFIG_COMMANDS中增加CONFIG_CMD_
NAND,然后在include/configs/my2410.h中选择不定义CONFIG_NAND_LEGACY宏(若定义则为使用旧代码。
在include/configs/my2410.h中作如下定义:
#defineCONFIG_CMD_NAND
#defineCFG_MAX_NAND_DEVICE1//目标板上有一块NANDFlash设备
#defineCFG_NAND_BASE0x4e000000//NANDFlash控制器基址
3.1.4支持CS8900
本文目标板网卡芯片CS8900的连接方式与样板
smdk2410一致,U-Boot已能够支持CS8900,其驱动程序为drivers/cs8900.c。
所以在使用网络之前设置其IP地址、MAC地址、宿主机IP地址即可。
3.1.5若干默认配置参数的设置
在include/configs/my2410.h中增加以下默认配置参数:
#defineCONFIG_SETUP_MEMORY_TAGS1
#defineCONFIG_CMDLINE_TAG1
#defineCONFIG_BOOTARGS“noinitrd
root
=/dev/mtdblock1rootfstype
jffs2console
ttySAC0”
#defineCONFIG_ETHADDR08:
00:
3e:
26:
0a:
5b
#defineCONFIG_NETMASK255.255.255.0
#defineCONFIG_IPADDR222.198.131.33
#defineCONFIG_SERVERIP222.198.131.32
上述参数分别为设置向内核传递的命令行参数,以及目标板,宿主机IP的设置等。
3.1.6U-Boot的编译、烧写
执行以下命令配置、编译,得到二进制映象文件u-boot.bin。
#makemy2410_config
#makeall
最后,通过JTAG与宿主机并口相连,在主机烧写程序H-JTAG的支持下将u-boot.bin文件烧写到NORFlash。
烧写完成后,复位实验板,串口终端显示u-boot的启动信息。
3.2Linux内核的移植
标准Linux内核对于资源受限的嵌入式系统来说过于庞大,要将其移植到嵌入式系统上,就需要将Linux内核根据目标平台的情况进行剪裁、配置。
本文将配置、修改linux-2.6.22.6内核,使得它在能够支持s3c2410板的同时能够支持JFFS2、YAFFS文件系统,并修改MTD设备分区,以支持挂载NANDFlash上的文件系统。
3.2.1MTD分区的修改
MTD(MemoryTechnologyDevice,即内存技术设备,是Linux中对ROM、NOR
Flash、NANDFlash等存储设备抽象出来的一个设备层,它向上提供统一的访问接口读、写、擦除等,屏蔽了底层硬件的操作、各类存储设备的差别。
本文修改arch/arm/plat-s3c24xx/common-smdk.c中的smdk_nand_part结构,改变分区信息
Staticstructmtd_partitionsmdk_default_nand_part[]={
[0]={
.name
“kernel”,
.size=SZ_2M,
.offset=0,
},
[1]={
“jffs2”,
.offset=
MTDPART_OFS_APPEND,
.size=SZ_8M,
[2]={
“yaffs”,
.offset=MTDPART_OFS_APPEND,
.size=MTDPART_SIZ_FULL,
}
};
本文所划出的分区情况:
前2MB存放内核,接下来8MB存放JFFS2文件系统,剩下的以后可用来存放YAFFS文件系统。
3.2.2添加支持YAFFS文件系统
YAFFS(yetanotherflashfilesystem是类似于JFFS/JFFS2、专为NANDFlash而设计的一种嵌入式文件系统,适于大容量的存储设备。
它提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统的一致性和完整性的影响[5]。
可从http:
//www.aleph1.co.uk/cgi-bin/viewcvs.cgi/获取其源码压缩包root.tar.gz,解压之,并使用其中的文件patch-ker.sh来修改内核。
进入yaffs2源码目录:
#cd/workspace/system/Development/yaffs2
#./patch-ker.shc/workspace/system/linux-2.6.
22.6
3.2.3内核配置、编译与烧写
现在,内核支持s3c2410,同时能够支持JFFS2、YAFFS文件系统,且在修改了MTD设备分区后能支持挂载NANDFlash上的文件系统。
现对内核进行配置、编译,进入Linux内核源码所在目录,执行如下命令:
#cd/workspace/system/linux-2.6.22.6
#cp
arch/arm/configs/s3c2410_defconfig./.config
#makemenuconfig
#makeuImage
先将arch/arm/configs/下的s3c2410_defconfig文件复制为内核源码根目录下的.config文件,在此基础上对若干配置选项作进一步的选择,主要包括以下几项配置:
处理器类型,板级支持,对RAMdisk、设备驱动及文件系统的支持。
编译完成后在arch/arm/boot/目录下生成U-Boot格式的内核映象文件uImage。
#tftp0x30000000uImage
#nanderase0x00x200000
#nandwrite.jffs20x300000000x0$(filesize
上述命令将uImage置于主机tftp目录下,通过tftp方式下载并将之烧写到NANDFlash前2M空间中。
3.3根文件系统的构建
Linux系统由内核与文件系统共同构成,而根文件系统则是Linux启动时使用的第一个文件系统。
没有根文件系统,Linux将无法正常启动。
根文件系统由一系列目录组成,目录中包含了应用程序、C库、以及相关的配置文件[6]。
所谓制作根文件系统,就是创建各种目录,并且在里面创建各种文件。
比如在/bin、/sbin目录下存放各种可执行程序,在/etc目录下存放配置文件,在/lib目录下存放库文件等。
本文首先使用Busybox来创建/bin、/sbin等目录下的可执行文件。
Busybox是一个遵循GPLv2协议的开源项目,它将众多的UNIX命令集合进一个很小的可执行程序中,其中各种命令与相应的GNU工具相比,所能提供的选项较少,但是能够满足一般应用。
3.3.1配置Busybox
将获取的Busybox源码压缩包解压之得到源码目录busybox-1.7.0。
首先通过配置Busybox来选择所需要的命令、定制某些命令的功能(选项、指定Busybox的连接方法,以及其安装路径。
在busybox-1.7.0目录下执行:
#makemenuconfig,退出并保存所做配置。
然后分别修改Busybox根目录下Makefile中ARCH与CROSS_COMPILE变量的值为arm与arm-linux-,进行编译并安装至/work-space/nfs_root目录:
#make
#makeCONFIG_PREFIX=/workspace/nfs_rootinstall
3.3.2使用glibc库
本文使用前面制作交叉编译工具链时生成的glibc库,其位置为/workspace/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib,根文件系统中只需要其中的加载器与动态库,将其复制到根文件系统中:
#mkdir–p/workspace/nfs_root/lib
#cd/workspace/tools/gcc-3.4.5-glibc-2.3.
6/arm-linux/lib#cp*.so*/workspace/nfs_root/li
b–d
3.3.3构建etc目录
该目录用于存放各种配置文件,init进程将根据/etc/inittab文件创建其它子进程,如配置IP地址、挂接文件系统,以及最后的shell启动等。
本文创建3
个文件:
etc/inittab(为init进程创建其它子进程的依据、etc/init.d/rcS(自动运行的命令、etc/fstab(文
件系统。
3.3.4构建dev目录
在/dev目录下创建各设备文件,这涉及的设备有:
/dev/mtdblock*(MTD块设备、/dev/ttySAC*(串口设备、/dev/console、/dev/null等,而其它设备文件可当系统启动起来后,通过cat/proc/devices查看内核中注册的设备,并一一创建相应的设备文件。
最后建立若干需要的空目录,如proc、mnt、tmp、sys、root等。
现在nfs_root下得到一最小根文件系统,将其制作为映象文件nfs_root.jffs2后,烧入NANDFlash中。
#tftp0x30000000nfs_root.jffs2
#nanderase0x2000000x800000
#nandwrite.jffs20x300000000x200000$(filesize
4结语
本文详细论述了在基于ARM920T核心的
S3C2410平台上构建嵌入式Linux系统的过程,包括交叉开发环境的建立,引导加载程序U-Boot、Linux操作系统内核针对特定目标平台的移植,以及根文件系统的建立等。
最终系统在
(下转第31页
情况下,两级数据交换在调用对方数据交换的相关服务时,都需将对方的服务通过两级ESB级联,在本地ESB上注册代理服务,通过调用代理服务,达到调用对方数据交换服务的目的。
通过ESB发送非格式化数据的过程如图5所示。
图5通过ESB发送非格式化数据
5结束语
ERP是当今企业管理水平和信息技术发展的一个重要方向,组成ERP的各个功能模块分别位于企业的不同的组织和部门中,主要用于各部门日常性事务问题的处理。
集团公司组织结构的复杂性,决定了企业中异构信息系统、异构数据的大量并存,若处理不当则很容易导致企业的决策失误。
为了使ERP能为企业(上接第26页
目标平台上运行稳定、可靠,结果证明方法可行,这对其它嵌入式系统的开发同样具有参考意义。
本文创新部分在于其针对特定嵌入式硬件平台的BootLoader的
程序实现和Linux的系统移植,因为平台独特的硬件环境,一些程序代码要严格依赖硬件设备进行设计。
参考文献
1李善平,刘文锋等编著.Linux与嵌入式系统.北京:
清华大学出版社,2003.提供准确的决策支持和分析作用,本文中给出了数据交换平台的总体框架及所涉及的关键技术,按照这个框架部署的系统,能够很好的完成异构数据在异构数据平台上的共享与交换。
随着信息化的进一步发展,各相关技术研究的进一步深入,数据交换平台将会为电子政务等应用提供更为智能、高效、安全的服务,并发挥越来越重要的作用。
1方志梅,屠建飞,叶飞帆.虚拟企业ERP的结构与功能研究.计算机应用研究,2006,23(1:
90-92.
2ZhaiLL,ZhangSC.TheFeatureModelofGeneralERPSystemforDiscreteManufacturingIndustry.InternationalConferenceonElectronicCommerceandBusinessIntelligence,ECBI2009.Beijing,2009.12-15.
3梅立军,付小龙,刘启新,沈锡臣.基于SOA的数据交换平台研究与实现.计算机工程与设计,2006,27(19:
3601-3603.
4刘文菲.基于中间件技术的数据交换平台的设计与实现[硕士学位论文].中国科学院研究生院,2006.
5汪勇,王备战.基于WebService的数据交换平台解决方案.微处理机,2007,28(4:
120-122.
6叶枝平.基于XML的数据交换平台及其关键问题的分析与设计[硕士学位论文].广东工业大学,2008.
2廖日坤编著.ARM嵌入式应用开发技术白金手册.北京:
中国电力出版社,2005.
3杜春雷编著.ARM体系结构与编程.北京:
清华大学出版社,2004.
4康一梅等编著.嵌入式软件设计.北京:
机械工业出版社,2007.
5BovetDP.UnderstandingtheLinuxKernel(3rdEdition.O'
Reilly,2002.
6刘名博,邓中亮.基于ARM的嵌入式Linux操作系统移植的研究.计算机系统应用,2006,15(11:
87-88.