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

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

3天内不再提示

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

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

bl2_main函数

bl2_main函数完成了bl2阶段的主要操作,包括

  • • 对下一个阶段镜像文件的解析、
  • • 获取入口地址和镜像文件大小等信息
  • • 然后对镜像文件进行验签和加载操作。
  • • 将bl31加载到内存中后会触发安全监控模式调用(smc)将CPU权限转交给bl31。

该函数的主要内容和相关注释如下:

**        void bl2_main(void)

        {

            entry_point_info_t *next_bl_ep_info;

            bl2_arch_setup();               //执行平台相关初始化

        #if TRUSTED_BOARD_BOOT

            /* Initialize authentication module */

            auth_mod_init();                //初始化image验证模块

        #endif /* TRUSTED_BOARD_BOOT */

            //加载bl3x image到RAM中并返回bl31的入口地址

            next_bl_ep_info = bl2_load_images();

        #ifdef AARCH32

            disable_mmu_icache_secure();  //禁止MMU的指令cache

        #endif /* AArch32 */

            console_flush();                //刷新console操作

            /* 调用smc指令,触发在bl1中设定的smc异常中断处理函数,跳转到bl31 */

              smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0,0, 0);

          }**

bl2_load_images函数

bl2_load_images函数完成将bl32和bl33的镜像文件加载到内存中并返回bl31镜像的入口地址,最终在bl2_main函数中通过触发安全监控模式调用(smc)跳转到bl31,并将CPU控制权限交给bl31。

该函数的主要内容和注释如下:

entry_point_info_t *bl2_load_images(void)

        {

            bl_params_t *bl2_to_next_bl_params;

            bl_load_info_t *bl2_load_info;

            const bl_load_info_node_t *bl2_node_info;

            int plat_setup_done = 0;

            int err;

            /* 获取bl3x image的加载和入口函数信息 */

            bl2_load_info = plat_get_bl_image_load_info();

            /* 检查返回的bl2_load_info中的信息是否正确 */

            assert(bl2_load_info);

            assert(bl2_load_info- >head);

            assert(bl2_load_info- >h.type == PARAM_BL_LOAD_INFO);

            assert(bl2_load_info- >h.version >= VERSION_2);

            /*  将bl2_load_info中的head变量的值赋值为bl2_node_info,即将bl31  image的入口信息

            传递给bl2_node_info变量 */

            bl2_node_info = bl2_load_info- >head;

            /* 进入loop循环 */

            while (bl2_node_info) {

                /* 在加载特定的bl3x image到RAM之前先确定是否需要进行平台的初始化 */

                if (bl2_node_info- >image_info- >h.attr & IMAGE_ATTRIB_PLAT_SETUP) {

                    if (plat_setup_done) {

                        WARN("BL2: Platform setup already done! ! n");

                    } else {

                        INFO("BL2: Doing platform setupn");

                        bl2_platform_setup();

                        plat_setup_done = 1;

                    }

                }

                /* 对bl3x image进行电子验签,如果通过则执行加载操作 */

                if (! (bl2_node_info- >image_info- >h.attr & IMAGE_ATTRIB_SKIP_LOADING)) {

                    INFO("BL2: Loading image id %dn", bl2_node_info- >image_id);

                    err = load_auth_image(bl2_node_info- >image_id,

                        bl2_node_info- >image_info);

                    if (err) {

                        ERROR("BL2: Failed to load image (%i)n", err);

                        plat_error_handler(err);

                    }

                } else {

                    INFO("BL2: Skip loading image id %dn", bl2_node_info- >image_id);

                }

                  /* 可以根据实际需要更改,通过给定image ID来更改image的加载信息 */

                  err = bl2_plat_handle_post_image_load(bl2_node_info- >image_id);

                  if (err) {

                      ERROR("BL2: Failure in post image load handling (%i)n", err);

                      plat_error_handler(err);

                  }

                  bl2_node_info = bl2_node_info- >next_load_info;

              }

              /*  获取下一个执行的镜像的入口信息,并且将以后会被执行的镜像的入口信息组合成链表,通过判断

              image  des中的ep_info.h.attr的值是否为(EXECUTABLE|EP_FIRST_EX)来确定接下来第一个

              被执行的image*/

              bl2_to_next_bl_params = plat_get_next_bl_params();

              assert(bl2_to_next_bl_params);

              assert(bl2_to_next_bl_params- >head);

              assert(bl2_to_next_bl_params- >h.type == PARAM_BL_PARAMS);

              assert(bl2_to_next_bl_params- >h.version >= VERSION_2);

              plat_flush_next_bl_params();

              /* 返回下一个进入的镜像的入口信息,即bl31的入口信息 */

              return bl2_to_next_bl_params- >head- >ep_info;

          }

