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

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

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

ATF中bl31的啟動(dòng)

麥辣雞腿堡 ? 來(lái)源:TrustZone ? 作者:TrustZone ? 2023-11-07 16:13 ? 次閱讀

在bl2中觸發(fā)安全監(jiān)控模式調(diào)用后會(huì)跳轉(zhuǎn)到bl31中執(zhí)行,bl31最主要的作用是 建立EL3運(yùn)行態(tài)的軟件配置 , 在該階段會(huì)完成各種類型的安全監(jiān)控模式調(diào)用ID的注冊(cè)和對(duì)應(yīng)的ARM核狀態(tài)的切換 ,bl31運(yùn)行在EL3。bl31的執(zhí)行流程如圖所示。

圖片
在這里插入圖片描述

bl31_entrypoint函數(shù)

通過(guò)bl31.ld.S文件可知,bl31的入口函數(shù)是bl31_entrypoint。該函數(shù)的內(nèi)容如下:

func bl31_entrypoint

        /*

        el3初始化操作,該el3_entrypoint_common函數(shù)在上面已經(jīng)介紹過(guò),其中runtime_exceptions為

        el3 runtime software的異常向量表,內(nèi)容定義在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    //平臺(tái)架構(gòu)相關(guān)的初始化設(shè)置

              bl  bl31_plat_arch_setup          //執(zhí)行AArch初始化

              bl  bl31_main                       //跳轉(zhuǎn)到bl31_main函數(shù),執(zhí)行該階段需要的主要操作

              adr x0, __DATA_START__             //獲取REE鏡像的DATA段的起始地址

              adr x1, __DATA_END__               //獲取REE鏡像的DATA段的末端地址

              sub x1, x1, x0                      //計(jì)算鏡像文件的大小

              bl  clean_dcache_range             //清空數(shù)據(jù)cache

              adr x0, __BSS_START__              //獲取BSS段的起始地址

              adr x1, __BSS_END__                //獲取BSS端的末端地址

              sub x1, x1, x0                      //計(jì)算BSS段的長(zhǎng)度

              bl  clean_dcache_range             //清空數(shù)據(jù)cache

              //執(zhí)行完成將跳轉(zhuǎn)到bl33中執(zhí)行,即執(zhí)行BootLoader

              b    el3_exit

          endfunc bl31_entrypoint

bl31_main函數(shù)

該函數(shù)主要完成必要的初始化操作, 注冊(cè)EL3中各種安全監(jiān)控模式調(diào)用的處理函數(shù) ,以便在啟動(dòng)完成后響應(yīng)在REE側(cè)和TEE側(cè)產(chǎn)生的安全監(jiān)控模式調(diào)用。該函數(shù)的內(nèi)容如下:

void bl31_main(void)

        {

            bl31_platform_setup();         //初始化相關(guān)驅(qū)動(dòng)、時(shí)鐘

            bl31_lib_init();                //用于執(zhí)行bl31軟件中相關(guān)全局變量的初始化

            /*初始化el3中的service,通過(guò)在編譯時(shí)指定特定的section來(lái)確定哪些service會(huì)被作為el3

            service*/

            runtime_svc_init();

            /*  如果注冊(cè)了TEE  OS支持,在調(diào)用完成run_service_init之后會(huì)使用TEE  OS的入口函數(shù)初

            始化bl32_init變量,然后執(zhí)行對(duì)應(yīng)的init函數(shù),以OP-TEE為例,bl32_init將會(huì)被初始化成

            opteed_init,到此將會(huì)執(zhí)行opteed_init函數(shù)來(lái)進(jìn)入OP-TEE  OS的啟動(dòng),當(dāng)OP-TEE  OS啟動(dòng)完

            后,將會(huì)產(chǎn)生一個(gè)TEESMC_OPTEED_RETURN_ENTRY_DONEsmc異常,通知bl31已經(jīng)完成了OP-

            TEE的啟動(dòng)*/

            if (bl32_init) {

                INFO("BL31: Initializing BL32n");

                (*bl32_init)();

            }

            //準(zhǔn)備跳轉(zhuǎn)到bl33,在執(zhí)行runtime_service時(shí)會(huì)運(yùn)行一個(gè)spd service,該service的初始化

            函數(shù)將會(huì)去執(zhí)行bl32的鏡像來(lái)完成TEE OS初始化

            bl31_prepare_next_image_entry();

            console_flush();

            bl31_plat_runtime_setup();

        }

runtime_svc_init函數(shù)會(huì)將各種安全監(jiān)控模式調(diào)用的處理函數(shù)的指針注冊(cè)到EL3中,

并通過(guò)service->init函數(shù)來(lái)進(jìn)行初始化,將TEE OS鏡像的入口函數(shù)賦值給bl32_init,通過(guò)執(zhí)行bl32_init指向的函數(shù)進(jìn)入到TEE OS的啟動(dòng)過(guò)程。

