基于S3C44B0X的μCLinux内核移植

2011-09-26 02:03李凤勤
上海电力大学学报 2011年4期
关键词:嵌入式操作系统开发板内核

陆 静,李凤勤

(上海电力学院计算机与信息工程学院,上海 200090)

所谓嵌入式操作系统内核移植,就是使一个操作系统能够在某个微处理器平台或微控制器上运行.嵌入式操作系统是嵌入式系统的灵魂,在同一个硬件平台上可以嵌入不同的嵌入式操作系统.例如 ARM7TDMI内核,可以嵌入 Nucleus,VxWorks,μCLinux等不同的操作系统.嵌入式操作系统一般都不是为特定的处理器设计的,不能通过简单的下载方式直接将厂商提供的内核二进制文件下载到嵌入式系统的ROM中运行.因此,嵌入式操作系统的移植技术成为嵌入式开发中的一个重要问题.本文详细论述了μCLinux嵌入式操作系统移植到S3C44B0X微处理器的过程及方法,为其他类型的系统内核移植提供借鉴.

1 μCLinux操作系统及S3C44B0X处理器

1.1 μCLinux操作系统

μCLinux是Linux操作系统的衍生,由Linux的内核发展而来,是专门为没有内存管理单元MMU微处理器(如ARM7TDMI)而设计的嵌入式操作系统.μCLinux是对标准Linux进行适当裁剪和优化后,形成的高度优化、代码紧凑的嵌入式Linux.它保留了Linux的大多数优点,如稳定性、优异的网络能力,以及优秀的文件系统支持等[1].

嵌入式μCLinux操作系统主要由3个基本部分组成:引导程序,μCLinux内核,文件系统.

内核是操作系统的核心部分,它提供了对计算机设备的核心管理调用.内核所在的地址空间称作内核空间,外部管理程序与用户进程所占用的地址空间称为外部空间.通常一个程序运行会跨越两个空间,当执行到内核空间代码时,称程序处于内核态;而当程序执行到外部空间代码时,称程序处于用户态.单一内核是操作系统的主流,操作系统中所有的系统相关功能都被封装在内核中,它们与外部程序处于不同的内存地址空间中,并可以通过各种方式防止外部程序直接访问内核中的数据结构,使程序只允许系统调用的接口访问系统的内核.而在微内核中,操作系统的内核只需要提供最基本、最核心的一部分操作,如创建删除任务、内存管理、中断管理等.其他程序(如文件系统、网络协议等)尽可能地放在内核之外,可以独立地运行,并对外部用户程序提供操作系统服务,服务之间使用进程间通信机制.Linux采用的是单一内核结构,而μCLinux采用的是微内核结构,并可以通过定制使内核小型化[2,3].

标准Linux是针对有内存管理单元MMU的处理器而设计的.在这种处理器上,虚拟地址被送到MMU,由MMU将虚拟地址映像为物理地址,通过赋予每个任务不同的虚拟—物理地址转换映射,以支持不同任务之间的保护.μCLinux专门用于支持没有MMU的处理器,因此不能使用处理器的虚拟内存管理技术.μCLinux对于内存的访问是直接的,所有程序中访问的地址都是实际的物理地址,用户程序与内核处于同一个地址空间,操作系统对内存空间没有保护.因而在移植操作系统之前,需要充分考虑系统引导装载程序的大小、中断向量的大小,以及内核的大小,然后再为它们在FLASH中分配地址.

1.2 S3C44B0X 处理器

嵌入式系统的核心是嵌入式处理器.本文所用目标板是以SAMSUNG公司生产的ARM处理器芯片S3C44B0X为控制核心.

S3C44B0X是SAMSUNG公司推出的16/32位RISIC处理器,它为手持设备和一般应用提供了高性价比和高性能的微控制器解决方案.SAMSUNG S3C44B0X微处理器芯片内集成ARM7TDMI核,并在ARM7TDMI核基本功能的基础上集成了丰富的外围功能模块,便于低成本设计嵌入式应用系统.这些外围功能模块包括:8 kB Cache;内部SRAM,LCD控制器;带自动握手的2通道UART,4通道DMA;系统管理器;带PWM功能的5通道定时器;I/O端口;具有日历功能的实时时钟RTC;8通道10位ADC;IIC总线接口;IIS总线接口;同步SIO接口;PLL倍频器等.通过提供全面通用的片上外设,大大减少了系统中除处理器以外的原件配置,从而使系统成本大为降低[4].

