0. Bootloader
- 对于计算机系统而言,从开机上电到操作系统启动需要一个引导过程,这个引导过程由引导程序指定。 引导程序是系统加电启动运行的第一段软件代码。在 PC 体系结构中,引导程序由主板上的 BlOS(Basic Input Output System)程序 和位于硬盘 MBR (Master Boot Record)中的启动代码组成。系统上电后,首先运行 BlOS,在完成硬件检测和资源分配后,将硬盘 MBR 中的引导程序读到系统的 RAM 中,然后将控制权交给引导程序。引导程序的主要运行任务就是将内核映像从硬盘读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 嵌入式 Linux 系统同样离不开引导程序,这个引导程序一般我们叫作启动加载程序(Bootloader)。
- Bootloader 是在操作系统运行之前执行的一段小程序。通过这段小程序
- 可以初始化硬件设备
- 建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。
- 也就是说芯片上电以后先运行一段 bootloader 程序。这段 BootLoader程序会先初始化 DDR 等外设,然后将 Linux 内核从非易失存储器 flash (NAND, NOR FLASH, SD, MMC 等)拷贝到DDR 中,最后启动 Linux 内核。所以BootLoader肯定包括外置非易失性存储器及外挂DDR芯片的驱动程序。当然了, BootLoader的实际工作要复杂的多,但是它最主要的工作就是启动 Linux 内核。
- 对于嵌入式系统, bootloader 是基于特定硬件平台实现的。因此,几乎不可能为所有的嵌入式系统建立一个通用的 bootloader,不同的处理器架构都有不同的 bootloader。Bootloader 不仅依赖于 CPU 的体系结构,而且依赖于嵌入式系统板级设备的配置。对于两块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的 bootloader程序也能运行在另一块板子上,一般需要修改 bootloader 的源程序。 庆幸的是, 大部分bootloader 仍具有很多共性,某些bootloader 能够支持多种体系结构的嵌入式系统。
1. U-boot
- U-Boot 的全称是 Universal Boot Loader,是使用最为广泛的一个BootLoader,本质上是一个开源的逻辑程序。我们一般不会直接用uboot 官方的 U-Boot 源码的。 uboot 官方的 uboot 源码是给半导体厂商准备的,半导体厂商会下载 U-Boot 官方的 U-Boot 源码,然后将自家相应的芯片移植进去。比如赛灵思.
- 包括的功能:
- 包括SD卡或者QSPI等非易失存储设备的驱动程序
- I2C等接口驱动
- 文件系统,U-Boot 可以通过文件系统去操作读取文件的(FAT等)
- 网络相关协议(将内核镜像放在Ubuntu系统,通过U-Boot 将镜像网络下载到DDR中)
- Universal 体现在哪?
- 支持多种操作系统,除了Linux外还有VxWorks、安卓等
- 支持多种硬件平台,不只是支持ARM架构处理器,还支持ARC、microblaze等
2.U-Boot与FSBL
- U-Boot主要是启动Linux内核
- FSBL是开发板在上电后运行的第一段代码,作用是去引导启动用户的逻辑程序。
- 固化QSPI时,需要做一个BOOT.BIN(FSBL、用户逻辑程序、比特流文件)
- 首先将用户逻辑程序从BOOT.BIN这个组合文件中提取并搬运到DDR中,再启动之
- 因此FSBL必须有SD卡或QSPI等设备的驱动程序、要能初始化DDR
- 对于基于 ZYNQ 的嵌入式Linux系统而言BOOT.BIN=FSBL+U-boot(除了boot相关代码外还包括用户SDK裸机代码)+bitstream,在引导过程中, 先运行 FSBL 来设置 PS,然后运行 U-Boot 用于加载 Linux 内核映像并引导Linux(启动内核)。所以 U-Boot 是第二阶段引导程序, FSBL 是第一阶段引导程序。