没有合适的资源?快使用搜索试试~ 我知道了~
首页bootloader程序的比较与分析
bootloader程序的比较与分析

BootLoader简介,常见bootloader介绍,自己编写bootloader的方法和步骤,bootloader示例超详细分析。看完后会对bootloader有更深层次的认识,可以促进更深入的学习。
资源详情
资源评论
资源推荐

FreshAir 团队成果文档(版权所有)
一. BootLoader 简介
在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。一个嵌入式 Linux 系统从软件的角度看通常
可以分为四个层次:
1、 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 BootLoader 两大部分。
2、 Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。
3、 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ramdisk 来作为 rootfs。
4、 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形
用户界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 懂。
引导加载程序是系统加电后运行的第一段软件代码。PC 机中的引导加载程序由 BIOS(其本质就是一段固件程
序)和位于硬盘 MBR 中的 OS BootLoader(比如,LILO 和 GRUB 等)一起组成。BIOS 在完成硬件检测和资源分配
后,将硬盘 MBR 中的 BootLoader 读到系统的 RAM 中,然后将控制权交给 OS BootLoader。BootLoader 的主要运行
任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU 也会内嵌一段短小的启动程
序),因此整个系统的加载启动任务就完全由 BootLoader 来完成。比如在一个基于 ARM7TDMI core 的嵌入式系统
中, 系统 在上 电或 复位 时通 常都 从地 址 0x00000000 处开 始执 行, 而在 这个 地址 处安 排的 通常 就是 系统 的
BootLoader 程序。
简单地说,BootLoader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬
件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准
备好正确的环境。
通常,BootLoader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用
的 BootLoader 几乎是不可能的。尽管如此,我们仍然可以对 BootLoader 归纳出一些通用的概念来,以指导用户特
定的 BootLoader 设计与实现。
二、常见 bootloader 介绍
1.U-BOOT 介绍 :
uboot 是一个庞大的公开源码的软件。他支持一些系列的 arm 体系,包含常见的外设的驱动,是一个功能强大的板
极支持包。U-Boot 是由开源项目 PPCBoot 发展起来的,ARMboot 并入了 PPCBoot,和其他一些 arch 的 Loader 合称
U-Boot。2002 年 12 月 17 日第一个版本 U-Boot-0.2.0 发布,同时 PPCBoot 和 ARMboot 停止维护。
U-Boot 自发布以后已更新 6 次,最新版本为 U-Boot-1.1.1,U-Boot 的支持是持续性的。其发布网址为:
http://sourceforge.net/projects/u-boot/
U-Boot 支持的处理器构架包括 PowerPC (MPC5xx ,MPC8xx,MPC82xx,MPC7xx ,MPC74xx ,4xx) , ARM
(ARM7,ARM9,StrongARM,Xscale), MIPS (4Kc,5Kc),x86 等等, U-Boot(Universal Bootloader)从名字
就可以看出,它是在 GPL 下资源代码最完整的一个通用 Boot Loader。
U-Boot 提供两种操作模式:启动加载(Boot loading)模式和下载(Downloading)模式,并具有大型 Boot Loader 的
全部功能。主要特性为:
- SCC/FEC 以太网支持
- BOOTP/TFTP 引导
- IP,MAC 预置功能
- 在线读写 FLASH,DOC, IDE,IIC,EEROM,RTC
- 支持串行口 kermit,S-record 下载代码
- 识别二进制、ELF32、pImage 格式的 Image,对 Linux 引导有特别的支持
- 监控(minitor)命令集:读写 I/O,内存,寄存器、内存、外设测试功能等
- 脚本语言支持(类似 BASH 脚本)
- 支持 WatchDog,LCD logo,状态指示功能等
U-Boot 的功能是如此之强大,涵盖了绝大部分处理器构架,提供大量外设驱动,支持多个文件系统,附带调试、
脚本、引导等工具,特别支持 Linux,为板级移植做了大量的工作。U-Boot1.1.1 版本特别包含了对 SA1100 和 44B0
芯片的移植,所以 44B0 移植主要是针对 Board 的移植,包括 FLASH、内存配置以及串口波特率等等。U-Boot 的
完整功能性和后续不断的支持,使系统的升级维护变得十分方便。
FreshAir 团队格言:打造 FreshAir 团队精神;相信只要努力就有机会;今天的努力是为了实现明天的梦想

