文章目录
- 一、u-boot概念
- (一)概念
- (二)获取u-boot源码
- 1.从u-boot官网获取
- 2. 从 STM官网
- 3. 开发板厂商获取
- (三)分析u-boot源码
- 1. u-boot源码的目录结构
- 2. 获取make的帮助信息
- 3. 分析README文件
- (四)安全启动流程和非安全启动流程的区别
- 1. Flash分区信息
- 2. linux系统的启动流程
- 3. 安全启动流程
- 4. 非安全启动流程
一、u-boot概念
(一)概念
BootLoader:引导程序的统称,u-boot属于BootLoader中的一种。
u-boot:通用的引导程序
u-boot是一个开源的引导程序
u-boot支持多种不同的架构平台
u-boot支持多种不同芯片厂商的处理器
u-boot在启动过程中会完成部分必要硬件的初始化操作,比如串口,网卡,内存等
u-boot本质就是一个相对复杂的裸机程序
u-boot一旦完成内核的引导加载启动之后,u-boot就结束了。
- 补充:
开发板:FSMP1A
处理器(SOC/MPU):STM32MP157AAA
内核:ARM Cortex-A7核
架构:ARM-v7架构 - 芯片厂商每生产一款处理器之后,都需要将这款处理器的适配的代码添加到u-boot源码和linux内核源码中。
- 芯片厂商每生成一款芯片都会基于这块芯片设计出对应的参考板(公板),芯片使用的厂商,根据公板进行硬件的裁剪,设计出适合自己公司产品的硬件。软件工程师再根据硬件的不同,进行软件的裁剪,让软件适配自己的开发板即可。
(二)获取u-boot源码
1.从u-boot官网获取
u-boot官网网址:https://ftp.denx.de/pub/u-boot/
u-boot版本的命名方式:
u-boot-2021.07-rcX.tar.bz2 | | | | |---> 压缩格式| | | |---> 带rc:测试版 不带rc:稳定版| | |---> 月份| |---> 年份|---> u-boot名字
2. 从 STM官网
wiki网址:
https://wiki.stmicroelectronics.cn/stm32mpu/wiki/STM32MP1_Developer_Package
https://www.st.com/en/embedded-software/stm32mp1dev.html#get-software
从ST的官方下载的源码,一定已经支持了对应的STM32mp157a。
3. 开发板厂商获取
开发板厂商提供的u-boot源码一定已经支持你所购买的开发板
(三)分析u-boot源码
1. u-boot源码的目录结构
目录:分类管理文件的,每个目录的名字都有其特定的含义。
api —> api接口
arch —> 架构相关的代码(需要关注,但是不需要修改)
board —> 板子相关的代码(需要关注,但是不需要修改)
cmd —> u-boot命令相关的代码
common —> 微架构依赖代码
configs —> 板子的默认配置文件(需要关闭,需要修改)
disk —> flash相关代码
doc —> 文档
drivers —> 驱动代码(需要关注,需要修改)
dts —> 设备树文件(需要关注)
env —> 环境相关代码
examples —> 案例代码
fs —> 文件系统相关代码
include —> 头文件
Kconfig —> 配置文件(需要关注)
lib —> 库
Makefile —> 配置和编译u-boot源码(需要关注)
net —> 网络相关代码
post —> 电源相关代码
README —> 帮助文件
scripts —> 脚本文件
test —> 测试代码
tools —> 工具命令
2. 获取make的帮助信息
- 补 :Makefile文件中的规则构成:
目标:依赖(tab键)命令
- make 目标 : 默认找目标对应的规则,解析依赖关系是否成立,如果成立则执行对应的命令,
如果不成立,则继续解析其它的规则,直到依赖关系成立。
清除目标:
make clean
make mrproper
make distclean
配置目标:
make menuconfig —> 基于菜单选项的图形化界面配置
编译目标:
make -j4 all —> -j4 :4个线程编译
3. 分析README文件
所有支持的板子都有一个默认的配置文件,
执行make <board_name>_defconfig
进行配置
打开arch/…/configs/目录,查找符合stm32mp157a芯片的配置文件名
stm32mp15_basic_defconfig —> 非安全启动对应的板子默认配置文件
stm32mp15_trusted_defconfig —> 安全启动对应的板子的默认配置文件
(四)安全启动流程和非安全启动流程的区别
1. Flash分区信息
2. linux系统的启动流程
- 注:
- TF-A提供了一组安全和可信任的软件组件,用于引导和初始化系统。
- SPL,全称为Second Program Loader,它的主要功能是负责装载操作系统到RAM中,并提供了一些系统命令。
首先,从系统上电开始,芯片内部的ROM会执行一段固化代码(ROM Code),这通常是由芯片厂商在出厂时预置的,主要用于进行基本的时钟树初始化,确保系统能够进入下一个启动阶段。这一阶段被称为First Stage,由于它完全依赖于芯片内部的资源,因此通常受到严格的内存限制(如小于128kB)。
接下来,系统进入Second Stage,也就是从启动设备(如存储器或串口)加载第一级启动加载程序(FSBL)。FSBL的主要任务是完成更复杂的初始化工作,如初始化外部RAM(如DDR、LpDDR)控制器,为后续的启动过程准备足够的内存资源。由于这一阶段的代码量相对较大,因此通常需要从外部存储设备加载,但仍然受到内存大小的限制(如小于256kB)。
在FSBL之后,系统通常会加载Boot Loader,如u-boot或TF-A(Trusted Firmware-A)的SPL(Second Program Loader)部分。Boot Loader负责显示开机画面(boot loader splash screen),并从存储器或以太网等启动设备加载Linux内核镜像(image)以及设备树(device tree)等必要信息。这些信息是Linux内核启动和初始化所必需的。
随着Linux内核的加载和初始化(包括平台驱动等的加载),系统进入Linux user space阶段。在这一阶段,Linux内核会挂载根文件系统(rootfs),并加载用户空间初始化进程(如/sbin/init),这是用户空间服务和应用程序得以运行的基础。
最后,随着用户空间初始化进程的启动,Linux系统完成启动过程,进入稳定运行状态。整个启动过程是一个多级流程,每个步骤都依赖于前一个步骤的结果,且每个步骤都有其特定的功能和任务。通过这一流程,Linux系统能够安全、可靠地从启动设备加载并运行。通过这一流程,Linux系统能够安全、可靠地从启动设备加载并运行。
- 注:secure Monitor,即安全监视器,是ARM架构中的一个关键组件,Secure Monitor是一个运行在高特权级别的软件组件,它负责在系统的安全世界(Secure World)和正常世界(Non-secure World,或称Normal World)之间提供切换和交互的接口