嵌入式软件工程师听说过 u-boot 和 bootloader,但很多工程师依然不知道他们到底是啥。
今天就来简单讲讲 u-boot 和 bootloader 的内容以及区别。

一、Bootloader

比 Bootloader 从字面上来看就是启动加载的意思。用过电脑的都知道,windows 开机时会首先加载 bios,然后是系统内核,最后启动完毕。那么 bootloader 就相当于手机的 bios,它在手机启动的时候根据基带初始化硬件,然后引导系统内核,直到系统启动。

Bootloader 是嵌入式系统在加电后执行的第一段代码,通过这段小程序进行硬件初始化,获取内存大小信息等,调整手机到适配状态。在它完成 CPU 和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行 。

对于嵌入式系统,Bootloader 是基于特定硬件平台来实现的。因此,几乎不可能为所有的嵌入式系统建立一个通用的 Bootloader,不同的处理器架构都有不同的 Bootloader。Bootloader 不但依赖于 CPU 的体系结构,而且依赖于嵌入式系统板级设备的配置。对于 2 块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的 Bootloader 程序也能运行在另一块板子上,一般也都需要修改 Bootloader 的源程序 。

反过来,大部分 Bootloader 仍然具有很多共性,某些 Bootloader 也能够支持多种体系结构的嵌入式系统。例如,U-Boot 就同时支持 PowerPC、ARM、MIPS 和 X86 等体系结构,支持的板子有上百种。通常,它们都能够自动从存储介质上启动,都能够引导操作系统启动,并且大部分都可以支持串口和以太网接口。

二、Uboot

1、硬件管理

uboot 要能够进行 Soc 级(Soc 内部外设)和板级(Soc 外部外设)硬件管理。

uboot 中实现了一部分硬件的控制能力(uboot 中初始化了一部分硬件),因为 uboot 为了完成一些任务必须让这些硬件工作。譬如 uboot 要实现刷机必须能驱动 iNand,譬如 uboot 要在刷机时 LCD 上显示进度条就必须能驱动 LCD,譬如 uboot 能够通过串口提供操作界面就必须驱动串口。譬如 uboot 要实现网络功能就必须驱动网卡芯片。

2、能够完成镜像烧录(刷机)

uboot 要能够被借助完成刷机操作。参考下 SD 卡刷机的步骤:

(1)烧录uboot到SD卡中

有 2 种烧写方法:一种是在 windows 中用刷卡工具去制作启动 SD 卡;另一种是在 linux 中用 dd 命令。制作完 SD 后将 SD 卡插入开发板,然后开机就可以进入 uboot 界面。

(2)使用 uboot 的 fastboot 命令

借助 PC 中的 fastboot 软件完成包括 uboot、kernel、rootfs 等的镜像的烧录。

从上面就可以看出,刷机依靠的是 uboot 得 fastboot 命令,将镜像写到相应的 FLASH 中。

3、uboot的“生命周期”

uboot 的入口就是开机自动启动,uboot 的唯一出口就是启动内核。uboot 还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到 uboot 的命令行继续执行 uboot 命令,而启动内核命令一旦执行就回不来了。

4、uboot要提供命令式shell界面

shell 是用户操作接口的意思。shell 有命令行的 shell,如 windows 下的 cmd,如 linux 下的终端;也有 GUI 式的 shell,比如常用的 windows 下的各种界面。shell 是一种封装后流出来的接口,uboot 也要有这样的一个接口。

shell 的原理是:由消息接收、解析、执行构成的一个死循环。

uboot 的 shell 使用的也是行缓冲的模式。也就是以回车键(换行键)作为一个命令输入的结束。对应的其他缓冲模式还有无缓冲和全缓冲:无缓冲就是输入一个字符就当作一个命令处理;全缓冲就是无论输入什么都缓冲起来知道缓冲区满了才做一次处理。

三、bootloader 与 uboot的区别

BootLoader 是指嵌入式设备中用来启动操作系统内核的一段程序。
uboot(universal bootloader)是一种可以用于多种嵌入式 CPU 得 BootLoader 程序,换言之,uboot 是 bootloader 的一个子集。
uboot 的核心作用就是启动操作系统内核,uboot 的本质就是一段裸机程序。

参考资料