arm官方推荐的armv8的启动层次结构
官方将启动分为了BL1,BL2,BL31,BL32,BL33阶段,根据顺序,芯片启动后首先执行BL1阶段代码,接着验签启动BL2,BL2根据具体设计启动BL31或者BL33,BL32只有在有BL31时才可能会存在并被验签加载启动。
上图中的BL1,BL2,BL31,BL32,BL33分别对应如下功能:
BL1:是一切信任的根,一般就是固化在ROM中的一段启动加载代码,用于引导bl2,并对bl2进行验签保证可信任执行;
BL2:一般是在flash中的一段可信安全启动代码,它的可信建立在bl1对它的验证,主要完成一些平台相关的初始化,比如对ddr的初始化等,并在完成初始化后寻找BL31或者BL33进行执行;如果找到了BL31则不会继续调用BL33,如果没有BL31则BL33必须有;BL31:BL31不像BL1和BL2是一次性运行的,它作为最后一道可信任固件存在,在系统运行时通过smc指令陷入EL3调用系统安全服务或者在Secure World和Non-Secure World之间进行切换;在完成BL31初始化后会去寻找BL32或者BL33进行验签后加载执行;BL32:OPTee OS + 安全app,它是一个可信安全的OS运行在EL1并在EL0启动可信任APP(上述的指纹验证等app),并在Trust OS运行完成后通过smc指令返回BL31,BL31切换到Non-Seucre World继续执行BL33;BL33:非安全固件,也就是我们常见的UEFI firmware或者u-boot也可能是直接启动Linux kernel;启动BL1,BL2,BL31,BL32则是一个完整的ATF信任链建立流程(ARM Trusted Firmware),像常见的PSCI(Power State Coordination Interface)功能则是在ATF的BL31上实现;
ARM下启动流程框图
u-boot源码结构
我们可以将 U-Boot 的启动过程划分为两个阶段:芯片初始化 和 板级初始化。芯片初始化阶段的代码主要是位于 ./arch/架构/cpu 目录下。
这里只对一些常用的目录进行说明:
arch:各种架构的启动初始化流程代码,链接脚本等均在此目录对应的架构中存放;
board:包含了大部分厂商的board初始化代码,基本平台化相关的代码都在对应的board目录中
早期的一些board代码在arch/xxx/xxx-mach中,现在基本不会放在arch目录下面了;
cmd:包含了大量实用的u-boot命令的实现,比如md,cp,cmp,tftp,fastboot,ext4load等命令的实现,我们也可以在此处添加自己实现的命令;
common:包含了u-boot的核心初始化代码,包括board_f,board_r,spl等一系列代码;
configs:包含了所有board的配置文件,可直接使用;
drivers:大量驱动代码的存放处;
dts:编译生成dtb,内嵌dtb到u-boot的编译规则定义目录;
env:环境变量功能实现代码;
fs:文件系统读写功能的实现,里面包含了各类文件系统的实现;
include:所有公用头文件的存放路径;
lib:大量通用功能实现,提供给各个模块使用;
net:网络相关功能的实现;
scripts:编译,配置文件的脚本文件存放处;
tools:测试和实用工具的实现,比如mkimage的实现代码在此处
使用的芯片初始化使用的具体代码就是 ./arch/arm/cpu/armv7m 下的各代码
.\arch\arm\cpu 目录下的 u-boot.lds 文件了(对于 SPL/TPL 对应的就是 .\arch\arm\cpu\u-boot-spl.lds 文件)。.lds 是连接脚本文件,它描述了如何生成最终的二进制文件,其中就包含程序入口。
u-boot驱动模型
驱动模型对设备驱动相关操作做了一个抽象:使用uclass来描述设备类,使用driver来描述驱动,使用udevice来描述设备。
u-boot内存布局
1 ***.h (include\configs)
#define CONFIG_NR_DRAM_BANKS1
#define CONFIG_SYS_SDRAM_BASE0x80000000
/*#define CONFIG_SYS_SDRAM_SIZE0x80000000UL /* SDRAM MAX SIZE 2GB for Uboot */
/*#define CONFIG_SYS_SDRAM_SIZE0x3fc00000UL /* SDRAM MAX SIZE 1020MB for Uboot */
#define CONFIG_SYS_SDRAM_SIZE0x3f000000UL /* SDRAM MAX SIZE 1020MB for Uboot */
#define CONFIG_SYS_LOAD_ADDR(CONFIG_SYS_SDRAM_BASE + \
16 * 1024 * 1024)
#define CONFIG_BSP_LOGBUF_BASE (CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_SDRAM_SIZE + 0x200000)
#define CONFIG_BSP_LOGBUF_HEAD (0x40)
#define CONFIG_BSP_LOGBUF_START (CONFIG_BSP_LOGBUF_BASE + CONFIG_BSP_LOGBUF_HEAD) /**/
/*#define CONFIG_BSP_LOGBUF_SIZE (0x80000 - CONFIG_BSP_LOGBUF_HEAD) /* (with head)logbuf size:512KB */
#define CONFIG_BSP_LOGBUF_SIZE (0xa0000 - CONFIG_BSP_LOGBUF_HEAD) /* (with head)logbuf size:512KB */
相关文章
https://blog.csdn.net/weixin_45264425/article/details/128259618