1 BootRoom阶段
- 上电复位,CPU从Boot Room的固定地址读取指令开始执行;
- 初始化时钟、引脚、片上SRAM;
- 读取启动引脚,判断启动介质(SD/eMMC/SPI/NAND);
- 从启动介质中读取SPL(Secondary Program Loader)到片上SRAM
- 跳转到SPL入口
2 SPL阶段
- 再次初始化时钟,PLL,电源
- 初始化DDR
- 读取完成的U-Boot并加载到DDR;
- 跳转到DDR中的U-Boot入口
3 U-Boot阶段
3.1 汇编阶段
- 设置异常向量表
- 设置 CPU 模式SVC(超级管理员模式)
- 关中断、关 MMU、关 Cache
- 设置栈指针 SP
- 清零 BSS 段
- 调用 C 语言入口函数 board_init_f
3.2 board_init_f
- 初始化基础硬件:时钟、串口、DDR
- 初始化全局数据结构体 gd_t
- 准备重定位地址
- 跳转到 board_init_r
3.3 board_init_r
- 初始化各种外设:GPIO、I2C、SPI、MMC/eMMC/SD、Ethernet、USB、NAND、Flash 等
- 初始化命令系统
- 初始化环境变量
- 显示控制台提示符
- 进入 主循环:等待命令 或 自动启动内核
3.4 启动内核前准备
- 读取设备树 dtb
- 读取Linux内核镜像
- 设置启动参数 bootargs
- 调用 bootm/booti 启动内核