SPL 阶段
Artinchip 平台上的 SPL(Secondary Program Loader) 是第一级引导程序(FSBL, First Stage Boot Loader), 同时也是第二级程序加载器。
BROM -> SPL -> U-Boot -> Kernel
SPL 运行在 SRAM 中,其最重要的任务有两个:
- 完成 DDR,并且使能 Cache
- 加载和验证 U-Boot
在一些启动速度优化的方案中,也可以直接从 SPL 启动 Kernel。 本章节描述不同启动介质的 SPL 处理流程,以及安全启动的相关处理。
1. RISCV SPL
SPL BSS 的配置
CONFIG_SPL_TEXT_BASE=0x103100
CONFIG_SPL_SIZE_LIMIT=0x10000
#define CONFIG_SPL_MAX_SIZE (CONFIG_SPL_SIZE_LIMIT)
#define CONFIG_SPL_STACK (D211_SRAM_BASE + D211_SRAM_SIZE)
#define CONFIG_SPL_BSS_START_ADDR (CONFIG_SPL_TEXT_BASE + CONFIG_SPL_MAX_SIZE)
#define CONFIG_SPL_BSS_MAX_SIZE 0x00002000 /* 8 KiB */
即 BSS 从 0x113100 开始,后续还有 SPL STACK 的空间,HEAP 的空间。
对于 spl.aic 文件,在 spl.bin 的后面还存放着其他的资源数据,如果该数据需要在 SPL 阶段使用, 则需要注意,在 SPL 运行时,资源数据的区域与 BSS 区域不能重合,不然会有数据错误。
2. 启动流程
理解spl的启动流程,关键是设备树,设备驱动模型。关于设备树,请查看设备树相关章节,设备驱动模型的介绍如下:
2.1. uboot 设备驱动框架模型
> uclass <–> uclass_driver <–> udevice <–> driver <–> hardware
uclass表示管理某一个类别下的所有device;
uclass_driver表示对应uclass的ops集合。