您好,欢迎来到星星旅游。
搜索
您的当前位置:首页嵌入式Linux系统在S3C2410上的移植实现

嵌入式Linux系统在S3C2410上的移植实现

来源:星星旅游
第28卷 第3期2008年9月

安徽理工大学学报(自然科学版)

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个通用I󰃗O口,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处理器内核开发的一款16󰃗32位嵌入式处理器,运

引导加载程序通常称为BootLoader,就是在

操作系统内核运行之前运行的一段小程序。通过这段小程序,初始化硬件设备、建立内存空间的映射图,从而建立适当的系统软硬件环境,为调用操作系统内核做好准备。

本系统BootLoader的第一阶段主要完成基本的硬件初始化,用汇编语言实现:①关闭watch2dog,屏蔽所有中断;②设置处理器时钟和工作频率,CPU工作频率为200MHz;③初始化外部寄存器;④初始化堆栈指针SP;⑤拷贝BootLoader的第二阶段到RAM空间中,使用一个跳转语句跳转到第二阶段的main入口函数。在完成以上操作后就为main函数的运行建立起了一个基本的环境。

第二阶段用C语言完成:①通用I󰃗O口的设置;②完成内存映射初始化和内存管理单元初始化:men_map_init();mmu_init();这两个函数在󰃗arch󰃗s3c2410󰃗mmu.c中;③初始化mtd设备:mtd_dev_init();这个函数在󰃗drivers󰃗mtd󰃗maps󰃗

行频率高达200多MHz,具有MMU和高速缓存等

丰富片上资源,可以广泛用于PDA、internet设备和手持式设备。其片上集成的功能主要包括以下几个方面:

(1)1.8VARM内核,3.3V存储器,3.3V外部I󰃗16kB数据缓存和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‘Archimedes󰃗A5000Implementa2tions’

Dep_bool‘SMDK(MERITECHBOARD)’

󰃗CONFIG_S3C2410_SMDK󰃗$CONFIG_ARCH_S3C2410󰃗󰃗其他fi

假定内核代码放在󰃗usr󰃗src󰃗Linux22.4.18目录下

(1)打开根目录下的Makefile文件此文件用

来指定编译规则,例如哪些需要编译,哪些需要先

编译。

指定目标平台:Arch=arm;指定交叉编译器:添加CROSS_COMPILE=

。arm2linux2

(2)打开󰃗arch󰃗arm目录下的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)打开󰃗arch󰃗arm󰃗boot󰃗compressed󰃗head2s3c2410.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)打开󰃗arch󰃗arm󰃗boot目录下的Makefile文件ZTEXTADDR是解压前image.rom的位置,ZRELADDR是内核解压并最终执行的位置。ZRELADDR与TEXTADDR之间符合如下映射关系:_virt_to_phys(TEXTADDR)==ZRE2LADDR.

ifeq((CONFIG_ARCH_s3c2410),y)ZTEXTADDR=0XC0008000ZRELADDR=0X30008000

endif

(4)打开󰃗arch󰃗arm󰃗boot󰃗compressed目录下($(CONFIG_ARCH_的Makefile文件,添加ifeq“S3C2410),y)

OBJS+=head-s3c2410.o

endif

(5)打开󰃗arch󰃗arm󰃗config.in此文件是配置

……

#endif

mov r0,#0x00200000l:

subs r0,r0,#1bne 1b

依次将$(CONFIG_ARCH_2410)加入

76

      安徽理工大学学报(自然科学版)            第28卷

(3)makemenuconfig:该命令是用来调用菜

(7)打开󰃗arch󰃗arm󰃗kernel󰃗Makefileno2irq2arch:=$(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)打开󰃗arch󰃗arm󰃗kernel󰃗entry2armv.s此文件主要定义CPU初始化时中断处理部分,可参考处理器使用手册,按处理器使用要求配置。

(9)打开󰃗arch󰃗arm󰃗kernel󰃗debug2armv.s此文件用于最基本的串口调试功能,包括调试串口的地址初始化、发送、等待、忙状态定义等。使用此文件可以在启动过程中打印出相关信息。

(10)打开󰃗arch󰃗arm󰃗kernel󰃗setup.c此文件中要根据使用的板子设置几个变量。nr_banks指定了内存块的数量,bank指定了每块内存块的范围,PAGE_OFFSET是内存起始地址,MEM_SIZE是内存的大小,PAGE_OFFSET和MEM_SIZE要在󰃗include󰃗asm2arm󰃗arch2s3c2410中定义。(11)打开󰃗arch󰃗arm󰃗mm󰃗mm2armv.c此文件用于与硬件相关的内存管理,如初始化内存页表内存映射等。将init_maps->bufferable=0;改为init_maps->bufferable=1。

(12)打开󰃗arch󰃗arm󰃗mach2s3c2410建立相应目录并按照处理器使用要求编写irq.c、mm.c、time.c、arch.c、Makefile,分别实现中断控制器的初始化,地址的虚实映射关系,时钟中断和实时时钟处理以及有关Ramdisk使用参数等的设置。

(13)打开󰃗include󰃗asm2arm󰃗arch2s3c2410此目录下定义用到的头文件。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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务