0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ATF中bl31的启动

麦辣鸡腿堡 来源:TrustZone 作者:TrustZone 2023-11-07 16:13 次阅读

在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_DONEsmc异常,通知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次阅读
    可编程CPU重置地址,单CPU冷<b class='flag-5'>启动</b>配置

    关于TF-A(ATF)固件的基本知识详解

    ATF定义的启动模型ATF将镜像进行了划分,BL1 BL2属于启动引导镜像,
    发表于 06-15 16:57

    如何让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启动流程介绍

    一、BL32(TEE OS)的准备 ATF启动流程 ATF流程 ATF启动实现分为5个步骤:
    的头像 发表于 11-02 17:51 1188次阅读
    <b class='flag-5'>ATF</b><b class='flag-5'>启动</b>流程介绍

    启动(Cold boot)流程及阶段划分

    输出BL1、BL2、BL31,提供BL32和BL33接口。 (我想提供的接口就是BL32和
    的头像 发表于 11-07 15:17 2084次阅读
    冷<b class='flag-5'>启动</b>(Cold boot)流程及阶段划分

    ATF启动过程介绍

    ATF启动过程根据ARMv8的运行模式(AArch32/AArch64)会有所不同,但基本一致。 在AArch32是不会去加载bl31而是将EL3或者Monitor模式的运行代码保
    的头像 发表于 11-07 15:48 1207次阅读
    <b class='flag-5'>ATF</b>的<b class='flag-5'>启动</b>过程介绍

    code层面 ATFbl1的启动

    系统上电之后首先会运行ChipRom,之后会跳转到ATFbl1继续执行。bl1主要初始化CPU、设定异常向量、将bl2的镜像加载到安全R
    的头像 发表于 11-07 15:53 994次阅读
    code层面 <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>1的<b class='flag-5'>启动</b>

    ATFbl2的启动

    bl2_entrypoint函数最终会触发安全监控模式调用(smc) ,通知bl1将CPU的控制权限转交给bl31,然后执行bl31。 该函数会执行 • 平台相关的初始化、 • 获取
    的头像 发表于 11-07 15:59 749次阅读
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>2的<b class='flag-5'>启动</b>

    ATF如何用函数完成bl2的启动

    bl31加载到内存后会触发安全监控模式调用(smc)将CPU权限转交给bl31。 该函数的主要内容和相关注释如下: ** void bl2_main ( void
    的头像 发表于 11-07 16:04 654次阅读

    ATFbl2到bl31的跳转介绍

    bl2到bl31的跳转 在bl2_main函数中最终会调用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl
    的头像 发表于 11-07 16:09 871次阅读

    ATFbl31函数介绍与使用

    runtime_svc_init函数 该函数主要用来建立安全监控模式调用处理函数的索引表,并执行EL3提供的服务项的初始化操作,获取TEE OS的入口地址并赋值给bl32_init变量,以备启动
    的头像 发表于 11-07 16:23 596次阅读

    ATFbl32的启动方法

    ATFbl32的启动 bl31的runtime_svc_init函数会初始化OP-TEE对应
    的头像 发表于 11-07 16:32 596次阅读
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>32的<b class='flag-5'>启动</b>方法

    Bl31断处理流程概述

    aarch64架构,在每个异常等级下都包含了四张异常等级表。 bl31的异常向量表定义在runtime_exceptions.S,其与下图的定义一致
    的头像 发表于 11-07 17:43 584次阅读
    <b class='flag-5'>Bl31</b><b class='flag-5'>中</b>断处理流程概述

    bl31的psci架构介绍

    bl31的psci架构 bl31为内核提供了一系列运行时服务,psci作为其标准运行时服务的一部分,通过宏DECLARE_RT_SVC注册到系统。其相应的定义如下: DECLARE
    的头像 发表于 12-05 17:33 973次阅读
    <b class='flag-5'>bl31</b><b class='flag-5'>中</b>的psci架构介绍