FreshAir 团队成果文档(版权所有)
同时,u-boot 移植的过程也是一个对嵌入式系统包括软硬件以及操作系统加深理解的一个过程。
2。vivi 介绍(下载地址 http://www.mizi.com/developer):
vivi 是韩国 mizi 公司开发的 bootloader, 适用于 ARM9 处理器。 Vivi 有两种工作模式:启动加载模式和下载模
式。启动加载模式可以在一段时间后(这个时间可更改)自行启动 linux 内核,这时 vivi 的默认模式。在下载模式
下,vivi 为用户提供一个命令行接口,通过接口可以使用 vivi 提供的一些命令,如下:
命令: Load 功能: 把二进制文件载入 Flash 或 RAM
Part 操作 MTD 分区信息。显示、增加、删除、复位、保存 MTD 分区
Param 设置参数
Boot 启动系统
Flash 管理 Flash,如删除 Flash 的数据
vivi 代码分析
vivi 的代码包括 arch,init,lib,drivers 和 include 等几个目录,共 200 多条文件。
Vivi 主要包括下面几个目录:
arch:此目录包括了所有 vivi 支持的目标板的子目录,例如 s3c2410 目录。
drivers:其中包括了引导内核需要的设备的驱动程序(MTD 和串口)。MTD 目录下分 map、nand 和 nor
三个目录。
init:这个目录只有 main.c 和 version.c 两个文件。和普通的 C 程序一样,vivi 将从 main 函数开始执行。
lib:一些平台公共的接口代码,比如 time.c 里的 udelay()和 mdelay()。
include:头文件的公共目录,其中的 s3c2410.h 定义了这块处理器的一些寄存器。Platform/smdk2410.h 定义了与开
发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内
存映射等。
3.Redboot 介绍:
Redboot 是 Redhat 公司随 eCos 发布的一个 BOOT 方案,是一个开源项目。
当 前 Redboot 的 最 新 版 本 是 Redboot-2.0.1 , Redhat 公 司 将 会继 续 支 持该 项 目 ,其 官 方 发布 网 址 为: http://
sources.redhat.com/redboot/
Redboot 支持的处理器构架有 ARM,MIPS,MN10300,PowerPC, Renesas SHx,v850,x86 等,是一个完善的嵌
入式系统 Boot Loader。
Redboot 是在 ECOS 的基础上剥离出来的,继承了 ECOS 的简洁、轻巧、可灵活配置、稳定可靠等品质优点。它可
以使用 X-modem 或 Y-modem 协议经由串口下载,也可以经由以太网口通过 BOOTP/DHCP 服务获得 IP 参数,使用
TFTP 方式下载程序映像文件,常用于调试支持和系统初始化(Flash 下载更新和网络启动)。Redboot 可以通过串
口和以太网口与 GDB 进行通信,调试应用程序,甚至能中断被 GDB 运行的应用程序。Redboot 为管理 FLASH 映
像,映像下载,Redboot 配置以及其他如串口、以太网口提供了一个交互式命令行接口,自动启动后,REDBOOT
用来从 TFTP 服务器或者从 Flash 下载映像文件加载系统的引导脚本文件保存在 Flash 上。当前支持单板机的移植版
特性有:
- 支持 ECOS,Linux 操作系统引导
- 在线读写 Flash
- 支持串行口 kermit,S-record 下载代码
- 监控(minitor)命令集:读写 I/O,内存,寄存器、 内存、外设测试功能等
Redboot 是标准的嵌入式调试和引导解决方案,支持几乎所有的处理器构架以及大量的外围硬件接口,并且还在不
断地完善过程中。
4.ARMboot:
ARMboot 是一个 ARM 平台的开源固件项目,它特别基于 PPCBoot,一个为 PowerPC 平台上的系统提供类似功能
的姊妹项目。鉴于对 PPCBoot 的严重依赖性,已经与 PPCBoot 项目合并,新的项目为 U-Boot。
ARMboot 发布的最后版本为 ARMboot-1.1.0,2002 年 ARMboot 终止了维护,其发布网址为:http://sourceforge.net/
projects/armboot
ARMboot 支持的处理器构架有 StrongARM ,ARM720T ,PXA250 等,是为基于 ARM 或者 StrongARM CPU 的嵌
入式系统所设计的。
ARMboot 的目标是成为通用的、容易使用和移植的引导程序,非常轻便地运用于新的平台上。ARMboot 是 GPL 下
的 ARM 固件项目中唯一支持 Flash 闪存,BOOTP、DHCP、TFTP 网络下载,PCMCLA 寻线机等多种类型来引导
FreshAir 团队格言:打造 FreshAir 团队精神;相信只要努力就有机会;今天的努力是为了实现明天的梦想

FreshAir 团队成果文档(版权所有)
系统的。特性为:
- 支持多种类型的 FLASH
- 允许映像文件经由 BOOTP、DHCP、TFTP 从网络传输;
- 支持串行口下载 S-record 或者 binary 文件
- 允许内存的显示及修改
- 支持 jffs2 文件系统等
Armboot 对 S3C44B0 板的移植相对简单,在经过删减完整代码中的一部分后,仅仅需要完成初始化、串口收发数
据、启动计数器和 FLASH 操作等步骤,就可以下载引导 uClinux 内核完成板上系统的加载。总得来说,ARMboot
介于大、小型 Boot Loader 之间,相对轻便,基本功能完备,缺点是缺乏后续支持。
4.Blob:
Blob(Boot Loader Object)是由 Jan-Derk Bakker and Erik Mouw 发布的,是专门为 StrongARM 构架下的 LART 设计的
Boot Loader。
Blob 的最后版本是 blob-2.0.5,其发布网址为:http://www.lart.tudelft.nl/lartware/blob/
Blob 支持 SA1100 的 LART 主板,但用户也可以自行修改移植。
Blob 也提供两种工作模式,在启动时处于正常的启动加载模式,但是它会延时 10 秒等待终端用户按下任意键而将
Blob 切换到下载模式。如果在 10 秒内没有用户按键,则 Blob 继续启动 Linux 内核。其基本功能为:
初始化硬件(CPU 速度,存储器,中断,RS232 串口)
- 引导 Linux 内核并提供 ramdisk
- 给 LART 下载一个内核或者 ramdisk
- 给 FLASH 片更新内核或者 ramdisk
- 测定存储配置并通知内核
- 给内核提供一个命令行
Blob 功能比较齐全,代码较少,比较适合做修改移植,用来引导 Liunx,目前大部分 S3C44B0 板都用 Blob 修改移
植后来加载 uClinux。
5.Bios-lt:
Bios-lt 是专门支持三星(Samsung)公司 ARM 构架处理器 S3C4510B 的 Loader,可以设置 CPU/ROM/SDRAM/
EXTIO,管理并烧写 FLASH,装载引导 uClinux 内核。这是国内工程师申请 GNU 通用公共许可发布的。
Bios-lt 的 最 新 版 本 是 Bios-lt-0.74 , 另 外 还 提 供 了 S3C4510B 的 一 些 外 围 驱 动 , 其 发 布 网 址 为 : http://
sourceforge.net/projects/bios-lt
6.Bootldr:
Bootldr 是康柏(Compaq)公司发布的,类似于 compaq iPAQ Pocket PC,支持 SA1100 芯片。它被推荐用来引导
Llinux,支持串口 Y-modem 协议以及 jffs 文件系统。
Bootldr 的最后版本为 Bootldr-2.19,其发布网址为: http://www.wearablegroup.org/software/bootldr/
7.基于 wce 的 eboot:
在 WinCE 中用的最多的就是 EBOOT,是一个基于网络的 Bootloader,而且可以根据需要带有命令行菜单功能,
网络调试功能以及文件系统的相关功能。在这里只谈 ARM 平台的引导,因为 ARM 架构的 CPU 用的最普遍。一般
基于不同的硬件设计,会有不同的引导方式:
NORFlash Boot:
一般 ARM 处理器的片选 0 都会接有 NORFlash,这样在 ARM 上电以后,会从 0 地址开始执行程序,也就是从
NORFlash 的 0 地址开始执行。所以把 EBOOT 烧到 NORFlash 的 0 地址开始的地方,这样在上电以后,EBOOT 开
始执行,可以在 NORFlash 里面执行,也可以自拷贝到 SDRAM 中执行。最后加载 WinCE image 并运行。
NANDFlash Boot with EBOOT:
由于 NORFlash 容量小,价格贵,现在很多 ARM 处理器支持 NandFlash 引导。不同厂家的处理器对 Nandflash
的引导略有区别,具体要看 datasheet。但是本质就是先从 Nandflash 中读出一个小的 Loader 来运行,这个 Loader 再
从 Nandflash 中加载 EBOOT 到 SDRAM 中运行,最后 EBOOT 加载 WinCE image,就是 NK.bin。
NANDFlash Boot without EBOOT:
如果在 NandFlash 引导的时候不需要 EBOOT,也可以不用 EBOOT。这样就是系统启动后从 Nandflash 中加载
FreshAir 团队格言:打造 FreshAir 团队精神;相信只要努力就有机会;今天的努力是为了实现明天的梦想

FreshAir 团队成果文档(版权所有)
一个小的 Loader,小的 Loader 对硬件系统作基本的初始化,然后直接加载 WinCE image,一般应该是 NK.nb0,然
后运行。
这里来说一下 NK.bin 与 NK.nb0,两个不同的 WinCE image。
NK.nb0:就是一个可以直接运行的 WinCE 映像文件,直接拷贝到 SDRAM 中就可以运行。
NK.bin:被称为 Windows CE binary image data format 文件格式,是一种包含了多个独立纪录(Section)的二进制
文件。在加载的时候,需要分别加载,不同的 Section 加载到不同的地方。所以 NK.bin 需要 Bootloader 进行解释性
加载。但是他的 Size 会比 NK.nb0 小。可以使用 viewbin 命令查询 NK.bin 中的纪录信息。viewbin –rec nk.bin
前面已经讲过了一般系统会使用到的引导方式,下面介绍一下 EBOOT。在 WinCE 中 EBOOT 一个作用可以加
载 WinCE image,还可以通过网络配合 Platform Builder 下载 WinCE image 进行调试。在开发一个新的 BSP 的时候,
首先会基于一个相似的平台的 BSP 进行克隆,然后要做的就是要开发和调试 EBOOT 了,EBOOT 的架构如图:
BLCOMMON:相当于 EBOOT 的一个基本框架,主要完成 bootloader 相关内存的分配,解析 NK.bin 文件并进
行效验,初始化平台,通过网络下载 image 等功能。
OEM Code:主要是基于硬件平台,为 BLCOMMON 提供相应的接口函数,帮助完成相应的功能。
Eboot:一个小的网络协议栈,为网络下载 image 提供 DHCP,TFTP,UDP 等网络服务功能。
Network Driver:硬件平台的网络驱动部分,支持上层的网络功能。
Bootpart:为 Flash 设备提供分区功能,bootloader 可以创建一个 BinFS 分区和一个文件系统分区。还可以用它
来创建一个引导分区用来存放引导参数。
Flash Memory:硬件平台的 Flash 驱动。
三、自己编写 bootloader 的方法和步骤
1.WinCE 系统下 BootLoader 的开发
BootLoader 是一段单独的程序代码,它
存放于目标平台的非易失存储介质中,如
ROM 或 Flash。在开发 CE 的过程中,它主
要用于启动硬件和下载 nk.bin 到目标板上,
并有一定的监控作用。
图 1 描述了 WinCE 的 BSP 基本结构以及 BootLoader 所处的位置。
一般来说,对于 BootLoader 的功能要求并不是严格定义的,不同的场合区别很大。比如,在 PC 的硬件平台上,
由于硬件启动根本就不是通过 BootLoader(而是通过 BIOS),所以 BootLoader 就不需要对 CPU 加电后的初始化
做任何工作;而在笔者的开发平台(MIPS32)上,BootLoader 是最先被执行的程序,所以就必须包括加电初始化
程序。通常,BootLoader 必须包含下载 CE 映像文件的功能。另外,管理监控硬件设备通常也是必须的,因为这可
以极大地方便工程开发。由于 BootLoader 涉及到基本的硬件操作,如 CPU 的结构、指令等,同时又涉及到以太网
下载协议(TFTP,当然也可能通过串口)和策软设定的映像文件格式。因此从零实现的话,会需要相当长的过程。
好在微软为每种类型的 CPU 都提供了某种标准开发板的 BootLoader 例程,因此通常的做法是:从这些例程中寻找
FreshAir 团队格言:打造 FreshAir 团队精神;相信只要努力就有机会;今天的努力是为了实现明天的梦想
剩余19页未读,继续阅读















安全验证
文档复制为VIP权益,开通VIP直接复制

评论4