Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存内存 的供应商空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。

Bootloader概述  

对于嵌入式系统,Bootloader是基于特定硬件平台来实现的。因此,几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader。Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。对于2块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般也都需要修改Bootloader的源程序。  反过来,大部分Bootloader仍然具有很多共性,某些Bootloader也能够支持多种体系结构的嵌入式系统。例如,U-Boot就同时支持PowerPC、ARM、MIPS和X86等体系结构,支持的板子有上百种。通常,它们都能够自动从存储介质上启动,都能够引导操作系统启动,并且大部分都可以支持串口和以太网接口。

Bootloader的种类  

嵌入式系统世界已经有各种各样的Bootloader,种类划分也有多种方式。除了按照处理器体系结构不同划分以外,还有功能复杂程度的不同。  
首先区分一下“Bootloader”和“Monitor”的概念。严格来说,“Bootloader”只是引导设备并且执行主程序的固件;而“Monitor”还提供了更多的命令行接口,可以进行调试、读写内存、烧写Flash、配置环境变量等。“Monitor”在嵌入式系统开发过程中可以提供很好的调试功能,开发完成以后,就完全设置成了一个“Bootloader”。所以,习惯上大家把它们统称为Bootloader。  
表列出了Linux的开放源码引导程序及其支持的体系结构。
表中给出了X86 ARM PowerPC体系结构的常用引导程序,并且注明了每一种引导程序是不是“Monitor”。

bootloader monitor 描述 x86 ARM PowerPc
LiLo Linux磁盘引导程序
GRUB GNU的LiLo替代程序
Loadlin 从DOS引导LINUX
ROLO 从rom引导linux不需要BIOS
Etherboot 通过以太网启动Linux系统固件
LinuxBios 完全替代BIOS的Linux系统固件
BLOB LART等硬件平台的系统引导程序
u-boot 通用引导程序
Red-Boot 基于eCos的引导程序

表 开放源码的Linux 引导程序   

对于每种体系结构,都有一系列开放源码Bootloader可以选用。   
(1)X86
  X86的工作站和服务器上一般使用LILO和GRUB。LILO是Linux发行版主流的Bootloader。不过Redhat Linux发行版已经使用了GRUB,GRUB比LILO有更有好的显示界面,使用配置也更加灵活方便。   在某些X86嵌入式单板机或者特殊设备上,会采用其他Bootloader,例如:ROLO。这些Bootloader可以取代BIOS的功能,能够从FLASH中直接引导Linux启动。现在ROLO支持的开发板已经并入U-Boot,所以U-Boot也可以支持X86平台。  
(2)ARM   
ARM处理器的芯片商很多,所以每种芯片的开发板都有自己的Bootloader。结果ARM bootloader也变得多种多样。最早有为ARM720处理器的开发板的固件,又有了armboot,StrongARM平台的blob,还有S3C2410处理器开发板上的vivi等。现在armboot已经并入了U-Boot,所以U-Boot也支持ARM/XSCALE平台。U-Boot已经成为ARM平台事实上的标准Bootloader。
(3)PowerPC   
PowerPC平台的处理器有标准的Bootloader,就是ppcboot。PPCBOOT在合并armboot等之后,创建了U-Boot,成为各种体系结构开发板的通用引导程序。U-Boot仍然是PowerPC平台的主要Bootloader。   
(4)MIPS   
MIPS公司开发的YAMON是标准的Bootloader,也有许多MIPS芯片商为自己的开发板写了Bootloader。现在,U-Boot也已经支持MIPS平台。   
(5)SH   
SH平台的标准Bootloader是sh-boot。Redboot在这种平台上也很好用。   
(6)M68K   
M68K平台没有标准的Bootloader。Redboot能够支持m68k系列的系统。   

值得说明的是Redboot,它几乎能够支持所有的体系结构,包括MIPS、SH、M68K等体系结构。Redboot是以eCos为基础,采用GPL许可的开源软件工程。

Bootloader的启动  

Linux系统是通过Bootloader引导启动的。一上电,就要执行Bootloader来初始化系统。可以通过第4章的Linux启动过程框图回顾一下。  

