在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文章
2204瀏覽量
55169 -
函數
+關注
關注
3文章
4327瀏覽量
62573
發布評論請先 登錄
相關推薦
可編程CPU重置地址,單CPU冷啟動配置
如果將BL31用作TF-A入口點而不是BL1,則上圖仍然相關,因為在這種情況下,所有這些操作都將發生在BL31中。有關詳細信息,請參閱第6節“使用B
發表于 12-02 11:00
?1099次閱讀
如何讓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
評論