0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ATF中如何用函數(shù)完成bl2的啟動

麥辣雞腿堡 ? 來源:TrustZone ? 作者:TrustZone ? 2023-11-07 16:04 ? 次閱讀

bl2_main函數(shù)

bl2_main函數(shù)完成了bl2階段的主要操作,包括

  • ? 對下一個階段鏡像文件的解析、
  • ? 獲取入口地址和鏡像文件大小等信息,
  • ? 然后對鏡像文件進行驗簽和加載操作。
  • ? 將bl31加載到內(nèi)存中后會觸發(fā)安全監(jiān)控模式調(diào)用(smc)將CPU權(quán)限轉(zhuǎn)交給bl31。

該函數(shù)的主要內(nèi)容和相關(guān)注釋如下:

**        void bl2_main(void)

        {

            entry_point_info_t *next_bl_ep_info;

            bl2_arch_setup();               //執(zhí)行平臺相關(guān)初始化

        #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操作

            /* 調(diào)用smc指令,觸發(fā)在bl1中設(shè)定的smc異常中斷處理函數(shù),跳轉(zhuǎn)到bl31 */

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

          }**

bl2_load_images函數(shù)

bl2_load_images函數(shù)完成將bl32和bl33的鏡像文件加載到內(nèi)存中并返回bl31鏡像的入口地址,最終在bl2_main函數(shù)中通過觸發(fā)安全監(jiān)控模式調(diào)用(smc)跳轉(zhuǎn)到bl31,并將CPU控制權(quán)限交給bl31。

