1、flash内存映射
大小 | 名称 | 描述 |
---|---|---|
- | userfs | 包括用户数据以及STM32实例应用 |
930MB | rootfs | Linux根文件系统,包括所有用户空间的程序(可执行文件, 软件库, …) 以及内核模块 |
16MB | vendorfs | 存放第三方专有二进制文件 |
64MB | bootfs | 启动logo、linux内核、linux内核设备树、extlinux.conf配置文件(可选) 、初始RAM文件系统。该文件系统可以被复制到外部DDR,在还没有挂装大的根文件系统供linux使用 |
2MB | ssbl | 存放第二级启动加载器Second Stage Boot Loader (SSBL)。这里是UBoot, 包括附在文件尾的设备树文件(dtb) |
256KB~512KB | fsbl | 存放第一级启动加载器First Stage Boot Loader。可以是ARM Trusted Firmware (TF-A) 或者U-Boot Secondary Program Loader (SPL)包括文件尾的设备树文件(dtb)。注意: 由于ROM代码的RAM要求, FSBL大小限制在247KB。 |
可选分区
大小 | 名称 | 描述 |
---|---|---|
256KB~512KB | teeh | OP-TEE header |
256KB~512KB | teed | OP-TEE pageable code and data |
256KB~512KB | teex | OP-TEE pager |
2、启动流程
标准Linux启动过程
注:BootROM主要是指与系统启动相关的代码,而romcode是一个更广泛的术语,可以包括BootROM在内的任何存储在ROM中的代码
SPL处于FSBL之前
STM32MP157启动流程
STM32MP157非安全模式启动流程
STM32MP157安全模式启动流程
3、ROM Code
ROM Code是固件在STM32MP157内部的一段程序,是在复位后执行的第一段程序,复位后STM32MP157内部的两个A核执行相同的程序,由于ROM Code中进行了判断,所以ROM Code只在Core0上运行
ROM Code的特性主要包括:
- Serial boot(从串行链路启动)
- FLash memory boot(从多种存储器安全启动)
- Engineering boot
- Secondary core boot
- RMA boot
- Wake up from low power modes
- Exported secure services
- Secure Secrets Provisioning
ROM Code支持的启动流程图如下:
STM32MP157是判断是否在第一个核上运行、是否启动M核、是否RMA、是否ENGI,这些对我们来说都不太重要,默认它一路绿灯就好了,重点要关注红框中的冷启动部分
- 选择启动介质
- 从启动介质加载 FSBL 镜像
- 校验 FSBL 镜像
- 校验通过,则跳转到 FSBL 镜像入口执行
4、TF-A
ROM code 加载TF-A 可执行文件并跳转到BL2
BL2 准备BL32运行时环境
BL2 加载BL33程序
BL2 跳转到BL32
BL32 跳转到BL33
BL1是执行的第一个阶段,并被设计作为ROM代码;它在内部RAM中加载和执行。TF-A中的BL1在STM32MP1系统中没有被使用。因为STM32MP1在片内的ROM中有自己的专有ROM代码,所以可以删除这一部分,然后BL2是要执行的第一个TF-A二进制文件,BL2(受信任的引导固件)负责加载下一阶段的映像(安全和非安全)。为了实现此作用,BL2必须初始化所有必要的外围设备。
5、uboot
U-Boot是用于STM32 MPU平台的引导链的第二阶段引导加载程序(SSBL)。
它具有简单的命令行界面(CLI),允许用户通过串行端口控制台进行交互。
它提供脚本功能
加载linux内核并执行
初始化外部设备:例如:USB、eMMC、网卡