待TEE OS啟動(dòng)完成之后就會(huì)去查找bl33的鏡像文件,即REE側(cè)的鏡像文件,開始進(jìn)入REE側(cè)鏡像的啟動(dòng)。

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

    關(guān)注

    6

    文章

    2129

    瀏覽量

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

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61967
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    可編程CPU重置地址,單CPU冷啟動(dòng)配置

    如果將BL31用作TF-A入口點(diǎn)而不是BL1,則上圖仍然相關(guān),因?yàn)樵谶@種情況下,所有這些操作都將發(fā)生在BL31。有關(guān)詳細(xì)信息,請(qǐng)參閱第6節(jié)“使用B
    發(fā)表于 12-02 11:00 ?863次閱讀
    可編程CPU重置地址,單CPU冷<b class='flag-5'>啟動(dòng)</b>配置

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

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

    如何讓BL31的調(diào)試信息輸出到S32R45的uart?

    我用“DEBUG=1”構(gòu)建 ATF 映像,uart 可以顯示 BL2 的調(diào)試信息,但沒有顯示 BL31 的調(diào)試信息。 為什么?BL2到BL31
    發(fā)表于 04-11 08:20

    BL31未在Kirkstone上加載的原因?

    imx8mm_evk.h 和 imx8mm_evk.c 的設(shè)置時(shí),SPL 打印 do uart3,但它應(yīng)該顯示:注意:BL31:v2.6(發(fā)布
    發(fā)表于 04-19 11:00

    ATF啟動(dòng)流程介紹

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

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

    輸出BL1、BL2、BL31,提供BL32和BL33接口。 (我想提供的接口就是BL32和
    的頭像 發(fā)表于 11-07 15:17 ?1569次閱讀
    冷<b class='flag-5'>啟動(dòng)</b>(Cold boot)流程及階段劃分

    ATF啟動(dòng)過(guò)程介紹

    ATF啟動(dòng)過(guò)程根據(jù)ARMv8的運(yùn)行模式(AArch32/AArch64)會(huì)有所不同,但基本一致。 在AArch32是不會(huì)去加載bl31而是將EL3或者M(jìn)onitor模式的運(yùn)行代碼保
    的頭像 發(fā)表于 11-07 15:48 ?1037次閱讀
    <b class='flag-5'>ATF</b>的<b class='flag-5'>啟動(dòng)</b>過(guò)程介紹

    code層面 ATFbl1的啟動(dòng)

    系統(tǒng)上電之后首先會(huì)運(yùn)行ChipRom,之后會(huì)跳轉(zhuǎn)到ATFbl1繼續(xù)執(zhí)行。bl1主要初始化CPU、設(shè)定異常向量、將bl2的鏡像加載到安全R
    的頭像 發(fā)表于 11-07 15:53 ?795次閱讀
    code層面 <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>1的<b class='flag-5'>啟動(dòng)</b>

    ATFbl2的啟動(dòng)

    bl2_entrypoint函數(shù)最終會(huì)觸發(fā)安全監(jiān)控模式調(diào)用(smc) ,通知bl1將CPU的控制權(quán)限轉(zhuǎn)交給bl31,然后執(zhí)行bl31。 該函數(shù)會(huì)執(zhí)行 ? 平臺(tái)相關(guān)的初始化、 ? 獲取
    的頭像 發(fā)表于 11-07 15:59 ?614次閱讀
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>2的<b class='flag-5'>啟動(dòng)</b>

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

    bl31加載到內(nèi)存后會(huì)觸發(fā)安全監(jiān)控模式調(diào)用(smc)將CPU權(quán)限轉(zhuǎn)交給bl31。 該函數(shù)的主要內(nèi)容和相關(guān)注釋如下: ** void bl2_main ( void
    的頭像 發(fā)表于 11-07 16:04 ?525次閱讀

    ATFbl2到bl31的跳轉(zhuǎn)介紹

    bl2到bl31的跳轉(zhuǎn) 在bl2_main函數(shù)中最終會(huì)調(diào)用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl
    的頭像 發(fā)表于 11-07 16:09 ?713次閱讀

    ATFbl31函數(shù)介紹與使用

    runtime_svc_init函數(shù) 該函數(shù)主要用來(lái)建立安全監(jiān)控模式調(diào)用處理函數(shù)的索引表,并執(zhí)行EL3提供的服務(wù)項(xiàng)的初始化操作,獲取TEE OS的入口地址并賦值給bl32_init變量,以備啟動(dòng)
    的頭像 發(fā)表于 11-07 16:23 ?474次閱讀

    ATFbl32的啟動(dòng)方法

    ATFbl32的啟動(dòng) bl31的runtime_svc_init函數(shù)會(huì)初始化OP-TEE對(duì)應(yīng)
    的頭像 發(fā)表于 11-07 16:32 ?477次閱讀
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>32的<b class='flag-5'>啟動(dòng)</b>方法

    Bl31斷處理流程概述

    aarch64架構(gòu),在每個(gè)異常等級(jí)下都包含了四張異常等級(jí)表。 bl31的異常向量表定義在runtime_exceptions.S,其與下圖的定義一致
    的頭像 發(fā)表于 11-07 17:43 ?469次閱讀
    <b class='flag-5'>Bl31</b><b class='flag-5'>中</b>斷處理流程概述

    bl31的psci架構(gòu)介紹

    bl31的psci架構(gòu) bl31為內(nèi)核提供了一系列運(yùn)行時(shí)服務(wù),psci作為其標(biāo)準(zhǔn)運(yùn)行時(shí)服務(wù)的一部分,通過(guò)宏DECLARE_RT_SVC注冊(cè)到系統(tǒng)。其相應(yīng)的定義如下: DECLARE
    的頭像 發(fā)表于 12-05 17:33 ?777次閱讀
    <b class='flag-5'>bl31</b><b class='flag-5'>中</b>的psci架構(gòu)介紹