μCLinux操作系统的移植及Bootloader程序设计

2010-07-17 07:37刘彦兰
山西电子技术 2010年3期
关键词:源码源代码体系结构

刘彦兰

(国营第七八五厂,山西太原030024)

0 引言

μCLinux在无MMU的嵌入式系统中具有较好的技术优势,而ARM7TDMI又是一种高效,低功耗的RISC处理器。本文构造了一个μCLinux嵌入式操作系统,将它嵌入到基于ARM7TDMI内核的系统中。

1 嵌入式系统硬件平台

1.1 TMS320VC5471评估板简介

TI公司提供的嵌入式芯片TMS320VC5471集成了基于TMS320C54X体系结构的DSP子系统和基于ARM7TDMI核的RISC微控制器子系统的双CPU定点数字信号处理器。TMS320VC5471的功能框图如图1所示:

图1 TMS320VC5471的功能框图

2 μClinux操作系统的移植

μCLinux的移植过程,大致需要分成四个步骤:

(1)建立交叉编译环境;

(2)裁减、编译内核;

(3)装载内核;

(4)内核启动。

2.1 交叉编译环境的建立

在μCLinux的移植中,ARM体系结构的交叉编译环境,分为主机和目标机两方面。在本设计中,主机安装的是RedHat linux7.3操作系统,并在其上建立GCC的ARM体系结构的交叉编译环境。

2.2 操作系统的移植

2.2.1 获得μCLinux源代码开发包

本课题采用的版本为Kernel-2.4.18。可以从互联网上下载得到μCLinux-2.4.18、μClibc和elf2flt源码及应用程序源码包。文件为:μCLinux-dist-20040218.tar.gz,把它保存到/home目录下,然后执行:tar zxvf μCLinux-dist-20040218.tar.gz。当tar程序运行完毕后,在/home目录下会有一个/home/μCLinux-dist的新目录,这就是 μCLinux的源码根目录,里面有进行μCLinux开发的所有的源代码。

2.2.2 Clinux内核的修改、配置和编译

由于本设计是将μClinux移植到VC5471平台上,所以需要根据 VC5471下面的 ARM7TDMI架构,重新修改μCLinux内核。修改μCLinux内核有三方面的工作:一个是函数库的问题;二是重写Makefile以适应目标板;三是修改μCLinux/Linux/arch/armnommu/目录下的文件,以使它适应ARM7TDMI架构。

μClinux内核的配置系统由三部分组成,分别是:

(1)Makefile:分布在μClinux内核源代码中的Makefile,定义了μClinux内核编译规则;

(2)配置文件(config.in):给用户提供配置内核的选择功能;

(3)配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于图形界面以及基于Xwindows图形界面的用户配置界面,各自对应于 Make config、Make menuconfig和 Make xconfig)。

make xconfig根据课题的需要配置内核编译选项

—Choose a Vendor/Product combination.

(TI/5471)Vendor/Product

(linux-2.4.x)Kernel Version

(μClibc)Libc Version

[Exit]

Do you wish to save your new kernel configuration?

[Yes]

.make dep建立依赖关系

.make lib_only编译库文件

make user_only编译用户应用程序文件

make romfs生成romfs文件系统

make编译内核

若成功,在μClinux-dist下有一个images目录,下面有四个文件:

(1).image.elf:ELF格式含调试信息和 romfs的μCLinux,可以用gdb装载调试运行

(2).romfs.img:romfs的二进制文件

(3).linux.bin:不含romfs的μCLinux二进制文件

(4).image.bin:linux.bin和romfs.bin合并而成,并多了4个字节的校验,这个文件的内容拷贝到ram里后就可以直接从入口运行了。

2.3 Bootloader的设计与实现

将μCLinux内核加载到内存上运行的方式,需要编写一段启动代码Bootloader。

(1)Bootloader的操作模式

多数Bootloader都包含两种操作模式:“启动加载”模式和“下载”模式。Bootloader从固态存储设备上将操作系统加载进RAM中运行,整个过程并没有用户的介入。这种模式是Bootloader的正常工作模式。下载模式下,Bootloader将通过串口或网络等通信手段从主机下载文件,此模式通常在首次安装内核与根文件系统或以后的系统更新时使用。工作于这种模式下的Bootloader需要向终端用户提供一个简单的命令行接口。

(2)Bootloader的基本任务

Bootloader一般是被烧录或者下载到bootrom的0x0地址处,作为上电后执行的第一部分指令,Bootloader需要完成以下几个任务:<1>硬件初始化;<2>存储器重映射;<3>下载内核映像和根文件系统或把内核装载到SRAM里;<4>调用内核。

(3)Bootloader的实现

(a)硬件设备初始化:该部分代码用ARM汇编实现

Ⅰ进入SVC32工作模式,并且禁止所有的中断。可以通过写CPU的中断屏蔽寄存器或状态寄存器(ARM的CPSR寄存器)来完成。

mov r0,#(ARM_MODE_SVC|I_BIT|F_BIT)

msr cpsr,r0

Ⅱ设置CPU的速度和时钟频率。

Ⅲ网口初始化,为内核的下载准备条件。

ⅣLCD和键盘初始化,为人机交互准备条件

Ⅴ RAM初始化,为Bootloader的C代码运行准备空间。

(b)拷贝Bootloader的C代码到RAM空间中。

拷贝时要确定两点:① C代码的可执行映象在固态存储设备的存放起始地址和终止地址;② RAM空间的起始地址。以上可以通过链接文件来确定。

(c)设置堆栈指针sp

ldr sp,=__stack(__stack的值可以通过链接文件确定)

(d)地址重映射(Remap)

具体的实现代码如下:

ramlow()

{

(*(long*)0xffff2804)&=0xfffffffc;

(*(long*)0xffff2800)&=0xfffffffc;

}

(e)跳转到C代码的入口点开始执行。由于VC5471评估板没有固化BOOT程序,所以使用CCS软件通过JTAG接口,先将Bootloader程序下载到RAM中,然后写到Flash的起始地址,上电后从Flash中开始执行Bootloader。到此Bootloader的任务就完成了。

3 结束语

本文以DSP+ARM结构的嵌入式处理器TMS320VC5471评估板(EVM)作为目标板,搭建了基于GDB的嵌入式操作系统集成开发调试环境并实现了μCLinux操作系统的移植。对同类型的嵌入式操作系统的移植工作具有一定的参考价值。

[1]TI,TMS320VC547x CPU and Peripherals Reference Guide[M].2001.

[2]TMS320VC5471 Fixed-PointDigital Signal Processor Data Manual[M].2001.

[3]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.10.

[4]赵炯.Linux内核完全注释[内核版本0.11(0.95)]修正版V1.9.5[M].北京:机械工业出版社,2004.5.

猜你喜欢
源码源代码体系结构
面向数据可靠传输的高译码率带反馈的LT码
基于TXL的源代码插桩技术研究
浅谈开源操作系统的历史
企业如何保护源码
软件源代码非公知性司法鉴定方法探析
基于语法和语义结合的源代码精确搜索方法
基于粒计算的武器装备体系结构超网络模型
作战体系结构稳定性突变分析
揭秘龙湖产品“源代码”
基于DODAF的装备体系结构设计