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