armv8-uboot

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

https://itexp.blog.csdn.net/article/details/121925283?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-121925283-blog-128259618.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-121925283-blog-128259618.pc_relevant_aa&utm_relevant_index=4

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值