【摘要】本节介绍了bootloader 的基本概念。首先分析了为什么要针对特定的CPU 和开发板移植bootloader 的必要性。然后介绍了两种如何在裸板中烧写bootloader 的方法以及如何确定烧写地址。其次介绍了产品发布的启动加载模式和开发使用的下载模式(更新内核文件系统及bootloader 自身).最后介绍了bootloader 的两个通用启动阶段的流程及代码特性和运行位置。
【关键词】bootloader ,烧写,复位地址,固化loader ,启动加载,stage1 ,位置无关
一 bootloader 介绍
1.1 Bootloader 移植的必要性
Bootloader 是与系统硬件环境高度相关的初始化软件,它担负着 初始化硬件和引导操作系统 的双重责任。一些 ARM 平台可以共用同一种Bootloader ,但是总的说来,每一个特定系统的Bootloader 都会有所不同。Bootloader 广 泛用于有操作系统的手持终端设备、智能家电及机顶盒等嵌入式设备上,它负责完成硬件初始化、操作系统引导和系统配制等。Bootloader 移植 是在特定硬件平台上操作系统移植至关重要的一步。
1.2 BootLoader 所支持的CPU 和嵌入式系统板
每种不同的CPU 体系结构都有不同的BootLoader 。 有些BootLoader 也支持多种体系结构的CPU , 比如 U-BOOT 就同时 支持 ARM 、 MIPS 、 POWERPC 等体系结构 。除了依赖于CPU 的体系结构外,BootLoader 实际上也依赖于 具体的嵌入式板级设备的配置 。也就是说,对于两块 不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的BootLoader 程 序也能运行在另一块板子上,通常也都需要修改BootLoader 的源程序。
1.3. Boot Loader 的烧录和存储
系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。 比如,at91rm9200 的CPU 在复位时通常都从 地址0x00000000 取它的第一条指令。而MPC8260 高端启动则时从0xfff00000 开始取指。 这个地址依据特定的 CPU 而定 。 通常片外启动时, 基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备 ( EEPROM 或 FLASH 等, at91rm9200 是 0x10000000 ) 被映射到这个预先安排的地 址上。因此在系统加电后,CPU 将首先执行Boot Loader 程序。
那么bootloader 最初是怎么烧写到flash 中的呢?对于 一个裸板怎么让它跑起来呢? 有两种方式:
1, 通过片内固化的 loader 加载 bootloader : 通常某些CPU 内部 ROM 中固化 了一段程序可以用于最初的程序下载,如AT91RM9200 。 这时下载的程序是在内部RAM 中运行的,大小有一定限制,然后由这段程序继续交互下载真正要烧写到flash 中的程序,将其 保存在外部RAM 中,最终烧写到flash 中。
2 , 通过 JTAG 或者仿真器下载: 通常这些烧录工具可以直接操作flash ,对其进行编程烧录。需要专门的工 具。这种情况多用于那些没有固化loader 的CPU ,如三星系列。
上图是一个同时装有Boot Loader 、 内核的启动参数 、内核映像和根文件系统映像的固态 存储设备的典型空间分配结构图。 上述顺序是可变的,但 bootloader 首地址一定要在 CPU 复位取指的地 址上。
1.4 Boot Loader 的操作模式(Operation Mode)
主机和目标机之间一般 通过串口建立连接 , BootLoader 软件在执行时通常会通过串口来进行数据传输,如输出打印信息到串口,从串口读取用户控制字符。
大多数Boot Loader 都包含 两种不同的操作模式:启动加载模式和下载模式 ,这 种区别仅对于开发人员才有意义。从最终用户的角度看, BootLoader 的作 用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
1, 启动加载 (Boot loading) 模式:这种模式也称为自主模式 bootstrap 。也即 Boot Loader 将存储在目标板 Flash 中的内核和文件系统的镜像装载到 SDRAM 中,整个过程无需用户的介入。这种模式是 BootLoader 的正常工作模式, 因此在嵌入式产品发布的时候, BootLoader 显然必须工作在这种模式下 。
2, 下载 Downloading 模式:在这种模式下,目标机上的 BootLoader 将通过 串口连接或网络连接等通信手段从宿主机 Host 下载文件 ,比如 下载内核映像和根文件系统映像等。从主机下载的文件通常首先被BootLoader 保存到目标机的 RAM 中,然后再 被 BootLoader 写到目标机上的 FLASH 类固态存储设备中 。BootLoader 的 这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新(bootloader 自身也可以这样更新)也会使用Boot Loader 的这种工作模式。工作 于这种模式下的BootLoader 通常都会向它的终端用户提供一些简单的命令行接口。
像U-BOOT 等这样功能强大的BootLoader 通 常同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。比如,U-BOOT 在启动时处于正常的启动加载模式,但是它 会延时几秒 ( 在配置文件中可以 设定 ) 等待终端用户按下任意键而将其切换到下载模式(相当于 bios 下按 del 键可进入系统配置界面一样,设置从光盘启动可进行重装) ,如果在给定时间内没有用户按键,则U-BOOT 继续启动, 进行正常的启动加载。
1.5 Bootloader 与主机之间进行文件传输所用的通信设备及协议
最常见的情况就是,目标机上的BootLoader 通 过串口与主机之间进行文件传输,传输协议通常是 kermit / xmodem / ymodem 协议中的一种。但是,串口传输的速度是有限的,因此如果该Bootloader 对目 标板的网卡支持良好,还可以通过以太网连接并借助 TFTP (Trivial File Transfer Protocol) 协议来下载文件是个更好的选择 。此时,主机方所用的软件也要考虑,比如,在通过以太 网连接和TFTP 协议来下载文件时,主机方必须有一个软件用来提供TFTP 服务,如Windows 平台上的tftpd.exe 等或Linux 下面的tftp 服务器。
1.6 Bootloader 的通用执行流程
从操作系统的角度看,Bootloader 的总 目标就是正确地调用内核来执行。另外,由于Bootloader 的实现依赖于 CPU 的体系结构,因此大多数Bootloader 都分为 stagel 和 stage2 两大部分 。依赖于CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stagel 中,而且通常都用汇编语言来实现 ,以达到短小精悍和高效的目的。而 stage2 则通 常用 C 语言 来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。
Bootloader 的stagel 为 位置无关代码,通常在 FLASH 中运行。 所有的指令为相对寻址,可以在任何位置运行。 通常包括以下步骤( 以执行的先后顺序) :
Ø 硬件设备初始化(配置 SDRAM 存储控制器及 IO ),中断初始化;
Ø 为加载 Bootloader 的 stage2 准备 RAM 空间(这个地址由链接脚本指定,为运行域地址,通常为 RAM 的高端地址),测试内存空间是否有效;
Ø 拷贝 Bootloader 的 stage2 到 RAM 空间中;
Ø 设置好堆栈;
Ø 跳转到 stage2 的C 入口点。
Bootloader 的stage2 通常被 拷贝到 RAM 中运行,这样 可以提高运行速度 。通常包 括以下步骤( 以执行的先后顺序) :
Ø 初始化本阶段要使用到的硬件设备;
Ø 检测系统内存映射 (memory map) ;
Ø 没有用户干预时将 kernel 映像和根文件系统映像从 flash 读到 RAM 空间中;
Ø 为内核设置启动参数;
Ø 调用内核。
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/sailor_8318/archive/2008/08/04/2768049.aspx
本文详细介绍了Bootloader的基本概念、移植必要性、支持的CPU和嵌入式系统板、烧录存储方法、操作模式以及与主机的通信设备和协议。重点讨论了Bootloader的启动加载和下载模式,以及其通用执行流程,包括Stage1和Stage2的职责。
4350

被折叠的 条评论
为什么被折叠?