设计中选用的开发板以S3C44B0X为控制核心,外部晶振频率为10 MHz,内核主频最高可达64 MHz,通过 RS232接口与上位机通讯,外接JTAG接口,支持在线调试.开发板采用SST39VF1601芯片(2 M字节)作为程序存储器,对应的地址空间为0x00000000-0x001fffff,采用HY57VF641620芯片(8 M字节)作为数据存储器,对应的地址空间为0x0c000000-0x0c7fffff.

2 引导装载程序

系统引导装载程序(Boot Loader)是在系统复位后执行的第一段代码,相当于PC机上的BIOS,以及商业实时操作系统中的板级支持包BSP.Boot Loader首先完成系统硬件的初始化,包括时钟的设置、存储区的映射,以及堆栈指针的设置等,然后跳转到操作系统内核入口,将系统控制权交给操作系统.此后系统的运行与Boot Loader再无任何关系[5].

在将Boot Loader程序烧入嵌入式开发板之前,通常都要被编译成二进制文件(后缀名为.bin),这样不仅能减少占用空间,还可以减少CPU的运算量.系统加电或复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址上取指令.例如,基于ARM7TDMI核的CPU在复位时通常都从地址0x00000000取其第一条指令,而基于CPU构建的嵌入式系统通常都有某种类型的固态存储设备(ROM或FLASH等)被映射到这个预先安排的地址上.因此在系统加电后,CPU将首先执行Boot Loader程序.

本设计中,将Boot Loader安放在FLASH中的0x1f000000地址,将中断向量放在0x00000000的位置.Boot Loader完成系统初始化工作后,将内核的映像文件由Flash拷贝到SDRAM中,再从SDRAM中执行μCLinux内核的引导程序,加载μCLinux内核.将内核的映射文档从FLASH中的0x10000000地址处加载到 SDRAM 中的0xC0000000的地址处运行.引导程序操作模式如图1所示.

图1 引导程序操作模式

3 μCLinux移植方法

3.1 移植思路

硬件环境确定以后,首先给μCLinux设计一个Boot Loader,通过Boot Loader来初始化硬件,引导μCLinux运行.然后针对硬件环境和设计的Boot Loader修改μClinux内核,并在Linux操作系统下建立编译μCLinux的交叉编译环境.最后配置、编译、连接μCLinux,将下载编译得到的映像文件存入Flash,并通过Boot Loader来启动μCLinux.

3.2 移植所需开发环境

一套包含编译功能的集成开发环境IDE是嵌入式系统开发必不可少的,ADS IDE开发环境是常用的ARM编译开发环境,是ARM公司推出的针对ARM芯片的编程开发界面,使用了Code Warrior公司的编译器,它几乎支持Windows的各种操作系统.编译完成后,可使用ARM扩展调试器(ARM eXtended Debugger,AXD)进行调试.其中,AXD是ADS中独立于Code Warrior的图形软件.另外,嵌入式系统开发时需要一个交叉开发环境.交叉开发是指在一台通用计算机上进行软件编辑编译,然后下载到嵌入式设备中运行调试的开发方式.移植前首先要准备好建立交叉开发环境的软/硬件资源.

设计中,选择交叉编译工具 arm-elf-tools-20030314.sh.在 Linux环境,root用户的 shell下执行./arm-elf-tools-20030314.sh,即可建立起完整的交叉编译环境.最后需添加交叉编译器的路径,在root用户的shell下执行export=$PATH:/usr/local/arm-elf/bin.

3.3 编 译

编译过程中,首先要完成对Boot Loader的编译.主要设置参数为:把 Post-linker设置成ARMFromelf;RO为0xc7c0000(从0xc7c0000地址开始为只读数据);RW为空;Object/Symbol为vector.o;section为Selfboot;设置输出文件格式和保存路径.