系统加电或复位后,所有CPU都会从某个地址开始执行,这是由处理器设计决定的。比如,X86的复位向量在高地址端,ARM处理器在复位时从地址0x00000000取第一条指令。嵌入式系统的开发板都要把板上ROM或Flash映射到这个地址。因此,必须把Bootloader程序存储在相应的Flash位置。系统加电后,CPU将首先执行它。  

主机和目标机之间一般有串口可以连接,Bootloader软件通常会通过串口来输入输出。例如:输出出错或者执行结果信息到串口终端,从串口终端读取用户控制命令等。  Bootloader启动过程通常是多阶段的,这样既能提供复杂的功能,又有很好的可移植性。例如:从Flash启动的Bootloader多数是两阶段的启动过程。从后面U-Boot的内容可以详细分析这个特性。  

大多数Bootloader都包含2种不同的操作模式:本地加载模式和远程下载模式。这2种操作模式的区别仅对于开发人员才有意义,也就是不同启动方式的使用。从最终用户的角度看,Bootloader的作用就是用来加载操作系统,而并不存在所谓的本地加载模式与远程下载模式的区别。  

因为Bootloader的主要功能是引导操作系统启动,所以我们详细讨论一下各种启动方式的特点。  
1.网络启动方式 
 这种方式开发板不需要配置较大的存储介质,跟无盘工作站有点类似。但是使用这种启动方式之前,需要把Bootloader安装到板上的EPROM或者Flash中。Bootloader通过以太网接口远程下载Linux内核映像或者文件系统。第4章介绍的交叉开发环境就是以网络启动方式建立的。这种方式对于嵌入式系统开发来说非常重要。  使用这种方式也有前提条件,就是目标板有串口、以太网接口或者其他连接方式。串口一般可以作为控制台,同时可以用来下载内核影像和RAMDISK文件系统。串口通信传输速率过低,不适合用来挂接NFS文件系统。所以以太网接口成为通用的互连设备,一般的开发板都可以配置10M以太网接口。  
DHCP/BOOTP服务为Bootloader分配IP地址,配置网络参数,然后才能够支持网络传输功能。如果Bootloader可以直接设置网络参数,就可以不使用DHCP。  
TFTP服务为Bootloader客户端提供文件下载功能,把内核映像和其他文件放/tftpboot目录下。这样Bootloader可以通过简单的TFTP协议远程下载内核映像到内存。如图1所示。

图1 网络启动示意图   

大部分引导程序都能够支持网络启动方式。例如:BIOS的PXE(Preboot Execution Environment)功能就是网络启动方式;U-Boot也支持网络启动功能。  

