bl2镜像将为后续镜像的加载执行相关的初始化操作,主要是内存、MMU、串口以及EL3软件运行环境的设置,并且加载bl3x的镜像到内存中。
通过查看bl2.ld.S文件可发现,bl2镜像的入口函数是bl2_entrypoint。该函数定义在bl2/aarch64/bl2_entrypoint.S文件中。该阶段的执行流程如图所示。
bl2执行流程
bl2_entrypoint函数
bl2_entrypoint函数最终会触发安全监控模式调用(smc) ,通知bl1将CPU的控制权限转交给bl31,然后执行bl31。
该函数会执行
- • 平台相关的初始化、
- • 获取存放bl3x镜像文件的结构体变量、
- • 解析出bl31的入口地址等。
该函数的主要内容和注释如下:
func bl2_entrypoint
mov x20, x1 //获取可用安全内存的起始地址
adr x0, early_exceptions //设定异常向量
msr vbar_el1, x0 //将异常向量表地址写入到VBAR寄存器中
isb
msr daifclr, #DAIF_ABT_BIT //使能SErrot中断
/* 使能指令cache、栈顶地址以及数据访问权限对齐检查 */
mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT)
mrs x0, sctlr_el1
orr x0, x0, x1
msr sctlr_el1, x0
isb
/* 获取有效的RW内存以备bl2使用 */
adr x0, __RW_START__ //获取RW内存的起始地址
adr x1, __RW_END__ //获取RW内存的末端地址
sub x1, x1, x0 //计算出RW内存的大小
bl inv_dcache_range //禁止数据cache
ldr x0, =__BSS_START__ //获取bl2中BSS段的起始地址
ldr x1, =__BSS_SIZE__ //获取bl2中BSS段的大小
bl zeromem //清空BSS段中的内容
#if USE_COHERENT_MEM
ldr x0, =__COHERENT_RAM_START__
ldr x1, =__COHERENT_RAM_UNALIGNED_SIZE__
bl zeromem
#endif
bl plat_set_my_stack //初始化bl2运行的栈
#if STACK_PROTECTOR_ENABLED
bl update_stack_protector_canary //更新栈保护区域数据
#endif
mov x0, x20
bl bl2_early_platform_setup //设置平台相关
bl bl2_plat_arch_setup //设置架构相关
bl bl2_main //跳转到BL2的主要函数执行,从该函数中跳转到bl31以及bl32或者bl33
no_ret plat_panic_handler
endfunc bl2_entrypoint
在bl2_entrypoint函数中, 完成bl2运行栈的初始化,配置完运行环境后 ,会调用 bl2_main函数来完成bl2对bl3x镜像的加载 ,而CPU控制权限的转移则是通过触发安全监控模式调用(smc)来实现。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
ARM
+关注
关注
134文章
9040浏览量
366724 -
内存
+关注
关注
8文章
2996浏览量
73867 -
镜像
+关注
关注
0文章
162浏览量
10697
发布评论请先 登录
相关推荐
【NanoPi M2试用体验】+SD卡启动BL1拷贝BL2到DDR2中运行
裸机程序SD卡启动BL1拷贝BL2到DDR2中运行;代码的拷贝会用到一些指针函数,第一个参数为SD卡存放
发表于 06-11 17:03
如何在BL2中配置DDR init?
:2022 年 10 月 25 日 18:55:21错误:BL2:加载图像失败(-2)身份验证失败我认为我们必须更改 atf\plat\nxp\soc-ls1046\ls1046ardb\ddr_init.c
发表于 03-24 08:50
S32g如何在ATF中启用安全启动?
/cortexa53-wrs-linux/atf-s32g/2.5-r0/build/batman/release /bl2/bl2_main.o:在函数“bl2_main”
发表于 04-03 07:12
Yocto LS1028定制板用BL2,为了使DDR工作是否需要编辑ddr_init.c中的任何其他函数/值或ATF源中的任何其他文件??
的下一步是创建一个自定义 BL2,用于启动基于 kirkstone 版本的 yocto 编译。
为此,我修补了 atf repo 的 ddr_init.c 文件,这个“ddr_cfg_regs”结构
发表于 06-01 09:03
ATF的启动过程介绍
ATF的启动过程根据ARMv8的运行模式(AArch32/AArch64)会有所不同,但基本一致。 在AArch32中是不会去加载bl31而是将EL3或者Monitor模式的运行代码保
ATF中如何用函数完成bl2的启动
bl2_main函数 bl2_main函数完成了bl2阶段的主要操作,包括 • 对下一个阶段镜像文件的解析、 • 获取入口地址和镜像文件大小等信息, • 然后对镜像文件进行验签和加载操作。 • 将
ATF中bl2到bl31的跳转介绍
数之后,系统将跳转到中断处理函数(smc_handler64)继续执行。该函数定义在bl1/aarch64/bl1_exception.S文件中。 该函数最终通过判定安全监控模式调用的类型(在
uboot的启动BL1和BL2两个阶段介绍
之前对这个uboot的源码了解有些许遗忘。最近做AVB校验,需要uboot到kernel的这个过程。这里再复习一下。 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段
评论