然后安装 μCLinux源代码并编译.将压缩μCLinux操作系统源代码文件 μClinux-dist-20040408.tar.gz拷贝到 PC机上 linux操作系统的/usr/src目录下,用 tarjxvfμClinux-dist-20040408.tar.gz命令解压缩源代码文件,产生/usr/src目录下的/μClinux-dist子目录,此目录中含有编译μCLinux操作系统的全部源文件.同时,根据开发板上的硬件配置,对μCLinux内核源代码中与硬件紧密相关的部分作出适当的修改.

考虑到S3C4510B和S3C44B0X都属于SAMSUNG公司生产的ARM7TDMI核的芯片,在很多硬件结构上都很类似.因而对照S3C4510B进行S3C44B0X的移植工作,下载针对S3C4510B的内核补丁程序后,对其作出相应的内核修改,并修正源代码中的硬件参数设置,具体可以从修改压缩内核运行地址、处理器配置选项及内核起始地址开始.修改内核起始地址的代码如下:

#arch/armnommu/Makefile

#S3C44B0X

ifeq($(CONFIG_BOARD_SNDS100),y)

TEXTADDR=0x0c000000//内核的起始地址

MACHINE=S3C44B0X

INCDIR=$(MACHINE)

CORE_FILES:=$(CORE_FILES)#romfs.o

endif

3.4 下载和执行

配置超级终端波特率为57 600 Baud,无奇偶校验,1位停止,无数据流控制.将一级中断矢量文件boot.s从Boot Loader中分离出来,单独进行编译,生成二进制文件boot.bin后烧入到FLASH的起始地址0x00000000,而 Boot Loader仍放在FLASH的0x1f000000处.开发板在重新上电后复位,终端就出现了Boot Loader的启动信息,如图2所示.

图2 Boot Loader启动信息

在交叉编译环境中完成μCLinux的编译后,会产生一个二进制的内核文件image.bin,将其下载到SDRAM中的0xc0080000地址位置,并烧入FLASH中的0x10000000地址处,如图3所示.

图3 二进制内核文件烧入FLASH

由于FLASH的内存容量只有2 MB,所以内核的解压运行不能在FLASH中直接进行,而需将其移入SDRAM中0xc0000000地址处(SDRAM的容量是8 MB),让其在SDRAM起始位置处解压运行μCLinux内核文件.将μCLinux映像文件烧入S3C44B0X开发板后,内核文件解压、启动过程如图4所示.

图4 内核文件解压和启动过程

4 结语

对于嵌入式系统开发人员来说,经常需要根据不同的硬件平台移植嵌入式操作系统,因而掌握移植方法非常重要.本文成功实现了将μCLinux嵌入式操作系统内核移植到ARM处理器芯片S3C44B0X中,该方法对μCLinux或μC/OS-II嵌入式操作系统移植到其他处理器为核心的硬件平台具有很好的借鉴作用.

[1]周立功.ARM嵌入式系统实验教程[M].北京:北京航空航天大学出版社,2005:279-290.

[2]马忠敏,李善平,康慨,等.ARM&Linux嵌入式系统教程[M].北京:北京航空航天大学出版社,2004:10-30.

[3]任哲.嵌入式实时操作系统原理及应用[M].北京:北京航空航天大学出版社,2005:50-70.

[4]田泽.嵌入式系统开发与应用教程[M].北京:北京航空航天大学出版社,2005:290-294.

[5]李全利,张小丽.基于ARM的嵌入式 μCLinux系统开发[J].长春理工大学学报:自然科学版,2009,32(2):264-267.

猜你喜欢
嵌入式操作系统开发板内核
强化『高新』内核 打造农业『硅谷』
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
计算机嵌入式操作系统分析
Microchip最新推出两款PIC32 Curiosity开发板
浅析单片机开发板的设计与制作
微生物内核 生态型农资
关于高校嵌入式操作系统课程教学的探索与思考
基于嵌入式操作系统的工业采集板设计
应用服务型人才培养体系下的嵌入式操作系统教学改革探索