基于ARM嵌入式开发的BootLoader设计与实现

时间:2022-10-25 01:08:49

基于ARM嵌入式开发的BootLoader设计与实现

摘要:该文简要介绍了嵌入式开发中引导程序的重要性。以及嵌入式开发过程中BootLoader的实现原理,并结合基于ARM体系架构S3C2410芯片中BootLoader的具体开发过程与实例对系统引导程序作出深入剖析,测试结果表明该设计具有良好的稳定性和高效性。

关键词:嵌入式开发;bootlooder;引导加载程序

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)04-0762-03

随着移动互联网的发展,嵌入式设备已经普及到社会的每个角落。嵌入式处理器种类繁多,有ARM、MIPS/PPC等多种架构。其中32位ARM嵌入式处理器具有高性能、低功耗以及价格低廉的特征,已被广泛用于消费电子品和无线网络通信设备上。目前用于嵌入式开发的操作系统多种多样,如嵌入式Linux、VxWorks、windowsCE等。其中,Linux是遵循GPL协议的开发源码的操作系统,内核可以任意剪裁以及支持硬件种类繁多。

要把嵌入式LINUX操作系统移植到嵌入式设备的裸板上,我们必须开发出类似个人pc上的BIOS来把linux操作系统读到内存中运行。这个类似于BIOS的启动程序就叫Bootloader,其目的是用于初始化硬件并且进一步加载、引导嵌入式操作系统体系运行。Bootloader功能是初始化硬件设备,完成处理器以及各种设备的初始化工作;屏蔽底层硬件差异,使得上层应用软件编写和移植更加方便;调用操作系统内核,起到引导和加载内核的作用;向内核传递必要的与硬件相关的信息。当内核启动后,Bootloader的使命也就完成,自此嵌入式设备便进入操作系统和应用程序运行阶段。

1 系统硬件结构

本系统采用基于ARM架构的S3C2410开发板为实例,具体讨论Bootloader的设计。

S3C2410芯片是ARM公司的32位ARM920T处理器核。S3C2410处理器有:独立的16KB指令Cache和16KB数据Cache,MMU,支持TFT的LCD控制器,64MB的NAND控制器,3路UART,4路DMA,I/O口,RTC,触摸屏接口,2个USB主机,1个USB设备,SD主机和MMC接口,2路SPI。S3C2410芯片可运行在200MHz以上。

2 Bootloader设计与实现

通常Bootloader的加载有两种方式:第一是通过NOR FLASH启动,其特点是速度快。CPU可以像访问内存一样直接访问NOR FLASH,但是NOR FLASH价格昂贵。第二是通过NAND FLASH启动,其特点是可读可写,NAND FLASH速度虽然慢,但是价格便宜。

一般来说Bootloader的设计编程分两个部分:第一部分通常用汇编实现,主要完成依赖于CPU体系结构的初始化,复制启动代码到SDRAM后,调用第二部分代码;第二部分通常使用C语言来实现,这样可以实现更复杂的功能,比如提供FTP文件传输等功能,最后启动内核。

2.1 Bootloader的设计过程

Bootloader具体流程见图2。

2.2 Bootloader的第一阶段

Bootloader第一阶段的功能:

相关硬件初始化;

把启动代码拷贝到内存中;

设置栈指针;

设置程序计数器PC到第二阶段代码的C入口中。

Bootloader第一阶段实现方法:

首先,通常在执行程序以前,首先为系统设置异常向量表。ARM结构的CPU从内存为0X0000000的地址开始执行,系统定义的异常,一上电程序跳转到reset异常处执行相应的汇编指令,下面定义出的都是不同的异常,比如软件发生软中断时,CPU就会去执行软中断的指令,这些异常中断在CUP中地址是从0开始,每个异常占4个字节。

然后,由于ARM体系CPU具有7种工作模式,上电以后开发板首先应该工作于管理模式。

随着Bootloader的功能不断的完善,其代码量也越来越大,所以以S3C2410为代表的裸板只有4K大小的片内内存,无法运行大于4K的Bootloader。因此,我们需要初始化SDRAM,并且重新定位Bootloader。然后设置好栈sp寄存器,为第二阶段的C函数调用做好准备。

2.3 Bootloader第二阶段

Bootloader第二阶段的功能

相关硬件设备初始化

检测系统内存映射

将内核映象和根系统映象从NANDFLASH读到内存中

设置内核启动参数

调用内核

首先,在第二阶段中首先完成一些硬件设备的初始化,如初始化串口和设置系统时钟等

然后,检测系统内存映射和一系列的设置

第二阶段也是Bootloader的最后一个阶段,其最主要的目的是把加载到SDRAM的系统内核启动。使用C语言,可以像下列实例代码来调用内核。

最后,需要注意的是,bootloader加载了内核,内核启动,加载文件系统,进入Linux系统。

3 结束语

在嵌入式系统设计中Bootloader的设计很关键。Bootloader是操作系统和硬件的枢纽相对于操作系统内核来说他是一个硬件抽象层,他负责初始化硬件,引导操作系统内核,监测各种参数给操作系统内核使用。设计和实现一个好的Bootloader将大大提高操作系统移植的稳定性并大大加快操作系统移植的周期。

本文介绍的Bootloader代码已经在基于S3C2410芯片上运行并测试通过。设计Bootloader的过程和程序不是一层不变的,它设计不仅依赖与不同的芯片结构,而且开发人员可以根据自己的需求增加一些功能的。

参考文献:

[1] 韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2013.

[2] 郑凌翔.嵌入式系统设计与应用开发[M].北京:北京航天航空大学出版社,2006.

[3] BRIAN W,DENNIS M.The C Programming Language[M].北京:机械工业出版社,2012.

上一篇:基于多领域应用的计算机软件开发实践探析 下一篇:物联网时代新媒体产业分析