Bootloader的概念

Bootloader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。bootloader完成的主要功能是将可执行文件(一般是操作系统)搬移到内存中,然后将控制权交给这段可执行文件(操作哦系统)。

通常,Boot Loader是严重的依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的Boot Loader几乎是不可能的。尽管如此,我们仍然可以对Boot Loader归纳出一些通用的概念来,以指导用户特定的Boot Loader设计与实现。

Bootloader的工作模式

下载模式

对研发人员来说,Bootloader一般需要工作在这种模式下,特别是调试内核或者Bootloader本身的时候。
通过串口终端与Bootloader进行交互,可以操作系统硬件。比如通过网口或者串口下载内核,烧写Flash等等。

启动加载模式

嵌入式产品发布的时候,Bootloader必须工作在该模式下。
这种情况下,Bootloader必须完成硬件自检、配置,并从Flash中将内核拷贝到SDRAM中,并跳转到内核入口,实现自启动,而不需要人为的干预。

Bootloader的安装媒介

系统上电时或复位以后,都从芯片厂商预先安排的一个地址处取第一条指令执行。

由于上电或复位需要运行的第一段程序就是Bootloader,故必须把Bootloader放入该地址。将Bootloader写入固态存储设备,永久保存,系统上电后将自动执行Bootloader。

Bootloader的烧写

Bootloader可以配置系统。
没有Bootloader,系统就不能启动。
Bootloader可以实现自烧写。系统中还没有Bootloader的时候,可以从JTAG烧写。
典型的Flash存储空间分配:

  • boot loader
  • 启动参数
  • 内核
  • 根文件系统

嵌入式系统中常见的boot loader

  • Vivi
  • Blob
  • Redboot
  • U-Boot(armboot、ppcboot整合)

U-Boot简介

1999年由德国DENX软件工程中心的Wolfgang Denk发起,全称Universal Bootloader。
特点:

  • 支持多种硬件架构:包括ARM、X86、ppc、mips、m68k、NIOS、Blackfin
  • 支持多种操作系统:包括Linux、VxWorks、NETBSD、QNX、RTEMS、ARTOS、LynxOS
  • 支持多达216种以上的开发板
  • 开放源码、遵循GPL条款
  • 易于移植、调试

官方网站

U-Boot目录结构

  • board 目标板相关文件,主要包含硬件初始化、SDRAM初始化
  • common 独立于处理器体系结构的通用代码
  • cpu 与处理器相关的文件,包含cpu初始化、串口初始化、中断初始化等代码。
  • doc U-Boot的说明文档
  • drivers 设备驱动代码,如Flash驱动、网卡驱动、串口驱动等
  • fs U-Boot支持的文件系统的实现,如cramfs、fat、ext2、jffs2等
  • include U-Boot使用的头文件,包括不同硬件架构的头文件
  • lib_xxx 处理器相关文件,如我们要使用lib_arm,与arm体系结构相关的文件。
  • net 网络功能的上层文件,实现各种协议,如nfs、tftp、arp等

U-Boot启动流程

和大多数的Boot loader一样,U-Boot的启动分为两个阶段:

  • 阶段1:依赖于CPU体系结构的代码,主要用汇编来实现。
  • 阶段2:通常用C语言来实现,这样可以实现复杂的功能,而且具有更好的可读性和可移植性。

stage1

第一阶段的代码位于cpu/arm920/start.S中,依次完成以下功能:

  • 1.系统上电,进入svc模式
  • 2.关闭看门狗,禁止所有中断
  • 3.进行初级硬件初始化
  • 4.将自身代码拷贝到SDRAM中
  • 5.设置堆栈
  • 6.清空bss段
  • 7.跳转到C语言实现的stage2中

stage2

  • 1.初始化本阶段要使用到的硬件设备
  • 2.检测系统内存映射(memory map)
  • 3.将内核映像和根文件系统映像从Flash上读到RAM空间中。
  • 4.为内核设置启动参数
  • 5.调用内核

U-Boot的使用

1.printenv
打印环境变量
打印U-Boot的环境变量,包括串口波特率、ip地址、mac地址、内核启动参数、服务器ip地址等等。

2.setenv
设置环境变量
对环境变量的值进行设置,保存在SDRAM中,但不写入Flash。这样系统掉电
以后设置的环境变量就不存在了。

3.saveenv
保存环境变量
将环境变量写入Flash,永久保存。掉电以后不消失。

4.ping
测试网络命令
ping命令用于测试目标板的网络是否通畅
格式:ping + ip addr

5.tftp
通过tftp协议下载文件至SDRAM
将tftp服务器上的文件下载到指定的地址,速度快。
格式:tftp + 存放地址 + 文件名

6.loadb
通过串口下载二进制文件
在目标板不具备网路功能的时候,可以配合超级终端下载二进制文件至内存中。缺点是速度很慢。
格式:loadb + 存放地址

7.bootm
引导内核
先将内核下载到SDRAM中(通过tftp命令或者loadb命令),然后执行bootm命令引导内核。
格式:bootm + 内核地址

8.help或者?
查看U-Boot支持的命令及其作用。

文章内容整理自:
www.cie-eec.org 相关文档