本文主要是介绍bootloader启动引导,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、Bootloader概述
简而化之的说,在嵌入式系统中Bootloader就是在系统CPU开启或计算机复位的时候运行的程序。这段程序可以初始化硬件设备、建立内存空间映射图,将系统的软硬件环境带到一个合适状态,为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由Bootloader来完成。以基于ARM7TDMI core的嵌入式系统为例来说,系统在上电或复位时通常都从地址0x00000000处开始执行,而系统的Bootloader程序通常就是被安排在这个地址处的。
二、Bootloader的特点
(1)与硬件相关性大
(2)与具体CPU类型相关性大
(3)与系统的具体硬件实现(电路板)相关
(4)与具体操作系统无关通常被保存在某种被映射到CPU某个指定地址的固态存储器中
(5)系统开始运行,Bootloader便不再起作用
(6)Bootloader启动可以是单阶段或多阶段,代码可以都在flash中运行,或者一部分在flash中运行,一部分在ram中运行
(7)一般Bootloader至少有一部分在flash中运行,但有少数例外(需要处理器支持)
(8)一般Bootloader有“引导”和“下载”两种工作模式还需要支持与Host之间的通信,一般为串口
三、Bootloader的操作模式
两种不同的操作模式
下载模式:
对研发人员来说,Bootloader一般需要工作在下载模式下,尤其是需要调试内核或者Bootloader本身的时候。通过串口终端与Bootloader进行交互,可以操作系统硬件。比如通过网口或者串口下载内核,烧写Flash等等。 用于系统安装和更新等. 在这种模式下, 目标机上的Bootloader将通过串口或者网络连接或者其它通信手段从主机下载文件,比如:下载内核镜像和根文件系统镜像等。从主机下载的文件通常首先被Bootloader保存到目标机的ram 中,然后被Bootloader写到目标机上的FLASH类固态存储设备中。Bootloader 的这种模式通常在第一次安装内核与根文件系统时使用;此外,以后的系统更新也会使用Bootloader的这种工作模式。此状态需要用户干预,如果用户不干预则进入自主启动模式。
启动加载模式:
这种模式也称为“自主”模式,即 Bootloader 从目标机上的某个固体存储设备上将操作系统加载到 RAM 中运行,整个过程没有用户的加入。 这种模式是 Bootloader的正常工作模式,因此当以嵌入式产品发布的时候,Bootloader 必须工作在这种模式下。 这种情况下,Bootloader必须完成硬件自检、配置,并从Flash中将内核拷贝到SDRAM中,并跳转到内核入口,实现自启动,而不需要人为的干预。
四、Bootloader 的概念扩展
Bootloader 最主要的功能是引导加载内核镜像。但是随着嵌入式系统的发展,Bootloader也随之在完善基本功能的基础上,进行了很多扩展,bootloader 可以更多地增加对具体系统的板级 支持,即增加一些硬件模块功能上的使用支持,以方便开发人员进行开发和调试。所以有人将功能扩展后的 Bootloader比作一个微小的系统级的代码包。
.Bootloader所支持的CPU和嵌入式板 每种不同的CPU系列通常都有不同的Bootloader。有些Bootloader也 支持多种体系结构的CPU,比如U—Boot就同时支持ARM体系结构和MIPS 体系结构。除了依赖于CPU的体系结构外,Bootloader实际上也依赖于具体 的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它 们是基于同一种CPU而构建的,要想让运行在一块板子上的Bootloader程序 也能运行在另一块板子上,通常也都需要对Bootloader的源程序进行一定的修改。
五、Bootloader与主机之间的文件传输
- 串口与主机之间进行文件传输
- 传输协议为xmodem/ymodem/zmodem
- 以太网传输
- 传输协议为TFTP
- 或者,直接使用FTP服务
- 或者,使用mount方式挂载映射
六、Bootloader的启动过程
一般情况来说,Bootloader根据不同的硬件实现方法也不一样,是在嵌入式世界里尤是如此。因此,在嵌入式世界里建立一个通用的Bootloader几乎是不可能的。但尽管如此,我们仍然可以对Bootloader归纳出一些通用的特性来,以指导用户特定的Bootloader 设计与实现。 基本硬件设备的初始化(屏蔽中断、设置第一阶段CPU的速度和时钟频率,关闭处理器内部指令/数据cache等) ·为第二阶段准备ram空间
- 如果是从某个固态存储器中,则复制Bootloader第二阶段代码到ram中
- 设置堆栈
- 跳转到第二阶段的C程序入口点初始化本阶段要使用的硬件设备
- 检测系统内存映射(memory Map)
- 将Kernel映象和根文件系统映象从flash加载到ram中
- 为内核设置启动参数
- 调用内核
七、Bootloader升级过程
除了arm,其它的嵌入式系统或PC上也会有Bootloader,主要用来启动其他操作系统,通常每个操作系统都有一套为其特定的引导程序。在硬件起动后,硬件设备尚未初始化,直接加载体积较大的系统比较困难,甚至会出现无法加载的情况,如系统内核在网络上的情况,所以常常在系统运行前,提供一个体积较小但又具体初始化基本软硬件环境的程序来运行,由它来载入系统并设置系统运行参数,并最终运行系统,这就是Bootloader。
它可以分为两大类,一是芯片在出厂时,生产商固化在ROM中;二是用户在设计过程中,根据实际需要设计一小段代码,使新的应用程序从非JATG接口引导到ROM区或RAM区。其实这两类在功能上上相差不多。 我们都知道程序都是从复位开始执行起的,Bootloader虽然只是一段小程序,但也同样如此。当芯片复位后,系统产生复位中断,执行复位中断服务程序,复位中断的优先级最高,所以不需要考虑有谁可以打断它。当然,程序员就可以在复位中断里面打芯片的主意了。Bootloader升级应用程序的点子就是从这里出发的,它先把自己的Bootloader复制到ram区,再零填充.bss段,然后就让向量表的偏移从ram的起始地址开始算起,LM3Sxxxx是从0x20000000开始偏移,到此,开始在ram区里执行。 在ram区里执行时,会对升级信号进行检测,如检测到要升级信号,则开始配置要升级的接口,准备好了就升级应用程序。如果没有检测到升级信号则执行原有的用户应用程序。
八、Bootloader的结构
从结构上,Bootloader的各项功能之间有一定的关连性,某些功能是与硬件相关的,某些功能是软件的。芯片的启动代码是Bootloader必备的基础,不同处理器启动需要的设置是不同的。即使是相同的处理器,其内存空间的配置也是不一样的。因此,各个嵌入式系统的启动代码一般都是不相同的。
运行操作系统是Bootloader的主要功能,包括将操作系统加载到内存,开辟操作系统所需要的数据代码区域,然后跳转到操作系统的代码处运行。在嵌入式系统中,Bootloader运行操作系统和应用程序的过程不同。操作系统内核一般被编译成纯二进制代码,Bootloader运行操作系统内核主要是内存加载和跳转两个步骤;操作系统运行应用程序则复杂得多,需要进行程序头的解析。系统上电/复位基本硬件初始化准备RAM空间复制到RAM设置启动参数调理内核跳转检测系统内存映射由Flash读文件到RAM中设置堆栈所需硬件初始化阶段2入口结束转阶段2
根据Bootloader的功能,可以支持不同操作系统的引导。一般情况下,Bootloader在引导操作系统的时候,是运行纯二进制操作系统映像,本质是将其加载到内存、创建运行环境和跳转运行,附加的功能还包括传递一些参数。 对于这种引导模式,运行不同操作系统映像文件的差异不大。某些功能强大的Bootloader可以支持不同格式的操作系统映像的加载。在这种情况下,Bootloader对操作系统的加载过程类似于Bootloader运行一个应用程序。在一般Bootloader的功能框架中,人机交互的功能是系统的逻辑核心,它将Bootloader各部分的功能组织在一起,并向外部提供交互的接口,用户可以通过命令行控制Bootloader。人机交互功能本身是一个与具体硬件相关的功能但是它一般需要建立在目标机主机通信机制之上,如使用系统的串口。 Bootloader的通信功能主要完成目标机到主机的通信,通信模块主要依赖的硬件机制包括串口、网络、USB等。一般来说,串口可以实现目标机主机控制台的功能,实现人机交互的基础;而网络和USB的速度较快,可以实现较大的文件传输,它们通常建立在TCP/IP网络的协议之上。在通信功能中,通信层接口、网络协议等功能是和硬件无关的,而串口、网络USB等模块的驱动是与硬件有关的,需要不同的嵌入式系统根据自身的情况实现或者移植。 Flash相关的功能也是Bootloader常见的功能,这是由于嵌入式系统中Bootloader需要烧写自身系统,完成系统的更新。功能强大的Bootloader还可以支持Flash上的分区和文件系统的功能。
结语:总结与展望
随着计算机相关的科学技术不断发展,嵌入式系统的应用范围变得更广,功能也更强大和齐全。单个的电子设备,已经可以集成手机,数码相机,mp3随身听,计算机等众多的功能,Bootloader作为嵌入式系统中重要的一个组成部分,成为嵌入式系统一个专门的研究方向。 Bootloader是因嵌入式系统的蓬勃发展而应运而生的。一个嵌入式系统赋予Bootloader的职能是引导与加载内核镜像,但是为了给更多的开发者提供便利的开发手段,Bootloader越来越不局限于其基本功能,它不断地增加对硬件电路板具体功能模块的支持,甚至是支持一些简单的网络协议。现在的 Bootloader,更像是一个小系统。
这篇关于bootloader启动引导的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!