分类: LINUX
2010-05-24 18:47:08
Bootloader一词在嵌入式系统中应用广泛,中文意思可以解释为“启动加载器”。顾名思义,Bootloader是一个在系统启动时工作的软件。由于启动时候涉及硬件和软件的启动,所以Bootloader是一个涉及硬件和软件衔接的重要系统软件。本章从Bootloader的原理出发,分析Bootloader的基本功能,同时介绍了常见的Bootloader系统软件,并且给出了U-Boot这款Bootloader在mini2440开发板的移植过程。本章的主要内容如下:
● Bootloader的基本知识和工作原理;
● 常见的几种Bootloader介绍和对比;
● U-Boot的工程结构和工作流程;
● 移植U-Boot到mini2440开发板。
对于没有接触过嵌入式系统的人来说,Bootloader的功能虽然可以理解,但是缺乏一个直观的认识。本节以大家熟知的PC为例,介绍PC的启动工作流程,然后引入嵌入式Bootloader的概念,给读者一个感性的认识,帮助初学者揭开嵌入式系统Bootloader的 面纱。
不少初学者都会对标题有或多或少的疑惑,觉得PC从哪里来的Bootloader。很少有人会说PC有Bootloader。实际上PC的BIOS(主板上固化的一段程序,常说的“基本输入输出系统”)和硬盘或其他磁盘设备的引导记录在扮演着和嵌入式系统中Bootloader类似的作用,读者可以把这两部分的系统程序理解为PC的Bootloader。
Bootloader是系统加电后运行的第一段程序,一般来说,Bootloader为了保证整个系统的启动速度,要在很短的时间内运行。PC的Bootloader由BIOS和MBR组成。其中,BIOS固化在PC主板的一块内存内;MBR是PC内硬盘主引导扇区(Master Boot Recorder)的缩写。
PC上电后,首先执行BIOS的启动程序。然后根据用户配置,由BIOS加载硬盘MBR的启动数据。BIOS把硬盘MBR的数据读取到内存,然后把系统的控制权交给保存在MBR的操作系统加载程序(OS Loader)。操作系统加载程序继续工作,直到加载操作系统内核,再把控制权交给操作系统内核。
PC的体系结构相对固定,多数厂商采用相同的架构,甚至外部设备的连接方式都完全相同。并且,PC有统一的设计规范,操作系统和开发人员不用为系统启动发愁,启动的工作都是由BIOS来完成的。不仅如此,PC的BIOS还为操作系统提供了访问底层硬件的中断调用。
嵌入式系统就没有这么幸运了,在绝大多数的嵌入式系统上是没有类似PC的BIOS的系统程序的。由于嵌入式系统需求复杂多变,需要根据用户需求来设计硬件系统甚至软件系统,很难有一个统一的标准。嵌入式系统每个系统的启动代码都是不完全相同的,这就增加了开发设计的工作。
嵌入式系统虽然硬件差异大,但是仍然有相同的规律可循。在同一体系结构上,外部设备的连接方式、工作方式可能不同,但是CPU的指令、编程模型是相同的。由于和PC系统的差异,在嵌入式系统中,需要开发人员自己设计Bootloader。所幸的是,开发人员不用从零开始为每个系统编写代码,一些开源软件组织以及其他公司已经设计出了适合多种系统的Bootloader。这些Bootloader软件实际上是为嵌入式系统设计的一个相对通用的框架。开发人员只需要根据需求,按照不同体系结构的编程模型,以及硬件连接结构,设计与硬件相关的代码,省去了从头开发的繁琐流程。
Bootloader是嵌入式软件开发的第一个环节,它把嵌入式系统的软件和硬件紧密衔接在一起,对于一个嵌入式设备的后续开发至关重要。Bootloader初始化目标硬件,给嵌入式操作系统提供硬件资源信息,并且装载嵌入式操作系统。在嵌入式开发过程中Bootloader往往是难点,开源的Bootloader在设计思想上往往有一些相同之处。本节将介绍两款常见的Bootloader供读者参考。
U-Boot是一个规模庞大的开源Bootloader软件,最初是由denx()发起。U-Boot的前身是PPCBoot,目前是SourceForge()的一个项目。
最初的U-Boot仅支持PowerPC架构的系统,称做PPCBoot。从0.3.2官方版本之后开始逐步支持多种架构的处理器,目前可以支持PowerPC(MPC5xx、MPC8xx、MPC82xx、MPC7xx、MPC74xx)、ARM(ARM7、ARM9、StrongARM、Xscale)、MIPS(4kc、5kc)、X86等处理器,支持的嵌入式操作系统有Linux、Vx-Works、NetBSD、QNX、RTEMS、ARTOS、LynxOS等,是PowerPC、ARM9、Xscale、X86等系统通用的Boot方案。
U-Boot支持的处理器和操作系统很多,但是它对PowerPC系列处理器和Linux操作系统支持最好。U-Boot支持的功能也较多,对于嵌入式开发常用的查看、修改内存,从网络下载操作系统镜像等功能都提供了很好的支持。U-Boot的项目更新较快,支持的目标板众多,是学习底层开发很好的示例。
ViVi是韩国的mizi公司专门针对ARM9处理器设计的一款Bootloader。它的特点是操作简便,同时提供了完备的命令体系,目前在三星系列的ARM9处理器上ViVi也比较流行。
与U-Boot相比,由于ViVi支持的处理器单一,ViVi的代码也要小很多。同时,ViVi的软件架构和配置方法采用和Linux内核类似的风格,对于有过配置编译Linux内核经验的读者,ViVi更容易上手。
与其他的Bootloader一样,ViVi有两种工作模式:启动加载模式和下载模式。使用启动加载模式,在目标板上电后,ViVi会从预先配置好的Flash分区读取Linux或者其他系统的镜像并且启动系统;使用下载模式,ViVi向用户提供了一个命令行接口,通过该接口用户可以使用ViVi提供的命令。ViVi主要提供了5个命令如下:
● Load:把二进制文件载入Flash或RAM。
● Part:操作MTD分区信息。显示、增加、删除、复位、保存MTD分区。
● Param:设置参数。
● Boot:启动系统。
● Flash:管理Flash,如删除Flash的数据。
与Linux内核的组织类似,ViVi的源代码主要包括arch、init、lib、drivers和include等几个目录,共200多个代码文件。各目录的具体功能请参考ViVi相关的信息。