在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_DONE的smc異常,通知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)。
-
監(jiān)控
+關(guān)注
關(guān)注
6文章
2212瀏覽量
55234 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4332瀏覽量
62677
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論