bl3x镜像文件信息

ATF使用bl_mem_params_node_t结构体变量数组bl_mem_params_desc_ptr来保存bl3x镜像文件的信息。该结构体内容如下:

typedef struct bl_mem_params_node {

            unsigned int image_id;                   //镜像文件的id值

            image_info_t image_info;                 //镜像文件的信息

            entry_point_info_t ep_info;              //bl3x的入口地址信息

            unsigned int next_handoff_image_id;    //写一个阶段bl3x的id值

            bl_load_info_node_t load_node_mem;     //该镜像文件需要被保存在RAM中的信息

            bl_params_node_t params_node_mem;       //该镜像文件启动时所需参数在RAM中的信息

        } bl_mem_params_node_t;

在bl2_load_images函数中通过调用plat_get_bl_image_load_info函数来获取bl3x镜像文件的信息,ATF源代码中通过使用REGISTER_BL_IMAGE_DESCS宏将事先定义好的bl2_mem_params_descs变量中的数据保存到bl_mem_params_desc_ptr数组中,而bl2_mem_params_descs中保存的就是所有bl3x镜像文件的基本信息,开发者可根据不同平台的实际情况修改bl2_mem_params_descs变量中各镜像文件的信息。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    3031

    浏览量

    74120
  • 函数
    +关注

    关注

    3

    文章

    4333

    浏览量

    62723
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28402
收藏 人收藏

    评论

    相关推荐

    【NanoPi M2试用体验】+SD卡启动BL1拷贝BL2到DDR2运行

    裸机程序SD卡启动BL1拷贝BL2到DDR2运行;代码的拷贝会用到一些指针函数,第一个参数为
    发表于 06-11 17:03

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

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

    如何在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:在函数
    发表于 04-03 07:12

    Yocto LS1028定制板用BL2,为了使DDR工作是否需要编辑ddr_init.c的任何其他函数/值或ATF的任何其他文件??

    了 BUILD_STRING = \"custom\" 选项来检查我正在运行的 BL2 是否是我的。 为了使 DDR 工作,我是否需要编辑 ddr_init.c 的任何其他函数/值或AT
    发表于 06-01 09:03

    TF-A的不同启动阶段有哪些

    不同的启动阶段,按照链式结构依次启动ATF 代码启动流程如图所示: 当芯片复位以后首先运行 bl1 代码,
    的头像 发表于 09-11 16:54 939次阅读
    TF-A的不同<b class='flag-5'>启动</b>阶段有哪些

    ATF启动流程介绍

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

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

    restart--冷启动 reset--热启动 ATF启动实现分为5个步骤: • BL1 - AP Trusted ROM,一般为Boot
    的头像 发表于 11-07 15:17 2437次阅读
    冷<b class='flag-5'>启动</b>(Cold boot)流程及阶段划分

    ATF启动过程介绍

    。 概要流程 bl1跳转到bl2执行 在bl1完成了将bl2镜像文件加载到RAM的操作、中断向
    的头像 发表于 11-07 15:48 1307次阅读
    <b class='flag-5'>ATF</b>的<b class='flag-5'>启动</b>过程介绍

    code层面 ATFbl1的启动

    系统上电之后首先会运行ChipRom,之后会跳转到ATFbl1继续执行。bl1主要初始化CPU、设定异常向量、将bl2的镜像加载到安全R
    的头像 发表于 11-07 15:53 1103次阅读
    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镜像将为后续镜像的加载执行相关的初始化操作,主要是内存、MMU、串口以及EL3软件运行环境的设置,并且加载bl3x的镜像到内存。 通过查看bl2.ld.S文件可发现,
    的头像 发表于 11-07 15:59 838次阅读
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl2</b>的<b class='flag-5'>启动</b>

    ATFbl2bl31的跳转介绍

    之后,系统将跳转到中断处理函数(smc_handler64)继续执行。该函数定义在bl1/aarch64/bl1_exception.S文件
    的头像 发表于 11-07 16:09 981次阅读

    ATFbl31的启动

    bl2触发安全监控模式调用后会跳转到bl31执行,bl31最主要的作用是 建立EL3运行态的软件配置 , 在该阶段会
    的头像 发表于 11-07 16:13 1210次阅读
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>31的<b class='flag-5'>启动</b>

    ATFbl32的启动方法

    ATFbl32的启动 bl31的runtime_svc_init
    的头像 发表于 11-07 16:32 657次阅读
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>32的<b class='flag-5'>启动</b>方法

    uboot的启动BL1和BL2两个阶段介绍

    之前对这个uboot的源码了解有些许遗忘。最近做AVB校验,需要uboot到kernel的这个过程。这里再复习一下。 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段
    的头像 发表于 12-04 17:53 3115次阅读