2.磁盘启动方式   
传统的Linux系统运行在台式机或者服务器上,这些计算机一般都使用BIOS引导,并且使用磁盘作为存储介质。如果进入BIOS设置菜单,可以探测处理器、内存、硬盘等设备,可以设置BIOS从软盘、光盘或者某块硬盘启动。也就是说,BIOS并不直接引导操作系统。那么在硬盘的主引导区,还需要一个Bootloader。这个Bootloader可以从磁盘文件系统中把操作系统引导起来。   
Linux传统上是通过LILO(LInux LOader)引导的,后来又出现了GNU的软件GRUB(GRand Unified Bootloader)。这2种Bootloader广泛应用在X86的Linux系统上。你的开发主机可能就使用了其中一种,熟悉它们有助于配置多种系统引导功能。   LILO软件工程是由Werner Almesberger创建,专门为引导Linux开发的。现在LILO的维护者是John Coffman,最新版本下载站点:http://lilo.go.dyndns.org/。LILO有详细的文档,例如LILO套件中附带使用手册和参考手册。此外,还可以在LDP的“LILO mini-HOWTO”中找到LILO的使用指南。  
 GRUB是GNU计划的主要bootloader。GRUB最初是由Erich Boleyn为GNU Mach操作系统撰写的引导程序。后来有Gordon Matzigkeit和Okuji Yoshinori接替Erich的工作,继续维护和开发GRUB。GRUB的网站http://www.gnu.org/software/grub/上有对套件使用的说明文件,叫作《GRUB manual》。GRUB能够使用TFTP和BOOTP或者DHCP通过网络启动,这种功能对于系统开发过程很有用。  
 3.Flash启动方式  
 大多数嵌入式系统上都使用Flash存储介质。Flash有很多类型,包括NOR Flash、NAND Flash和其他半导体盘。其中,NOR Flash(也就是线性Flash)使用最为普遍。   NOR Flash可以支持随机访问,所以代码是可以直接在Flash上执行的。Bootloader一般是存储在Flash芯片上的。另外,Linux内核映像和RAMDISK也可以存储在Flash上。通常需要把Flash分区使用,每个区的大小应该是Flash擦除块大小的整数倍。图2是Bootloader和内核映像以及文件系统的分区表。

  Bootloader一般放在Flash的底端或者顶端,这要根据处理器的复位向量设置。要使Bootloader的入口位于处理器上电执行第一条指令的位置。   
  接下来分配参数区,这里可以作为Bootloader的参数保存区域。   
  再下来内核映像区。Bootloader引导Linux内核,就是要从这个地方把内核映像解压到RAM中去,然后跳转到内核映像入口执行。   
  然后是文件系统区。如果使用Ramdisk文件系统,则需要Bootloader把它解压到RAM中。如果使用JFFS2文件系统,将直接挂接为根文件系统。这两种文件系统将在第12章详细讲解。   
  最后还可以分出一些数据区,这要根据实际需要和Flash大小来考虑了。   
  这些分区是开发者定义的,Bootloader一般直接读写对应的偏移地址。到了Linux内核空间,可以配置成MTD设备来访问Flash分区。但是,有的Bootloader也支持分区的功能,例如:Redboot可以创建Flash分区表,并且内核MTD驱动可以解析出redboot的分区表。   
  除了NOR Flash,还有NAND Flash、Compact Flash、DiskOnChip等。这些Flash具有芯片价格低,存储容量大的特点。但是这些芯片一般通过专用控制器的I/O方式来访问,不能随机访问,因此引导方式跟NOR Flash也不同。在这些芯片上,需要配置专用的引导程序。通常,这种引导程序起始的一段代码就把整个引导程序复制到RAM中运行,从而实现自举启动,这跟从磁盘上启动有些相似.

BootLoader 的移植和修改  

BootLoader除了依赖于 CPU 的体系结构外,BootLoader 实际上也依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,RAM芯片的类型,其他外设的类型等。  
对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU而构建的,如果他们的硬件资源和配置不一致的话,要想让运行在一块板子上的BootLoader程序也能运行在另一块板子上,也还是需要作一些必要的修改。

BootLoader 的安装  

系统加电或复位后,所有的CPU通常都从CPU制造商预先安排的地址上取指令。比如,S3C44B0在复位时都从地址 0x00000000 取它的第一条指令。  
嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM或FLASH等)被安排这个起始地址上,因此在系统加电后,CPU将首先执行BootLoader程序。  
也就是说对于基于S3C44B0的这套系统,我们的BootLoader是从0地址开始存放的,而这块起始地址需要采用可引导的固态存储设备如FLASH。

BootLoader安装位置  

Boot loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。  
系统加电或复位后,所有的CPU 通常都从某个预先安排的地址上取指令。例如,基于ARM7TDMI core 的CPU 在复位时通常都从地址0x00000000取它的第一条指令。而基于CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM、或 Flash 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Bootloader 程序。通常总是将Boot Loader 安装在嵌入式系统的存储设备的最前端。  
固态存储设备的空间划分(地址从低到高顺序):Bootloader,Bootloader参数,内核映像,根文件系统映像。

