bootloader
- 格式:doc
- 大小:37.00 KB
- 文档页数:6
第三节BootLoaderUn Re gi st er ed本节目标•深入理解BootLoader 启动过程•掌握uBoot 的定制•了解uBoot 的代码树构成•uBoot 的下载烧写Un Re gi st er edBootloader 定义•Bootloader 是硬件启动的引导程序,是启动操作系统的根本;•是在操作系统内核或用户应用程序运行之前运行的一段小程序。
通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用准备好环境;•在一般典型的系统中,整个系统的加载启动任务就完全由Bootloader 来完成。
Un Re gi st er edBootloader 特点•Bootloader 不属于操作系统内核,采用汇编语言编写,因此针对不同的CPU 体系结构,这一部分代码不具有可移植性;•在移植操作系统时,这部分代码必须加以改写。
•Bootloader 不但依赖于CPU 的体系结构,而且依赖于嵌入式系统板级设备的配置。
Un Re gi st er edBootloader 启动模式•启动加载模式:在这种模式下,Bootloader 从目标机上的某个固态存储设备上将操作系统加载到RAM 中运行,整个过程并没有用户的介入。
•下载模式:在这种模式下,目标机上的Bootloader 将通过串口或网络等通信手段从开发主机(Host )上下载内核映像和根文件系统映像等到RAM 中。
然后可以再被Bootloader 写到目标机上的固态存储媒质中,或者直接进行系统的引导。
Un Re gi st er edBootloader 基本功能•初始化硬件•将操作系统内核从Flash 拷贝到SDRAM 中,如果是压缩格式的内核,还要解压缩•改写系统的内存映射,原先Flash 起始地址映射为0地址,这时需要将RAM 的起始地址映射为0•提供Linux 内核的启动参数•启动Linux 内核•设置堆栈指针并将bss 段清零将来执行C 语言程序和调用子函数时要用到•改变pc 值,使得CPU 开始执行真正的操作系统内核。
Bootloader结构
Bootloader的结构主要依赖于CPU的体系结构,因此大多数Bootloader都分为stage1和stage2两大部分。
依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。
而stage2则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。
一般来说,stage1通常包括以下步骤(以执行的先后顺序):
1.硬件设备初始化。
2.为加载Bootloader的stage2准备RAM空间。
3.复制Bootloader的stage2代码到RAM空间中。
4.设置好栈(原因:为下一步准备的,因为C语言的运行需要堆栈)。
5.跳转到stage2的C入口点。
而stage2通常包括以下步骤(以执行的先后顺序):
1.初始化本阶段要使用到的硬件设备。
2.检测系统内存映射(memory map)。
3.为内核设置启动参数。
4.调用内核。
一、引言bootloader是计算机系统中用于引导操作系统的程序,它负责将操作系统从存储设备中加载到计算机内存中并执行。
由于存储设备的容量有限,bootloader的体积通常也需要尽可能小,这就需要使用一种高效的压缩算法对bootloader进行压缩,以节省存储空间并提高启动速度。
本文将介绍bootloader压缩算法的原理、常用的压缩算法以及在实际应用中的优缺点。
二、bootloader压缩算法的原理1. bootloader的特点bootloader通常具有体积小、启动速度快的特点,因此对于其压缩算法的要求也较为特殊。
传统的通用压缩算法通常无法满足bootloader 的需求,因此需要专门针对bootloader设计压缩算法。
2. 压缩算法的选择在选择bootloader压缩算法时,需要考虑压缩速度、压缩比、解压速度和适应性等因素。
常用的bootloader压缩算法包括LZMA、LZO、LZ4等。
三、常用的bootloader压缩算法1. LZMALZMA是一种基于LZ77算法的压缩算法,它具有较高的压缩比和较小的解压时间。
但是,由于其压缩速度较慢,适用于对压缩比要求较高的bootloader。
2. LZOLZO是一种快速的压缩算法,它具有较快的压缩速度和解压速度,适用于对启动速度要求较高的bootloader。
3. LZ4LZ4是一种专门为快速解压而设计的压缩算法,它具有优秀的解压速度和适应性,适用于对启动速度和压缩比都有要求的bootloader。
四、bootloader压缩算法的优缺点1. LZMA的优缺点优点:较高的压缩比和较小的解压时间。
缺点:压缩速度较慢,适用于对压缩比要求较高的bootloader。
2. LZO的优缺点优点:较快的压缩速度和解压速度。
缺点:压缩比较低,适用于对启动速度要求较高的bootloader。
3. LZ4的优缺点优点:优秀的解压速度和适应性。
缺点:压缩比较低,适用于对启动速度和压缩比都有要求的bootloader。
bootloader概念和功能
引导加载程序(bootloader)是一段位于计算机系统上电时运行的固件,其目的是加载操作系统(OS)内核或其他引导程序。
它又被称为引导程序或引导管理器。
引导加载程序的主要功能包括:
1. 启动硬件初始化:引导加载程序会对计算机硬件进行初始化和配置,以便后续的操作系统和应用程序能够正确地运行。
2. 加载操作系统:引导加载程序会从存储设备(如硬盘、固态硬盘或网络)中读取操作系统的内核文件,并将其加载到计算机内存中。
3. 校验和验证:引导加载程序会对加载的操作系统内核文件进行校验,以确保文件的完整性和正确性。
这通常涉及到校验和、数字签名或哈希函数等技术。
4. 多重引导:引导加载程序通常可支持多个操作系统的引导,用户可以根据需要选择要启动的操作系统。
这在多系统或多操作系统共存的情况下非常重要。
5. 错误处理和故障恢复:引导加载程序还可以检测和处理系统启动过程中的错误和故障。
它能够提供一些故障恢复的选项,例如回滚操作系统更新、修复损坏的系统文件等。
总的来说,引导加载程序是计算机启动过程中重要的一环,它负责将计算机从电源关闭状态转换为正常工作状态,并加载操作系统以供用户使用。
它具有管理和控制系统启动过程的功能,确保系统的正确和稳定运行。
BootLoader锁定本词条由“科普中国”百科科学词条编写与应用工作项目审核。
行之前运行。
可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最U也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
在一个基于ARM7TDM I00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
中文名启动装载外文名BootLoader说明系统启动前引导程序操作模式启动模式、交互模式1背景介绍Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行。
[1]对于嵌入式系统,Bootloader是基于特定硬件平台来实现的。
因此,几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader 。
Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。
对于2块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的B ootloader程序也能运行在另一块板子上,一般也都需要修改Bootloader的源程序。
反过来,大部分Bootloader仍然具有很多共性,某些Bo otloader也能够支持多种体系结构的嵌入式系统。
例如,U-Boot就同时支持PowerPC、ARM、MIPS和X86等体系结构2操作模式1.自启动模式:在这种模式下,bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
2.交互模式:在这种模式下,目标机上的bootloader将通过串口或网络等通行手段从开发主机(Host)上下载内核映像等到RAM中。
可以被bootloader写到目标机上的固态存储媒质中,或者直接进入系统的引导。
bootloader通俗解释【实用版】目录1.Bootloader 的通俗解释2.Bootloader 的功能和作用3.Bootloader 的种类和应用正文一、Bootloader 的通俗解释Bootloader,中文俗称“引导程序”,是计算机系统启动时运行的第一个程序。
它可以理解为一个“中介”,负责在操作系统启动前,协调硬件与软件之间的沟通,将操作系统从存储设备加载到内存中,并最终将控制权交给操作系统。
二、Bootloader 的功能和作用1.硬件初始化:Bootloader 负责对计算机硬件进行初始化,包括内存、外设、总线等,为操作系统运行做好准备。
2.加载操作系统:Bootloader 将操作系统从存储设备(如硬盘、U 盘等)中读取到内存中,为操作系统的启动提供支持。
3.设置启动参数:Bootloader 可以根据用户需求,设置不同的启动参数,例如选择不同的操作系统、进入 BIOS 设置等。
4.诊断和自检:Bootloader 可以对计算机硬件进行自检,诊断硬件是否存在问题,并在启动时显示相关信息,方便用户了解系统状态。
三、Bootloader 的种类和应用1.BIOS:BIOS(Basic Input/Output System,基本输入输出系统)是一种最基本的 Bootloader,主要应用于早期的计算机系统。
它主要负责硬件的初始化和操作系统的加载。
2.UEFI:UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)是一种更先进的 Bootloader,主要应用于现代计算机系统。
相较于 BIOS,UEFI 具有更好的兼容性和可扩展性,可以支持更多的硬件设备和操作系统。
3.GRUB:GRUB(GNU GRand Unified Bootloader,GNU 统一引导加载程序)是一种开源的 Bootloader,广泛应用于 Linux 系统。
U-Boot之一:BootLoader 的概念与功能一般情况下嵌入式Linux 系统中的软件主要分为以下几部分:1) 引导加载程序:其中包括内部ROM 中的固化启动代码和BootLoader 两部分。
内部固化ROM 是厂家在芯片生产时候固化的,作用基本上是引导BootLoader。
有的芯片比较复杂,比如Omap3 在flash 中没有代码的时候有许多启动方式:USB、UART 或以太网等等。
而S3C24x0 则很简单,只有Norboot 和Nandboot。
2) Linux kernel 和drivers。
3) 文件系统。
包括根文件系统和建立于Flash 内存设备之上的文件系统(EXT4、UBI、CRAMFS 等等)。
它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境及载体。
4) 应用程序。
用户自定义的应用程序,存放于文件系统之中。
在Flash 存储器中,他们的分布一般如下:但是以上只是大部分情况下的分布,也有一些可能根文件系统是initramfs,被一起压缩到了内核映像里,或者没有Bootloader 参数区,等等。
1.2 在嵌入式Linux 中BootLoader 的必要性Linux 内核的启动除了内核映像必须在主存的适当位置,CPU 还必须具备一定的条件:但是在CPU 刚上电启动的时候,一般连内存控制器都没有初始化过,根本无法在主存中运行程序,更不可能处在Linux 内核启动环境中。
为了初始化CPU 及其他外设,使得Linux 内核可以在系统主存中运行,并让系统符合Linux 内核启动的必备条件,必须要有一个先于内核运行的程序,他就是所谓的引导加载程序(Boot Loader)。
而BootLoader 并不是Linux 才需要,而是几乎所有运行操作系统的设备都需要。
我们的PC 的BOIS 就是Boot Loader 的一部分(只是前期引导,后面一般还有外存中的各种BootLoader),对于Linux PC 来说,Boot Loader = BIOS + GRUB/LILO。
Boot Loader的启动流程和开发经验总结Windows CE最大程度继承了桌面版Windows的丰富功能,但是Windows CE并不是一个通用的安装版操作系统。
在形形色色的嵌入式设备世界里,一款CE系统通常只会针对某一种硬件平台生成。
一般来说,Windows CE的开发过程可以分为:0AL(OEM Abstraction Layer)、驱动、应用程序开发三个步骤。
其中,0AL开发最基本的一步是板级支持包(BSP),而BootLoader设计则在BSP开发中具有极为关键的地位。
1.什么是BootLoader嵌入式系统的启动代码一般由两部分构成:引导代码和操作系统执行环境的初始化代码。
其中引导代码一般也由两部分构成:第一部分是板级、片级初始化代码,主要功能是通过设置寄存器初始化硬件的工作方式,如设置时钟、中断控制寄存器等,完成内存映射、初始化MMU等。
第二部分是装载程序,将操作系统和应用程序的映像从只读存储器装载或者拷贝到系统的RAM中并执行。
(1)什么是板级BSP?BSP(Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,主要是为了支持操作系统,使之能够更好的运行于硬件主板。
不同的操作系统对应于不同形式的BSP,例如WinCE的BSP和Linux的BSP相对于某CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的。
所以,BSP一定要按照该系统BSP的定义形式来写,这样才能与上层OS保持正确的接口,良好的支持上层OS。
(2)什么是Boot Loader在BSP中有一个重要的组成部分就是BootLoader,它是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好环境。
一般来说,在嵌入式世界里BootLoader 是严重地依赖于硬件的,因此想建立一个通用的 BootLoader 几乎是不可能的。
不同的 CPU 体系结构有不同的BootLoader,而且除了依赖于 CPU的体系结构外,BootLoader还依赖于具体的嵌入式板级设备的配置。
这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 结构而构建的,要想让运行在一块板子上的 BootLoader 程序也能运行在另一块板子上,通常也都需要修改BootLoader 的源程序。
2.BootLoader在PC机与嵌入式的区别比较(1)引导程序在PC机和嵌入式上的区别一般来说,在PC的硬件平台上,由于硬件启动根本就不是通过BootLoader(而是通过BIOS),所以BootLoader就不需要对CPU加电后的初始化做任何工作。
在桌面系统中,有以下几种设备可以作为启动设备使用:硬盘、USB盘、光盘驱动器、还有网卡的Boot ROM 等。
但无论选择了哪一种启动设备,操作系统都会去将该设备起始地址的内容读入内存,BIOS 将控制移交给引导装载程序。
如果启动设备是IDE硬盘,这时通常将引导装载程序装入第一个扇区(通常被称做主引导扇区,MBR),然后将内容读入内存再运行。
在嵌入式平台上,引导装载程序是在硬件上执行的第一段代码,通常将引导程序放置在不易丢失的存储器的开始地址或者是系统冷启动时PC寄存器的初始值。
在嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成,引导程序完成自己的任务后,也将控制权移交给操作系统。
因此,BootLoader是最先被执行的程序,所以就必须包括加电初始化程序。
(2)BSP在嵌入式和桌面Windows中的区别其实运行在PC机上的桌面Windows或Linux系统也是有BSP的,只是PC机均采用统一的X86体系架构,这样操作系统的BSP相对X86架构是单一确定的,不需要做任何修改就可以很容易支持OS在X86上正常运行,所以在PC机上谈论BSP这个概念也就没什么意义了。
而对嵌入式系统来说情况则完全不同,目前市场上有多种结构的嵌入式CPU(如X86,ARM,MIPS等),而且为了性能的需要,外围设备也会有不同的选择和定义。
因此,一个嵌入式操作系统针对不同的CPU会有不同的BSP,又即使同一种CPU,由于外设的差别其BSP 也会不一样。
所以根据硬件设计编写和修改BSP,是保证嵌入式系统正常运行的一个重要环节。
(3)嵌入式BSP与PC机主板BIOS的区别PC机主板上的BIOS首先是负责在电脑开启时检测、初始化系统设备、装入操作系统并调度操作系统向硬件发出的指令。
它的Firmware代码是在芯片生产过程中固化的,一般来说用户是无法修改。
然后,为下载运行操作系统做准备,把操作系统由硬盘加载到内存,并传递一些硬件接口设置给系统。
在OS正常运行后,BIOS的作用基本上也就完成了,这就是为什么更改BIOS一定要重新关机开机。
从这个角度来说,PC机BIOS的作用就象嵌入式系统中的Bootloader,都是最底层的引导软件,初始化主板的基本设置,为接收外部程序做硬件上的准备。
但与Bootloader不同的是,BIOS在装载OS系统的同时还传递一些参数设置,而Bootloader只是简单的装载系统。
尽管BSP的开始部分和BIOS所做的工作类似,可是大部分又和BIOS不同,作用也完全不同。
因为BSP还包含和系统有关的基本驱动,程序员可以编程修改BSP,在BSP中任意添加一些和系统无关的驱动或程序,甚至可以把上层开发的统统放到BSP中。
而BIOS程序是用户不能更改和编译编程的,只能对参数进行修改设置,当然更不会包含一些基本的硬件驱动。
3.Boot Loader的启动流程大多数 BootLoader 都包含两种不同的操作模式:启动加载模式和下载模式。
启动加载模式也称为自主模式,即 BootLoader 从目标机上的某个固态存储设备上将操作系统加载到RAM 中运行,整个过程并没有用户的介入。
而下载模式则是目标机上的 BootLoader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件。
从主机下载的文件通常首先被Boot Loader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的FLASH 类固态存储设备中。
这种模式通常在第一次安装内核与根文件系统时被使用,或系统更新时使用。
一般嵌入式系统的Boot Loader较为常用的是启动加载模式,它的加载流程也是我们要重点讨论的内容。
(1)启动部分启动部分主要是实现初始化硬件的功能。
在参考板的BootLoader目录下,会发现一些.s 文件,可能会是init.s或者是reset.s等,这样的文件是CPU加电后最先执行的代码。
接着Oal.exe通过Startup函数完成硬件的初始化,StartUp 函数是Boot Loader的入口函数。
该函数一般是使用汇编语言编写,与CPU关系非常紧密,能完成初始化CPU、内存等核心硬件。
Startup.s代码与硬件平台的Bootloader启动代码共用。
如果是热启动,即在该函数调用之前已经启动了Bootloader程序,相当基本硬件初始化已经完成,则直接跳转到OALStartUp函数中;否则需要进行硬件中断屏蔽、内存、系统时钟频率、电源管理等硬件的基本初始化过程。
在系统硬件初始化完毕之后,Startup调用OALStartUp函数,OALStartUp 函数主要完成将OEMAddressTable表传递给内核,然后调用KernelStart函数跳转到内核。
因此,这部分工作是BootLoader的一大重点。
(2)主控部分StartUp 函数初始化CPU等核心硬件并跳转到Main函数后,系统就会转入C语言代码执行环境。
这时函数分为3个模块:BLCOMMON、Download Function、FLASH Function。
其中BLCOMMON 模块是由微软提供的,执行一些逻辑上的功能,因此建议开发人员不要对其进行修改。
而Download Function、FLASH Function中的函数与硬件平台息息相关,因此对于每种硬件平台都要将函数的实现进行修改。
其中,BLCOMMON库是与BootLoader程序链接在一起的,BLCOMMON库的入口点为BootloaderMain函数,它是Startup汇编函数完成后跳转至该入口的。
Main函数的主要任务时调用BLCommon中的 BootloaderMain()函数,这是BootLoader的主控函数,它控制了BootLoader的完整执行流程。
这部分代码由C语言实现,是BLCOMMON代码的一部分,它可以用来执行比较复杂的操作。
比如检测内存和Flash的有效性、检测外部设备接口、检测串口并且向已经连接的主机发送调试信息、通过串口等待命令、启动网络接口、建立内存映射等汇编无法完成的工作。
(3)下载部分一般在平台调试完毕后,可以在不用人工干预的情况下自动加载CE,这也是BootLoader 的功能之一。
而在调试阶段时,这需要通过Loader所支持的命令来进行操作的,借助于这些命令不仅可以完成硬件平台的部分测试,还能完成CE的BootLoader程序最为重要的一个功能--下载CE映像。
如果说硬件调试功能可以由其它的程序代替而不放入BootLoader中,但是下载映像文件却是BootLoader必需的功能。
CE映像文件通常叫做nk.bin,它是Windows CE二进制数据格式文件,不仅包含了有效的程序代码,还有按照一定规则加入的控制信息。
当然,也可以选择生成.sre格式的代码文件,但是相于对前一种格式,它的代码要长很多,所需要的下载时间也更长。
(4)支持DOC部份对于WinCE操作系统而言,丰富的多媒体功能是其一大特点。
但是随之而来的问题是,如果选择了图形界面和中文支持,系统很容易大大超出嵌入式系统上百KB的数量级。
而DOC(Disk On Chip)则提供了一种相对廉价的大存储容量的解决方案。
DOC本质上是一种加以软件控制的NAND格式的Flash,通过TFFS这一软件层提供对WinCE 的支持。
由于DOC不能像内存一样被直接访问,所以其加载WinCE的过程有些特殊,必须要在BootLoader中加入专门的代码,才能使用DOC来存放WinCE映像文件。
4.Boot Loader的开发经验总结(1)嵌入式系统中,Bootloader的意义与作用与PC上的BIOS有点类似,它对开发板上的主要部件如CPU、SDRAM、FLASH、串口等进行了初始化,也可以使用Bootloader下载文件到开发板和启动系统等。
因此,一个功能比较强大的Bootloader已经相当于一个微型的操作系统了。