在bl2中触发安全监控模式调用后会跳转到bl31中执行,bl31最主要的作用是 建立EL3运行态的软件配置 , 在该阶段会完成各种类型的安全监控模式调用ID的注册和对应的ARM核状态的切换 ,bl31运行在EL3。bl31的执行流程如图所示。
在这里插入图片描述
bl31_entrypoint函数
通过bl31.ld.S文件可知,bl31的入口函数是bl31_entrypoint。该函数的内容如下:
func bl31_entrypoint
/*
el3初始化操作,该el3_entrypoint_common函数在上面已经介绍过,其中runtime_exceptions为
el3 runtime software的异常向量表,内容定义在bl31/aarch64/runtime_exceptions.S文件中
*/
#if ! RESET_TO_BL31
mov x20, x0
mov x21, x1
el3_entrypoint_common
_set_endian=0
_warm_boot_mailbox=0
_secondary_cold_boot=0
_init_memory=0
_init_c_runtime=1
_exception_vectors=runtime_exceptions
mov x0, x20
mov x1, x21
#else
el3_entrypoint_common
_set_endian=1
_warm_boot_mailbox=! PROGRAMMABLE_RESET_ADDRESS
_secondary_cold_boot=! COLD_BOOT_SINGLE_CPU
_init_memory=1
_init_c_runtime=1
_exception_vectors=runtime_exceptions
mov x0, 0
mov x1, 0
#endif /* RESET_TO_BL31 */
bl bl31_early_platform_setup //平台架构相关的初始化设置
bl bl31_plat_arch_setup //执行AArch初始化
bl bl31_main //跳转到bl31_main函数,执行该阶段需要的主要操作
adr x0, __DATA_START__ //获取REE镜像的DATA段的起始地址
adr x1, __DATA_END__ //获取REE镜像的DATA段的末端地址
sub x1, x1, x0 //计算镜像文件的大小
bl clean_dcache_range //清空数据cache
adr x0, __BSS_START__ //获取BSS段的起始地址
adr x1, __BSS_END__ //获取BSS端的末端地址
sub x1, x1, x0 //计算BSS段的长度
bl clean_dcache_range //清空数据cache
//执行完成将跳转到bl33中执行,即执行BootLoader
b el3_exit
endfunc bl31_entrypoint
bl31_main函数
该函数主要完成必要的初始化操作, 注册EL3中各种安全监控模式调用的处理函数 ,以便在启动完成后响应在REE侧和TEE侧产生的安全监控模式调用。该函数的内容如下:
void bl31_main(void)
{
bl31_platform_setup(); //初始化相关驱动、时钟等
bl31_lib_init(); //用于执行bl31软件中相关全局变量的初始化
/*初始化el3中的service,通过在编译时指定特定的section来确定哪些service会被作为el3
service*/
runtime_svc_init();
/* 如果注册了TEE OS支持,在调用完成run_service_init之后会使用TEE OS的入口函数初
始化bl32_init变量,然后执行对应的init函数,以OP-TEE为例,bl32_init将会被初始化成
opteed_init,到此将会执行opteed_init函数来进入OP-TEE OS的启动,当OP-TEE OS启动完
后,将会产生一个TEESMC_OPTEED_RETURN_ENTRY_DONE的smc异常,通知bl31已经完成了OP-
TEE的启动*/
if (bl32_init) {
INFO("BL31: Initializing BL32n");
(*bl32_init)();
}
//准备跳转到bl33,在执行runtime_service时会运行一个spd service,该service的初始化
函数将会去执行bl32的镜像来完成TEE OS初始化
bl31_prepare_next_image_entry();
console_flush();
bl31_plat_runtime_setup();
}
runtime_svc_init函数会将各种安全监控模式调用的处理函数的指针注册到EL3中,
并通过service->init函数来进行初始化,将TEE OS镜像的入口函数赋值给bl32_init,通过执行bl32_init指向的函数进入到TEE OS的启动过程。
待TEE OS启动完成之后就会去查找bl33的镜像文件,即REE侧的镜像文件,开始进入REE侧镜像的启动。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
监控
+关注
关注
6文章
2171浏览量
55083 -
函数
+关注
关注
3文章
4303浏览量
62409
发布评论请先 登录
相关推荐
可编程CPU重置地址,单CPU冷启动配置
如果将BL31用作TF-A入口点而不是BL1,则上图仍然相关,因为在这种情况下,所有这些操作都将发生在BL31中。有关详细信息,请参阅第6节“使用B
发表于 12-02 11:00
•1019次阅读
如何让BL31的调试信息输出到S32R45的uart?
我用“DEBUG=1”构建 ATF 映像,uart 可以显示 BL2 的调试信息,但没有显示 BL31 的调试信息。 为什么?BL2到BL31
发表于 04-11 08:20
BL31未在Kirkstone上加载的原因?
imx8mm_evk.h 和 imx8mm_evk.c 中的设置时,SPL 打印 do uart3,但它应该显示:注意:BL31:v2.6(发布
发表于 04-19 11:00
ATF的启动过程介绍
ATF的启动过程根据ARMv8的运行模式(AArch32/AArch64)会有所不同,但基本一致。 在AArch32中是不会去加载bl31而是将EL3或者Monitor模式的运行代码保
ATF中bl2的启动
bl2_entrypoint函数最终会触发安全监控模式调用(smc) ,通知bl1将CPU的控制权限转交给bl31,然后执行bl31。 该函数会执行 • 平台相关的初始化、 • 获取
ATF中如何用函数完成bl2的启动
bl31加载到内存中后会触发安全监控模式调用(smc)将CPU权限转交给bl31。 该函数的主要内容和相关注释如下: ** void bl2_main ( void
ATF中bl2到bl31的跳转介绍
bl2到bl31的跳转 在bl2_main函数中最终会调用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl
ATF中bl31函数介绍与使用
runtime_svc_init函数 该函数主要用来建立安全监控模式调用处理函数的索引表,并执行EL3中提供的服务项的初始化操作,获取TEE OS的入口地址并赋值给bl32_init变量,以备启动
bl31中的psci架构介绍
bl31中的psci架构 bl31为内核提供了一系列运行时服务,psci作为其标准运行时服务的一部分,通过宏DECLARE_RT_SVC注册到系统中。其相应的定义如下: DECLARE
评论