名词解释bootloader相关推荐

  1. 【eMMC学习记录】emmc相关名词解释和基础概念

    名词解释 NAND Flash:半导体闪存 HDD:机械硬盘 FW:固件 Peak Power:峰值功率 Active Power:读写功耗 Idle Power:空闲功耗 standby/sleep ...

  2. 关于一些WM系统手机的名词解释【转】

    关于一些WM系统手机的名词解释[转] 2011年02月20日 1. ROM,RAM,Flash Memory ROM(Read Only Memory)的全名为只读记忆体,是PPC上的硬盘部分用来存储 ...

  3. Windows Mobile系统名词解释

    Windows Mobile系统名词解释 2011年04月14日 [b]1.什么是解锁,永久解锁[/b] [b]解锁[/b],随便解释一下吧,PPC机器在出厂的时候对机器内部核心的CID地址段进行了上 ...

  4. 【EMC】电磁兼容性相关名词解释、基础知识

    一.名词解释 1.EMC EMC(Electro Magnetic Compatibility)直译是"电磁兼容性".意指设备所产生的电磁能量既不对其它设备产生干扰,也不受其他设备 ...

  5. 名词解释_写字楼租赁相关名词解释

    对于租赁写字楼的租户来说,那些繁琐的合同是很令人头疼的.有时候连最基础的一些问题还没得到解决,就要面对一堆复杂的文书,会使租赁写字楼的租户开始迟疑.那么在这里我们给大家科普一下关于写字楼租赁你需要知道 ...

  6. 计算机组成原理名词解释常用,2018考研408计算机组成原理名词解释(3)

    2018考研408计算机组成原理名词解释(3) 2017-09-29 16:02 | 考研集训营 随着时代的快速发展,任何行业都离不开网络,导致计算机行业近几年非常的火热,使各大高校竞相争抢优秀人才, ...

  7. 神经网络相关名词解释

    神经网络相关名词解释 这篇文章的目的是把之前概念理解的名词用公式记忆一下. 1. 正则化 1.0 过拟合 这是正则化主要解决的问题. 过拟合现象主要体现在accuracy rate和cost两方面: ...

  8. 稀有名词解释——Java 堆污染(犄角旮旯问题)

    稀有名词解释--Java 堆污染(犄角旮旯问题) 有些面试官喜欢问一些稀有名词,彰显其渊博的知识背景. 所谓堆污染,简单的说就是当一个泛型类型变量赋值给不是泛型类型变量,这种错误在编译期间能被编译器警 ...

  9. 常见算子使用_spark快速入门(二)spark粗略流程简述及常见名词解释

    大家元旦快乐,牛年发发发~~牛气冲天o(* ̄︶ ̄*)o spark粗略流程简述 (1)有算子触发Action,Driver端和hdfs的namenode进行通信,询问元数据信息.根据元数据信息 及相应 ...

最新文章

  1. python基本使用-python基本用法
  2. C#多线程编程(转)
  3. 同一个项目相互调接口_超详细——接口测试总结与分享(一)
  4. vue中如何关闭eslint检测?
  5. python web 框架的flash消息_python web开发-flask中消息闪现flash的应用
  6. 项目开发中经常有一些被嫌弃的小数据,现在全丢给 FastDFS
  7. 深入理解Solidity
  8. 知乎招聘搜索算法实习生!邀你共建知乎搜索引擎!
  9. windows php sqlite,如何在Apache 2.4(Windows 7)上为PHP 5.6.14配置SQLite3?
  10. 一种基于memcache或redis缓存架构的验证码
  11. java requirenonnull_Java null判断新方法:Objects.requireNonNull 你过用吗?
  12. svn linux客户端使用教程,linux svn 客户端安装配置
  13. vb2008如何连接mysql_VB如何连接ACCESS数据库详解
  14. 如何运营好一个微信公众号?
  15. 【EduCoder答案】循环结构程序设计1
  16. CANoe软件使用(一)——软件界面介绍
  17. 机器学习-迁移学习的介绍
  18. 类似于qq魔法表情的窗口
  19. 计算机cpu、寄存器、内存区别
  20. Linux:python捕获异常,模板,文件以及数据存储

热门文章

  1. 解决java.lang.UnsatisfiedLinkError
  2. java.sql.SQLException: Unable to load authentication plugin ‘caching_sha2_password‘.
  3. AI专业教您保姆级在暗影精灵8Windows11上本地部署实现AI绘画:Stable Diffusion(万字教程,多图预警)
  4. Android 弥散阴影的ImageView
  5. 找朋友(斗地主)判断逻辑
  6. C Primer Plus 第九章 大二第二学期 第二天学习
  7. 浅析嵌入式系统之uboot详解(5.3)—PWM定时器(番外)
  8. spark运行出现py4j.protocol.Py4JError异常
  9. 格网DEM生成不规则三角网TIN
  10. 华硕笔记本k555拆机图解_「华硕k401n」华硕K401笔记本电脑拆机清灰步骤详解 - seo实验室...