系統(tǒng)上電之后首先會運行ChipRom,之后會跳轉(zhuǎn)到ATF的bl1中繼續(xù)執(zhí)行。bl1主要初始化CPU、設(shè)定異常向量、將bl2的鏡像加載到安全RAM中,然后跳轉(zhuǎn)到bl2中開始運行。
bl1的主要代碼存放在bl1目錄中,bl1的鏈接文件是bl1/bl1.ld.s文件,該文件指定bl1的入口函數(shù)是bl1_entrypoint。
AArch32的該函數(shù)定義在bl1/aarch32/bl1_entrypoint.S文件中,AArch64的該函數(shù)定義在bl1/aarch64/bl1_entrypoint. S文件中。bl1的執(zhí)行流程如圖所示。
bl1執(zhí)行流程
bl1_entrypoint函數(shù)說明
bl1_entrypoint函數(shù)主要完成ARMv8架構(gòu)中EL3執(zhí)行環(huán)境的基礎(chǔ)初始化、設(shè)定異常向量表、加載bl2的鏡像文件到內(nèi)存中并進(jìn)行跳轉(zhuǎn)到bl2繼續(xù)執(zhí)行。該函數(shù)的內(nèi)容如下:
func bl1_entrypoint
/* EL3級別運行環(huán)境的初始化,該函數(shù)定義在include/common/aarch64/el3_common_macros.S文
件中*/
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=bl1_exceptions
bl bl1_early_platform_setup //調(diào)用bl1_early_platform_setup函數(shù)完成底層初始化
bl bl1_plat_arch_setup //調(diào)用bl1_plat_arch_setup完成平臺初始化
bl bl1_main //調(diào)用bl1_main函數(shù),初始化驗證模塊,加載下一階段的
image到RAM中
b el3_exit //調(diào)用el3_exit函數(shù),跳轉(zhuǎn)到下一個image(bl2)
endfunc bl1_entrypoint
el3_entrypoint_common函數(shù)執(zhí)行時帶入的參數(shù)包括大小端標(biāo)識、屬于冷啟動還是重啟操作、是否是從核的啟動、是否需要進(jìn)行內(nèi)存初始化、是否需要建立C語言運行環(huán)境(棧初始化)、異常向量表地址注冊等。
-
ARM
+關(guān)注
關(guān)注
134文章
9097瀏覽量
367585 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62622 -
Code
+關(guān)注
關(guān)注
0文章
69瀏覽量
15395
發(fā)布評論請先 登錄
相關(guān)推薦
評論