安徽理工大学学报(自然科学版)
JournalofAnhuiUniversityofScienceandTechnology(NaturalScience).28 No.3Vol
Sep.2008
嵌入式Linux系统在S3C2410上的移植实现
赵瑞娟,李敬兆
(安徽理工大学计算机科学与工程学院,安徽 淮南 232001)
摘 要:首先对嵌入式Linux操作系统内核和S3C2410处理器进行了简单介绍,在此基础上,对系统引导程序进行了设计,重点介绍了将Linux移植到S3C2410处理器的步骤和方法,并对移植过程的关键部分进行了详细阐述。编译生成的内核在嵌入式系统中运行稳定,结果证明方法可行,对于开发其它嵌入式系统具有参考意义。关键词:嵌入式操作系统;移植;Linux;S3C2410
中图分类号:TP368.1 文献标识码:A 文章编号:167221098(2008)0320073204
TransplantationofEmbeddedLinuxOperating
SystemintoS3C2410Processor
ZHAORui2juan,LIJing2zhao(SchoolofComputerScienceandEngineering,AnhuiUniversityofScienceandTechnology,HuainanAnhui232001,China)
Abstract:InthepaperkernelofLinuxoperatingsystemandpropertiesofS3C2410processorwereintro2ducedbriefly,basedonwhichthesystemBootLoaderwasdesigned.ThemethodandproceduresofLin2uxtransplantationintoS3C2410werepresented,andthekeyworkrelatedtothetransplantationwasde2.StableworkofthecompiledLinuxkernelinembeddedsystemindicatesthatthescribedindetailmethodoftransplantationiswoekable,whichisareferencetodevelopotherembeddedoperatingsys2tem.
Keywords:embeddedOS;transplantation;Linux;S3C2410
1 Linux内核和实验系统简介
嵌入式操作系统作为大多数嵌入式应用系统的软件平台,它管理着系统的资源,为应用软件提供各种必要的服务。在嵌入式应用系统中使用嵌入式操作系统,已是大势所趋。目前嵌入式操作系统的种类繁多,但Linux以其源代码开放和可移植性强等特点,被广泛使用。本文将介绍如何将内核版本为2.4.18的Linux移植到基于ARM920T的
S3C2410处理器上。1.1 Linux操作系统内核
组成,其中内核是灵魂,负责整个系统的内存管理、进程调度和文件管理。Linux内核与大部分UNIX内核一样是单内核体系结构的,能够根据需要定制内核映像的尺寸,具有很大灵活性,不需要重新编译内核和引导就能检验新的内核组件,这个特性对于嵌入式而言是非常有好处的,方便用户构筑自己的个人内核。Linux内核有五个主要的子系统组成:进程调度、内存管理、虚拟文件系统、网络接口和进程间通信。
本文将对内核版本为2.4.18的Linux进行移植,其内核代码分布如图1所示。
(1)arch目录包含了目前Linux支持的硬件结构——如i386、alpha、arm等的内核代码;
文件结构Linux操作系统主要由内核、shell、
收稿日期:2008204230
作者简介:赵瑞娟(19832),女,安徽舒城人,在读硕士,研究方向为嵌入式系统。
74
安徽理工大学学报(自然科学版) 第28卷
(2)drives目录包含了内核中所有的设备驱
(6)1通道IIC总线控制器,1通道US总线控
动程序;(3)fs目录包含了所有的文件系统的代码;(4)include目录包含了建立内核代码所需要的大部分库文件,这个模块利用其它模块重建内核;
(5)init目录包含了内核的初始化代码,内核从此处运行;(6)ipc目录包含了进程间通信代码;(7)kernel子目录包含了主内核代码;(8)mm目录包含所有于CPU体系结构的内存管理代码;(9)net目录包含了和网络相关的代码,如ipv4、ipv6等。
一般在每个目录下都有一个.depend文件和一个Makefile文件,这两个文件都是编译时使用的辅助文件。
制器;
(7)1.0版本的SD主机接口和兼容的2-11版本的Multi-Media卡协议;
(8)2端口USB主机,1端口USB设备(USB1.1);
(9)4通道PWM定时器,1通道内部定时器;
(10)看门狗电路;(11)117个通用IO口,24通道外部中断源;(12)电源控制:常规、缓慢、空闲和断电模式;(13)8通道10位ADC和触摸屏接口;(14)具有日历功能的实时时钟RTC;(15)具有锁相环的片上时钟发生器。
2 将Linux移植到S3C2410
2.1 移植思路
首先要为Linux设计一个BootLoader,通过BootLoader来初始化硬件,引导Linux运行。Boot2loader设计可以在ads中实现。然后,针对硬件环境
和设计的BootLoader修改Linux内核。接下来,在
最后,配置、编Linux操作系统下建立交叉编译环境。
译、连接Linux,下载编译得到的映像文件到Flash,通过BootLoader来启动嵌入式操作系统Linux。2.2 BootLoader的设计
图1 Linux内核代码分布
1.2 S3C2410处理器
S3C2410是SAMSUNG公司基于ARM920T处理器内核开发的一款1632位嵌入式处理器,运
引导加载程序通常称为BootLoader,就是在
操作系统内核运行之前运行的一段小程序。通过这段小程序,初始化硬件设备、建立内存空间的映射图,从而建立适当的系统软硬件环境,为调用操作系统内核做好准备。
本系统BootLoader的第一阶段主要完成基本的硬件初始化,用汇编语言实现:①关闭watch2dog,屏蔽所有中断;②设置处理器时钟和工作频率,CPU工作频率为200MHz;③初始化外部寄存器;④初始化堆栈指针SP;⑤拷贝BootLoader的第二阶段到RAM空间中,使用一个跳转语句跳转到第二阶段的main入口函数。在完成以上操作后就为main函数的运行建立起了一个基本的环境。
第二阶段用C语言完成:①通用IO口的设置;②完成内存映射初始化和内存管理单元初始化:men_map_init();mmu_init();这两个函数在archs3c2410mmu.c中;③初始化mtd设备:mtd_dev_init();这个函数在driversmtdmaps
行频率高达200多MHz,具有MMU和高速缓存等
丰富片上资源,可以广泛用于PDA、internet设备和手持式设备。其片上集成的功能主要包括以下几个方面:
(1)1.8VARM内核,3.3V存储器,3.3V外部I16kB数据缓存和O,具有16kB指令缓存MMU的微处理器;
(2)外部存储控制器(SDRAM控制和片选逻辑);(3)LCD控制器(支持上到4k色的STN和256k色的TFT),I通道LCD专用DMA;
(4)具有外部请求引脚的4通道DMA;(5)3通道UART,2通道SPI;
第3期 赵瑞娟,等:嵌入式Linux系统在S3C2410上的移植实现75
s3c2410_flash.c中;④拷贝flash中的kernel映像
和根文件系统映像到RAM空间中;⑤跳转到内核的第一条指令处。跳转时需要满足下列条件:R0为0;R1为机器类型ID;禁止中断(IRQ和FIQ);CPU设置为SVC模式(SVC是供操作系统使用的一种保护模式);关闭MMU;关闭数据Cache。至此BootLoader的任务结束。2.3 Linux内核的修改
文件,决定了在配置菜单中看到的内容。添加$CONFIG_ARCH_S3C2410子选项
“$CONFIG_ARCH_S3C2410”=“y”];If[then
Comment‘ArchimedesA5000Implementa2tions’
Dep_bool‘SMDK(MERITECHBOARD)’
CONFIG_S3C2410_SMDK$CONFIG_ARCH_S3C2410其他fi
假定内核代码放在usrsrcLinux22.4.18目录下
(1)打开根目录下的Makefile文件此文件用
来指定编译规则,例如哪些需要编译,哪些需要先
编译。
指定目标平台:Arch=arm;指定交叉编译器:添加CROSS_COMPILE=
。arm2linux2
(2)打开archarm目录下的Makefile文件启动代码的产生需要通过此文件,由于2.4内核还没有对S3C2410的支持,在此添加如下代码:
ifeq((CONFIG_ARCH_S3C2410),y)
TEXTADDR=0xC0008000MACHINE=s3c2410Endif
TEXTADDR是内核的最终运行地址,该位置一般在RAM区起始地址偏移0x8000处(RAM起
在if[“$CONFIG_FOOTBRIDGE_HOST”=“y”-o
……
“$CONFIG_ARCH_SA1100”=“y”];thendefine_boolCONFIG_ISA y
else
define_boolCONFIG_ISA nfi中依样添加“$CONFIG_ARCH_s3c2410”=“y”-o。
(6)打开archarmbootcompressedhead2s3c2410.s此处需要添加内核解压前处理器初始化文件head2s3c2410.s,示例代码如下:
.section#“.start”,“ax”S_3C2410_start:
bic r2,pc,#0x1f@清除pc相关位,放于r2add r3,r2,#0x4000l:
ldr r0,[r2],#32teq r2,r3bne 1b
mcr p15,0,r0,c7,c10,4 @写回WriteBuffer
mcr p15,0,r0,c7,c7,0 @刷新I&Dcaches#if0
@禁用MMU,caches
始地址到偏移0x8000之间的32KB空间中存放一
些全局数据结构如启动参数、内存页表等信息)。
(3)打开archarmboot目录下的Makefile文件ZTEXTADDR是解压前image.rom的位置,ZRELADDR是内核解压并最终执行的位置。ZRELADDR与TEXTADDR之间符合如下映射关系:_virt_to_phys(TEXTADDR)==ZRE2LADDR.
ifeq((CONFIG_ARCH_s3c2410),y)ZTEXTADDR=0XC0008000ZRELADDR=0X30008000
endif
(4)打开archarmbootcompressed目录下($(CONFIG_ARCH_的Makefile文件,添加ifeq“S3C2410),y)
OBJS+=head-s3c2410.o
endif
(5)打开archarmconfig.in此文件是配置
……
#endif
mov r0,#0x00200000l:
subs r0,r0,#1bne 1b
依次将$(CONFIG_ARCH_2410)加入
76
安徽理工大学学报(自然科学版) 第28卷
(3)makemenuconfig:该命令是用来调用菜
(7)打开archarmkernelMakefileno2irq2arch:=$(CONFIG_ARCH_INTE2GRATOR)$(CONFIG_ARCH_CLPS711X)
单式配制内核界面。
(4)makezImage:该命令用来编译内核,生成压缩的Linux内核目标代码zImage文件。
(5)makemodules:该命令编译模块驱动程序2.5 文件系统的生成——创建JFFS2文件系统
……
$(CONFIG_ARCH_AT91RM9200
并添加 obj-$(CONFIG_MIZI)+=e2
card.o
obj-$(CONFIG_ARCH_APM)+=apm2.o
(8)打开archarmkernelentry2armv.s此文件主要定义CPU初始化时中断处理部分,可参考处理器使用手册,按处理器使用要求配置。
(9)打开archarmkerneldebug2armv.s此文件用于最基本的串口调试功能,包括调试串口的地址初始化、发送、等待、忙状态定义等。使用此文件可以在启动过程中打印出相关信息。
(10)打开archarmkernelsetup.c此文件中要根据使用的板子设置几个变量。nr_banks指定了内存块的数量,bank指定了每块内存块的范围,PAGE_OFFSET是内存起始地址,MEM_SIZE是内存的大小,PAGE_OFFSET和MEM_SIZE要在includeasm2armarch2s3c2410中定义。(11)打开archarmmmmm2armv.c此文件用于与硬件相关的内存管理,如初始化内存页表内存映射等。将init_maps->bufferable=0;改为init_maps->bufferable=1。
(12)打开archarmmach2s3c2410建立相应目录并按照处理器使用要求编写irq.c、mm.c、time.c、arch.c、Makefile,分别实现中断控制器的初始化,地址的虚实映射关系,时钟中断和实时时钟处理以及有关Ramdisk使用参数等的设置。
(13)打开includeasm2armarch2s3c2410此目录下定义用到的头文件。2.4 编译Linux内核
文件系统是Linux系统必备的一个部分,本系
统使用mkfs.jffs2工具来创建JFFS2文件系统。首先建立上述的bin、sbin等目录,然后拷贝命令工具到bin文件夹,拷贝系统控制程序到sbin目录下,拷贝应用程序运行时所需要的库到lib文件夹,库文件可以从pc机上的交叉编译根据安装目录下拷贝,如libc22.2.2.so、libcrypt22.2.2.so、libm22.2.2.so等。这些准备完成后键入命令:
mkfs.jffs2#2djffs2#2oroot.jffs2
生成JFFS2根文件系统。
上述工作完成后,将BootLoader、Linux内核、文件系统烧写到目标机的FLASH中,目标机就能运行Linux系统了。3 结束语
本文作者创新点:版本2.4的Linux并没有包含进对S3C2410的支持,本文详尽分析了将Linux-2.4移植到S3C2410上的主要技术,在移植过程中重点阐述的移植思路和方法对将Linux嵌入式操作系统移植到其他处理器为核心的硬件平台也有借鉴作用。参考文献:
[1] 毛德操,胡希明.Linux内核源代码情景分析[M].杭
州:浙江大学出版社,2001.
[2] 邹思轶.嵌入式Linux设计与应用[M].北京:清华大
学出版社,2002.
[3] 白伟平,包启亮.基于ARM的嵌入式BootLoader浅
在完成上述工作后,再进行如下编译,即可得到我们需要的映像文件。
(1)makeclean:该命令清除以前构造内核时生成的所有目标文件、模块和临时文件。
(2)makedep:该命令搜索Linux输出与源代码之间的依赖关系,并以此生成依赖文件。
析[J].微计算机信息,2006,22(11):992100.
[4] 吴娴.嵌入式Linux文件系统的设计与实现[J].计算
机工程与应用,2005,41(9):1112112.
(责任编辑:李 丽)
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- stra.cn 版权所有 赣ICP备2024042791号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务