該函數(shù)的主要內(nèi)容和注釋如下:

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的加載和入口函數(shù)信息 */

            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循環(huán) */

            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進行電子驗簽,如果通過則執(zhí)行加載操作 */

                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);

                }

                  /* 可以根據(jù)實際需要更改,通過給定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;

              }

              /*  獲取下一個執(zhí)行的鏡像的入口信息,并且將以后會被執(zhí)行的鏡像的入口信息組合成鏈表,通過判斷

              image  des中的ep_info.h.attr的值是否為(EXECUTABLE|EP_FIRST_EX)來確定接下來第一個

              被執(zhí)行的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結(jié)構(gòu)體變量數(shù)組bl_mem_params_desc_ptr來保存bl3x鏡像文件的信息。該結(jié)構(gòu)體內(nèi)容如下:

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;       //該鏡像文件啟動時所需參數(shù)在RAM中的信息

        } bl_mem_params_node_t;

在bl2_load_images函數(shù)中通過調(diào)用plat_get_bl_image_load_info函數(shù)來獲取bl3x鏡像文件的信息,ATF源代碼中通過使用REGISTER_BL_IMAGE_DESCS宏將事先定義好的bl2_mem_params_descs變量中的數(shù)據(jù)保存到bl_mem_params_desc_ptr數(shù)組中,而bl2_mem_params_descs中保存的就是所有bl3x鏡像文件的基本信息,開發(fā)者可根據(jù)不同平臺的實際情況修改bl2_mem_params_descs變量中各鏡像文件的信息。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2967

    瀏覽量

    73815
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4283

    瀏覽量

    62325
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28306
收藏 人收藏

    評論

    相關(guān)推薦

    【NanoPi M2試用體驗】+SD卡啟動BL1拷貝BL2到DDR2運行

    裸機程序SD卡啟動BL1拷貝BL2到DDR2運行;代碼的拷貝會用到一些指針函數(shù),第一個參數(shù)為
    發(fā)表于 06-11 17:03

    關(guān)于TF-A(ATF)固件的基本知識詳解

    。ATF定義的啟動模型ATF將鏡像進行了劃分,BL1 BL2屬于啟動引導(dǎo)鏡像,
    發(fā)表于 06-15 16:57

    如何在BL2配置DDR init?

    :2022 年 10 月 25 日 18:55:21錯誤:BL2:加載圖像失敗(-2)身份驗證失敗我認為我們必須更改 atf\plat\nxp\soc-ls1046\ls1046ardb\ddr_init.c
    發(fā)表于 03-24 08:50

    S32g如何在ATF啟用安全啟動?

    /cortexa53-wrs-linux/atf-s32g/2.5-r0/build/batman/release /bl2/bl2_main.o:在函數(shù)
    發(fā)表于 04-03 07:12

    Yocto LS1028定制板用BL2,為了使DDR工作是否需要編輯ddr_init.c的任何其他函數(shù)/值或ATF的任何其他文件??

    了 BUILD_STRING = \"custom\" 選項來檢查我正在運行的 BL2 是否是我的。 為了使 DDR 工作,我是否需要編輯 ddr_init.c 的任何其他函數(shù)/值或AT
    發(fā)表于 06-01 09:03

    TF-A的不同啟動階段有哪些

    不同的啟動階段,按照鏈式結(jié)構(gòu)依次啟動,ATF 代碼啟動流程如圖所示: 當芯片復(fù)位以后首先運行 bl1 代碼,
    的頭像 發(fā)表于 09-11 16:54 ?863次閱讀
    TF-A的不同<b class='flag-5'>啟動</b>階段有哪些

    ATF啟動流程介紹

    一、BL32(TEE OS)的準備 ATF啟動流程 ATF流程 ATF啟動實現(xiàn)分為5個步驟:
    的頭像 發(fā)表于 11-02 17:51 ?1169次閱讀
    <b class='flag-5'>ATF</b><b class='flag-5'>啟動</b>流程介紹

    啟動(Cold boot)流程及階段劃分

    restart--冷啟動 reset--熱啟動 ATF啟動實現(xiàn)分為5個步驟: ? BL1 - AP Trusted ROM,一般為Boot
    的頭像 發(fā)表于 11-07 15:17 ?1980次閱讀
    冷<b class='flag-5'>啟動</b>(Cold boot)流程及階段劃分

    ATF啟動過程介紹

    。 概要流程 bl1跳轉(zhuǎn)到bl2執(zhí)行 在bl1完成了將bl2鏡像文件加載到RAM的操作、中斷向
    的頭像 發(fā)表于 11-07 15:48 ?1194次閱讀
    <b class='flag-5'>ATF</b>的<b class='flag-5'>啟動</b>過程介紹

    code層面 ATFbl1的啟動

    系統(tǒng)上電之后首先會運行ChipRom,之后會跳轉(zhuǎn)到ATFbl1繼續(xù)執(zhí)行。bl1主要初始化CPU、設(shè)定異常向量、將bl2的鏡像加載到安全R
    的頭像 發(fā)表于 11-07 15:53 ?969次閱讀
    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鏡像將為后續(xù)鏡像的加載執(zhí)行相關(guān)的初始化操作,主要是內(nèi)存、MMU、串口以及EL3軟件運行環(huán)境的設(shè)置,并且加載bl3x的鏡像到內(nèi)存。 通過查看bl2.ld.S文件可發(fā)現(xiàn),
    的頭像 發(fā)表于 11-07 15:59 ?732次閱讀
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl2</b>的<b class='flag-5'>啟動</b>

    ATFbl2bl31的跳轉(zhuǎn)介紹

    之后,系統(tǒng)將跳轉(zhuǎn)到中斷處理函數(shù)(smc_handler64)繼續(xù)執(zhí)行。該函數(shù)定義在bl1/aarch64/bl1_exception.S文件
    的頭像 發(fā)表于 11-07 16:09 ?846次閱讀

    ATFbl31的啟動

    bl2觸發(fā)安全監(jiān)控模式調(diào)用后會跳轉(zhuǎn)到bl31執(zhí)行,bl31最主要的作用是 建立EL3運行態(tài)的軟件配置 , 在該階段會
    的頭像 發(fā)表于 11-07 16:13 ?1069次閱讀
    <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
    的頭像 發(fā)表于 11-07 16:32 ?585次閱讀
    <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的這個過程。這里再復(fù)習一下。 與大多數(shù)BootLoader一樣,uboot的啟動過程分為BL1和BL2兩個階段
    的頭像 發(fā)表于 12-04 17:53 ?2786次閱讀