BootLoader,也叫做引导加载程序,是系统加电后运行的第一段软件代码。所以在嵌入式系统中作用非常大,是系统运行的第一步。
BootLoader的作用:(对比PC机)
PC中:
引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(如LILO和Grub等)组成。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的OS BootLoader读到系统的RAM中,然后将控制权交给OS BootLoader,OS BootLoader的主要任务就是将内核镜像从硬盘上读取到RAM中然后跳转到内核的入口点去运行(当然其中还有一些细节),启动操作系统。操作系统完成堆栈的初始化,必要数据结构的初始化,和BSS段的清零,然后开始真正的运行(可以看做是一个大的死循环)
嵌入式系统中:
嵌入式系统中没有像BIOS那样的固件程序,因此整个系统加载启动任务完全由BootLoader负责,包括初始化硬件设备、建立内存空间的映射图,从而将系统软件带入一个合适的状态,以便为最终调用操作系统内核准备好正确的环境
嵌入式Linux系统中从软件的角度分为4个层次
1,引导加载程序。包括固化在固件中的Boot代码(可选),以及BootLoader两部分
2,Linux内核。设置内核的启动参数,以及定制特定于嵌入式板子的内核
3,文件系统。包括根文件系统和建立于Flash内存设备之上的文件系统。通常用Ramdisk来作为文件系统
4,用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面(GUI)。通常嵌入式GUI包括QT,MiniGUI和MicroWindows
它们在固态存储设备中的空间分配结构:
--------------------------------------------------------------------
| BootLoader | Linux内核 | 文件系统 | 应用程序 |
| | 参数 内核 | | |
--------------------------------------------------------------------
BootLoader程序结构:
BootLoader与硬件息息相关,硬件环境不同BootLoader也不同。可以说,在嵌入式开发中,建立一个通用的BootLoader几乎是不可能的。
BootLoader的实现依赖于CPU的体系结构,因此大多数BootLoader都分为stage1和stage2两大部分。
依赖于CPU体系结构的代码,如设备初始化代码等,通常放在stage1中,而且绝大部分都用汇编语言来实现,以达到短小精悍的目的
stage2则通常用C语言来实现,这样可以实现更复杂的功能,而且代码具有更好地可读性和可移植性
BootLoader的stage1通常包括:
1,硬件初始化
2,为加载BootLoader的stage2准备RAM空间
3,复制BootLoader的stage2到RAM空间中
4,设置好堆栈
5,跳转到stage2的C入口点
BootLoader的stage2通常包括:
1,初始化本阶段要使用到的硬件设备
2,检测系统内存映射
3,将Kernel镜像和根文件系统镜像从Flash上读取到RAM空间中
4,为内核设置启动参数
5,调用内核
BootLoader的操作模式:
1,启动加载模式(Bootloading)
在这种模式下,BootLoader从目标机上的某个固态存储设备上将操作系统加载到内存中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,在嵌入式系统发布后,BootLoader必须工作在此模式下才能引导整个系统工作
2,下载模式(Downing)
下载模式是目标机上的BootLoader通过串口或网络等通信手段从开发主机上下载内核镜像和根文件系统到内存中,然后可以再被BootLoader写到目标机上的固态存储媒介中,或者直接进行系统引导。前一种功能通常用于第一次烧写内核与根文件系统到固态媒介时或系统更新时使用;后者多用于开发人员在前期开发过程中的系统调试阶段。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令接口
常见的嵌入式BootLoader介绍:
1,vivi
韩国MIZI公司开发的,主要用于ARM,目前只支持使用串口和主机通信
一般作用:
>检测目标板
>下载程序并写入Flash
>初始化硬件
>把内核从Flash复制到RAM,然后启动它
2,U-Boot
德国DENX小组开发的可以运行在PowerPc,ARM,MIPS等多种嵌入式开发板中
3,RedBoot
由RedHat开发的,专门用于嵌入式系统定制的引导启动工具,它基于ECOS(Embedded Configurable Operating System)的硬件抽象层
集BootLoader、调试、和Flash烧写于一体的,支持串口、网络下载的,可执行的嵌入式应用程序
4,ARMBoot
是一个以ARM或StrongARM为内核CPU的嵌入式系统的BootLoader固件程序
5,Blob
Boot Loader Object的缩写,最初由Jan-Derk Bakker和Erik Mouw两人为一块名为LART(Linux Advanced Radio Terminal)的开发板写的
6,DIY