ATF的啟動過程根據(jù)ARMv8的運行模式(AArch32/AArch64)會有所不同,但基本一致。
在AArch32中是不會去加載bl31而是將EL3或者Monitor模式的運行代碼保存在bl32中執(zhí)行。在AArch64中,ATF的完整啟動流程如圖下所示。
AArch64模式的ATF啟動流程
在上述啟動過程中,從一個鏡像跳轉(zhuǎn)到另外一個鏡像文件執(zhí)行的方式各不相同,以下為鏡像跳轉(zhuǎn)的過程和方式說明。
概要流程
- bl1跳轉(zhuǎn)到bl2執(zhí)行
在bl1完成了將bl2鏡像文件加載到RAM中的操作、中斷向量表的設(shè)定以及其他CPU相關(guān)設(shè)定后,bl1_main函數(shù)會解析出bl2鏡像文件的描述信息,獲取入口地址,并設(shè)定下一個階段的cpu上下文。這些操作完成之后,調(diào)用el3_exit函數(shù)來實現(xiàn)bl1到bl2的跳轉(zhuǎn),進入bl2中開始執(zhí)行。
- bl2跳轉(zhuǎn)到bl31執(zhí)行
在bl2中將會加載bl31、bl32、bl33的鏡像文件到對應(yīng)權(quán)限的內(nèi)存中,并將該三個鏡像文件的描述信息組成一個鏈表保存起來,以備bl31啟動bl32和bl33使用。在AArch64中,bl31為EL3的執(zhí)行軟件,其運行時的主要功能是對安全監(jiān)控模式調(diào)用(smc)指令和中斷處理,運行在ARM的Monitor模式中。
bl32一般為TEE OS鏡像文件,本章以O(shè)P-TEE為例進行說明。
bl33為正常世界狀態(tài)的鏡像文件,例如uboot、EKD2等。當前該部分為BootLoader部分的鏡像文件,再由BootLoader來啟動Linux內(nèi)核鏡像。
從bl2跳轉(zhuǎn)到bl31是通過帶入bl31的入口點信息作為參數(shù),然后調(diào)用安全監(jiān)控模式調(diào)用指令,觸發(fā)在bl1中設(shè)定的安全監(jiān)控模式調(diào)用請求,該請求處理完成后會將中央處理器的執(zhí)行權(quán)限交給bl31,并跳轉(zhuǎn)到bl31中去執(zhí)行。
- bl31跳轉(zhuǎn)到bl32執(zhí)行
在bl31中會執(zhí)行runtime_service_inti函數(shù),該函數(shù)會調(diào)用注冊到EL3中所有服務(wù)的初始化函數(shù),其中有一個服務(wù)項就是TEE服務(wù),該服務(wù)項的初始化函數(shù)會將TEEOS的初始化函數(shù)賦值給bl32_init變量,當所有服務(wù)項執(zhí)行完初始化后,在bl31中會調(diào)用bl32_init執(zhí)行的函數(shù)來跳轉(zhuǎn)到TEE OS中并開始執(zhí)行TEE
OS的啟動。
- bl31跳轉(zhuǎn)到bl33執(zhí)行
當TEE-OS鏡像啟動完成后會觸發(fā)一個ID為TEESMC_OPTEED_RETURN_ENTRY_DONE的安全監(jiān)控模式調(diào)用,該調(diào)用是用來告知EL3 TEE OS鏡像已經(jīng)完成了初始化,然后將CPU的狀態(tài)恢復(fù)到bl31_init的位置繼續(xù)執(zhí)行。
bl31通過遍歷在bl2中記錄的所有鏡像信息的鏈表來找到需要執(zhí)行的bl33的鏡像。然后通過獲取到bl33鏡像的信息,設(shè)定下一個階段的CPU上下文,退出el3后進入到bl33鏡像中開始執(zhí)行。
-
ARM
+關(guān)注
關(guān)注
134文章
9084瀏覽量
367380 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3019瀏覽量
74003 -
鏡像
+關(guān)注
關(guān)注
0文章
164瀏覽量
10707
發(fā)布評論請先 登錄
相關(guān)推薦
評論