Bootloader概述:
Bootloader,启动引导程序,又叫引导加载程序。功能强大的Bootloader也就直接叫做板级支持包(SBP)或者固件,
也有些直接将Bootloader叫做BIOS。BIOS是PC机的"基本输入输出系统",烧录在电脑主板上一块专门的芯片中。
一般BIOS由主板厂商或者专门的BIOS生产商提供,不是开源的,用户不能修改其中的代码进行定制。
而嵌入式系统的开发则离不开Bootloader的开发,它也是整个系统开发中的难点之一。
Bootloader的作用:
Bootloader是在嵌入式操作系统内核运行之前的一段小程序,可以初始化硬件设备,建立内存空间,
从而将系统的软硬件设置到一个合适的状态,以便最终为调用操作系统内核准备好正确的环境。
Bootloader是依赖于底层硬件而实现的,因此建立一个通用的嵌入式系统Bootloader几乎是不可能的。
在嵌入式系统中,Bootloader对嵌入式设备中的主要部件如CPU,SDRAM,FLASH,串口等进行了初始化,
这样可以使用Bootloader通过串口下载各种文件到设备的SDRAM中或者烧录Flash,然后将操作系统内核读入到内存中来
或者直接跳转到内核的入口点,从而实现操作系统的引导。
现有的Bootloader通常也把对以太网的支持等功能也加入进去了,这样一个功能强大的Bootloader实际
上就已经相当于一个微型的操作系统了。
Bootloader从第一条指令跳转后,就开始初始化各种最重要的硬件,比如CPU的工作频率,定时器,中断,看门狗,
检测RAM大小和Flash等。一般硬件初始化的这段程序使用汇编语言编写的,其后就用C语言编写。
总体上Bootloader主要完成以下工作:
:初始化CPU速度。
:初始化内存,包括启用内存库,初始化内存配置寄存器等。
:初始化中断控制器,在系统启动时,关闭中断,关闭看门狗。
:初始化串行端口。
:启用指令数据高速缓存
:设置堆栈指针
:设置参数区域并构造参数结构和标记,即引导参数。
:执行PTOS(上电自检);来标志存在的设备并报告有何问题。
:为电源管理提供挂起/恢复支持
:传输操作系统内核镜像文件到目标机。
:跳转到内核的开始,在此又分为ROM启动和RAM启动。
所谓的ROM启动就是用XIP技术直接在Flash中执行操作系统镜像文件。
所谓RAM启动就是把内核镜像从Flash复制到RAM中,然后再将PC指针跳转到RAM中的操作系统启动地址。
嵌入式系统的开发中,一般将软件分为启动引导程序,操作系统内核,根文件系统,
图形窗口系统和应用程序等几个部分,其中前三部分是一个可运行的嵌入式系统必不可少的,他们在开发的过程中,
被分别独立地编译链接或者打包为一个二进制目标文件,然后下载烧录到嵌入式系统的ROM中。后两部分如果有的话,
通常也是和根文件系统一起打包后烧录到Flash中,因此,在Bootloader阶段,
也提供了对Flash设备的分区格式化的支持,其空间分配通常如图所示
|File System| |OS Kernel| |Boot parameter| |Bootloader|
Bootloader的工作模式:
对于嵌入式系统的开发人员而言,Bootloader通常包含“启动加载”和"下载"这两种不同的工作模式。
启动加载模式--正常启动模式
下载模式--提供给开发人员或者技术支持人员使用
Bootloader的启动流程:
分为两个阶段:
一般依赖于CPU体系结构的代码,比如设备初始化代码等,都放在第一阶段中,而且通常都是用汇编语言来实现,
已达到短小精悍且启动快的目的。
而第二部分则通常通过C语言来实现,这样可以实现各种复杂的功能比如串口,以太网接口的支持等。
第一阶段:
1:硬件设备的初始化
2:为加载Bootloader的第二阶段代码准备RAM空间
3:拷贝Bootloader的第二阶段代码到RAM空间中
4:设置好堆栈
5:跳转到第二阶段的C入口点main()函数处
第二阶段:
1:初始化本阶段要使用到的硬件设备
2:检测系统内存映射
3:将kernel映像和根文件系统映像从flash上读到RAM空间中
4:为内核设置启动参数
5:调用内核
U-BOOT介绍:
特点:
开放源代码
支持多种嵌入式操作系统如Linux,NetBSD,VxWorks,RTEMS等
支持多个处理器系列,例如ARM,PowerPC,x86,MIPS等。
较高的可靠性和稳定性
高度灵活的功能设置,适合U-Boot调试,操作系统不同引导要求,产品发布等。
丰富的设备驱动源码,如串口,以太网,SDRAM,FLASH,LCD等
较为强大的开发调试文档和强大的网络技术支持
U-boot文件结构:
U-boot代码采用了一种高度模块化的编程方式,与移植树有关的有以下几个目录
board:这个目录存放了所有U-boot支持的目标板的子目录。比如board/smdk2410/*就是我们所关心的。要将
U-boot移植到自己的目标板上 如s3c241x,就要参考这个目录下的内容,
比如对Falsh宽度和大小的定制就要修改其中的flash.c
common:独立于处理器体系结构的通用代码,如内存大小探测与故障检测。
CPU:与处理器相关的文件
driver:通用设备驱动。
fs:存放了U-boot支持的文件系统
Include:U-boot头文件,这个目录存放头文件的公共目录,
其中include/configs/smdk2410.h定义了所有和s3c241x相关的资源的配置参数,
我们往往只需修改这个文件就可以配置目标板的参数,如波特率,引导参数,物理内存映射等。
lib_xxx:处理器体系相关的文件.
lib_arm:目录分别包含于PowerPC,arm体系相关的文件。
net:与网络功能相关的文件目录,如bootp,nfs,tftp
post:上电自检文件目录。
tools:用于创建U-boot S-RECORD和BIN镜像文件的工具。
WinCE中Bootloader:
Nboot和Eboot是WinCE中使用的Bootloader,Nboot是nand flash bootloader的简写,CPU可以直接从nand flash启动,
但是其代码大小不能超过4K,功能有限。
Eboot则支持ethernet network(以太网),功能强大,用于Ehternet在线调试和下载。
Blob:
Blob是bootloader object的缩写,是一款功能强大的Bootloader,目前常用于Intel推出的Xscale结构的CPU的引导。
Blob的代码也可以分为两个阶段。第一阶段从start.s文件开始,这也是开机执行的第一段代码。
这部分代码是在flash中运行,
主要功能包括对处理器的一些寄存器的初始化和将Blob第二段代码从Flash拷贝到SDRAM中。
这一段的代码被编译后最大不能超过1KB,第二段的起始文件为trampoline.s,被复制到SDRAM后,
就从第一阶段跳到这个文件开始执行,先进行一些变量设置,堆栈的初始化等工作后,跳转到main.c进入C函数。
第二阶段最大为63KB
阅读(6412) | 评论(3) | 转发(7) |