BootLoader

一、BootLoader简介

 在专用的嵌入式板子运行操作系统已经变得越来越流行。一个嵌入式系统从软件的角度看通常可以分为三个层次:

 1、 引导加载程序。包括固化在固件(firmware)中的Booter代码(可选),和Loader两大部分。

 2、 操作系统。特定于嵌入式板子的定制内核以及内核的启动参数;以及在内核和应用程序之间可能还会包括一个嵌入式图形用户界面,常用的嵌入式GUI有:MicroWindows和MiniGUI等。

3、 用户应用程序。特定于用户的应用程序。

 

 引导加载程序是系统加电后运行的第一段软件代码,称之为Bootloader。BootLoader是Booter和Loader的合写:前者意味着要初始化嵌入式系统硬件使之运行起来,至少是部分运行起来,与PC机中的BIOS作用相似;后者意味着将嵌入式操作系统映像加载到内存中,并跳转过去运行。如PC机中MBR上的BootLoader(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并不是嵌入式系统必不可少的组成部分,但是在系统中有Bootloader可以给嵌入式产品的开发调试带来很多便利。

说到底,bootloader是一段裸机程序,是直接与硬件打交道的。① 它在系统上电后开始执行(PC系统中在bootloader之前有个BIOS固件,嵌入式系统中一般没有),其最终目的是“初始化硬件设备,准备好软件环境,最后调用操作系统内核”。② 为了方便进行底层开发(比如调试内核等),bootloader增加了很多功能,主要有UART、网络、USB、读写Flash(Nor or Nand)、解压缩、LCD支持等等。这样的bootloader具有比较强大的功能,除了不能进行多任务调度,已经类似一个小型操作系统了,被称为“Monitor”。U-boot就是这样一种bootloader,全功能体积高达数百Kbytes,如果不需要这些开发调试功能,发布产品时它能配置到很小的体积

那我们也知道其实OS(如linux)的Kernel其实也是一段裸机程序,也是直接掌管硬件的,不过这个程序极其复杂,许许多多的计算机专家和黑客为其耗费心血,如果三四百K的U-boot已经比较复杂,那么一个典型功能的linux Kernel编译后竟然能高达万Kbytes,光从代码量来看,linux的复杂度已经是U-boot的百倍。而其实远不止。

二、常见bootloader介绍

Redboot

ARMboot

U-Boot

Blob

Bios-lt

Bootldr

三、嵌入式启动过程

bootloader;

内核

根文件系统

应用软件


 参考:

https://blog.csdn.net/weibo1230123/article/details/82716818

你可能感兴趣的:(Linux)