概述
常规来说嵌入式linux启动过程是这样的:内部BootROM --> BootLoader --> kernel --> rootfs,在这四部分中,BootROM是固化在芯片中的,后面三个流程分别对应linux三大件,而在STM32中,并无太大改变,仅是将bootloader分为了FSBL和SSBL两部分。
模块BootRom
这个模块是由厂商固化在芯片中的,用户是无法改变的。它的作用呢也很明确,它是上电后第一个运行的代码,任务是判断启动模式,据启动模式将存储器中bootloader的全部或部分代码搬运到片内sram中去,然后跳转执行。sram很小,一般无法将bootloader全部加载。
这个阶段中,所有的外设及外围模块都没有工作。
bootloader
顾名思义这段代码的作用是用引导系统启动的,它是芯片运行的由用户编写的第一块代码。在不同的芯片上会有所差异,但其根本作用是没有变的。bootloader负责初始化板子的基本外设和部分外围器件。它的主要功能有以下几项:
1、读取和校验启动设备上的引导加载程序,通常是FLASH设备。
2、初始化硬件,包括CPU、内存、硬盘、显卡等。
3、读取并加载内核文件到内存中去。
4、初始化操作系统的运行环境,包括设置内存管理、文件系统、网络、进程理管等。
5、启程操作系统的主程序,通常是操作系统的内核。
在这里ST官方把它分为了两部分,第一部分FSBL的作用主要为初始化CPU、内存,并校验后续程序的安全性;加载第二段引导程序;第二部分的SSBL采用的是uboot,它引导系统内核启动。
FSBL (First Stage Boot Loader)
FSBL是运行在内部ram中的,空间比较有限,所以在FSBL的代码里可以做的功能都比较少,它主要做引导加载SSBL所必须的工作。
这里FSBL段ST使用了TF-A(Arm Trusted Firmware,有些资料也叫ATF),TF-A会先初始化DDR等外设(时钟树、外部RAM控制器,就是DDR),然后把Uboot从Flash(NAND,NOR FLASH , SD, MMC等)拷贝到DDR中。启动uboot代码。
SSBL(Second Stage Boot Loader)
SSBL运行在DDR里面,不用担心空间不够的问题。所以,SSBL代码的功能就可以做的很全面。那么Linux内核的加载就灵活多了,比如从Flash设备上读取,比如从网络上读取。也就是说内核的更新可以在这里实现。SSBL一般使用uboot来做。