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

2008-04-26 03:32赵瑞娟李敬兆
关键词:嵌入式操作系统移植

赵瑞娟 李敬兆

摘 要: 首先对嵌入式Linux操作系统内核和S3C2410处理器进行了简单介绍,在此基础上,对 系统引导程序进行了设计,重点介绍了将Linux移植到S3C2410处理器的步骤和方法,并对移 植过程的关键部分进行了详细阐述。编译生成的内核在嵌入式系统中运行稳定,结果证明方 法可行,对于开发其它嵌入式系统具有参考意义。

关键词:嵌入式操作系统;移植;Linux;S3C2410

中图分类号: TP368.1 文献标识码:A 文章编号:1672-1098(2008)03-0073-04

1 Linux内核和实验系统简介

嵌入式操作系统作为大多数嵌入式应用系统的软件平台,它管理着系统的资源,为应用 软件提供各种必要的服务。在嵌入式应用系统中使用嵌入式操作系统,已是大势所趋。目前 嵌入式操作系统的种类繁多,但Linux以其源代码开放和可移植性强等特点,被广泛使用。 本文将介绍如何将内核版本为2.4.18的Linux移植到基于ARM920T的S3C2410处理器上。

1.1 Linux操作系统内核

Linux操作系统主要由内核、shell、文件结构组成,其中内核是灵魂,负责整个系统的 内存管理、进程调度和文件管理。Linux内核与大部分UNIX内核一样是单内核体系结构的, 能够根据需要定制内核映像的尺寸,具有很大灵活性,不需要重新编译内核和引导就能检验 新的内核组件,这个特性对于嵌入式而言是非常有好处的,方便用户构筑自己的个人内核。 Linux内核有五个主要的子系统组成:进程调度、内存管理、虚拟文件系统、网络接口和进 程间通信。

本文将对内核版本为2.4.18的Linux进行移植,其内核代码分布如图1所示。

(1) /arch目录包含了目前Linux支持的硬件结构——如i386、alpha、arm等的内核代码;

(2) /drives目录包含了内核中所有的设备驱动程序;

(3) /fs目录包含了所有的文件系统的代码;

(4) /include目录包含了建立内核代码所需要的大部分库文件,这个模块利用其它模块重建 内核;

(5) /init目录包含了内核的初始化代码,内核从此处运行;

(6) /ipc目录包含了进程间通信代码;

(7) /kernel子目录包含了主内核代码;

(8) /mm目录包含所有独立于CPU体系结构的内存管理代码;

(9) /net目录包含了和网络相关的代码,如ipv4、ipv6等。

一般在每个目录下都有一个.depend文件和一个Makefile文件,这两个文件都是编译时使用 的辅助文件。

1.2 S3C2410处理器

S3C2410是SAMSUNG公司基于ARM920T处理器内核开发的一款16/32位嵌入式处理器,运行 频率高达200多MHz,具有MMU和高速缓存等丰富片上资源,可以广泛用于PDA、internet设备 和手持式设备。其片上集成的功能主要包括以下几个方面:

(1) 1.8V ARM 内核,3.3V存储器,3.3V外部I/O, 具有16kB指令缓存/16kB数据缓存和MMU 的微处理器;

(2) 外部存储控制器(SDRAM 控制和片选逻辑);

(3) LCD控制器(支持上到4k色的STN和256k色的TFT), I通道LCD专 用DMA;

(4) 具有外部请求引脚的4通道DMA;

(5) 3通道UART, 2通道SPI;

(6) 1通道IIC总线控制器,1通道US总线控制器;

(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运行。 Bootloader设计可以在ads中实现。然后,针对硬件环境和设计的 BootLoader修改Linux内 核。接下来,在Linux操作系统下建立交叉编译环境。最后,配置、编译、连接Linu x,下 载编译得到的映像文件到Flash,通过BootLoader 来启动嵌入式操作系统Linux。

2.2 Boot Loader的设计

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

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

第二阶段用C语言完成:①通用I/O口的设置;②完成内存映射初始化和内存管理单元初 始化:men璤map璤init(); mmu璤init(); 这两个函数在/arch/s3c2410/mmu.c中;③初 始化mtd设备:mtd璤dev璤init();这个函数在/drivers/mtd/maps/s3c2410璤flash.c中 ;④拷贝flash中的kernel映像和根文件系统映像到RAM空间中;⑤跳转到内核的第 一条指令 处。跳转时需要满足下列条件:R0为0;R1为机器类型ID;禁止中断(IRQ和FIQ);C PU设置 为SVC模式(SVC是供操作系统使用的一种保护模式);关闭MMU;关闭数据Cache。至此Boot Loader的任务结束。

2.3 Linux内核的修改

假定内核代码放在/usr/src/Linux-2.4.18目录下

(1) 打开根目录下的Makefile文件 此文件用来指定编译规则,例如哪些需要编译,哪些 需要先编译。

指定目标平台:Arch=arm;

指定交叉编译器:添加CROSS璤COMPILE=arm-linux-。

(2) 打开/arch/arm目录下的Makefile文件 启动代码的产生需要通过此文件,由于2.4内 核还没有对S3C2410的支持,在此添加如下代码:

ifeq((CONFIG璤ARCH璤S3C2410),y)

TEXTADDR=0xC0008000

MACHINE=s3c2410

Endif

TEXTADDR是内核的最终运行地址,该位置一般在RAM区起始地址偏移0x8000处(RAM起始地址 到偏移0x8000之间的32KB空间中存放一些全局数据结构如启动参数、内存页表等信息)。

猜你喜欢
嵌入式操作系统移植
典型实时嵌入式操作系统应用分析
基于FreeRTOS系统和LwIP协议栈的网络通讯
西方音乐元素在二胡演奏中的移植
“移植”瘦人粪便能减肥?
基于嵌入式操作系统的工业采集板设计
应用服务型人才培养体系下的嵌入式操作系统教学改革探索
计算机嵌入式操作系统研究