赵瑞娟 李敬兆
摘 要: 首先对嵌入式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空间中存放一些全局数据结构如启动参数、内存页表等信息)。