bl2鏡像將為后續鏡像的加載執行相關的初始化操作,主要是內存、MMU、串口以及EL3軟件運行環境的設置,并且加載bl3x的鏡像到內存中。
通過查看bl2.ld.S文件可發現,bl2鏡像的入口函數是bl2_entrypoint。該函數定義在bl2/aarch64/bl2_entrypoint.S文件中。該階段的執行流程如圖所示。
bl2執行流程
bl2_entrypoint函數
bl2_entrypoint函數最終會觸發安全監控模式調用(smc) ,通知bl1將CPU的控制權限轉交給bl31,然后執行bl31。
該函數會執行
- ? 平臺相關的初始化、
- ? 獲取存放bl3x鏡像文件的結構體變量、
- ? 解析出bl31的入口地址等。
該函數的主要內容和注釋如下:
func bl2_entrypoint
mov x20, x1 //獲取可用安全內存的起始地址
adr x0, early_exceptions //設定異常向量
msr vbar_el1, x0 //將異常向量表地址寫入到VBAR寄存器中
isb
msr daifclr, #DAIF_ABT_BIT //使能SErrot中斷
/* 使能指令cache、棧頂地址以及數據訪問權限對齊檢查 */
mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT)
mrs x0, sctlr_el1
orr x0, x0, x1
msr sctlr_el1, x0
isb
/* 獲取有效的RW內存以備bl2使用 */
adr x0, __RW_START__ //獲取RW內存的起始地址
adr x1, __RW_END__ //獲取RW內存的末端地址
sub x1, x1, x0 //計算出RW內存的大小
bl inv_dcache_range //禁止數據cache
ldr x0, =__BSS_START__ //獲取bl2中BSS段的起始地址
ldr x1, =__BSS_SIZE__ //獲取bl2中BSS段的大小
bl zeromem //清空BSS段中的內容
#if USE_COHERENT_MEM
ldr x0, =__COHERENT_RAM_START__
ldr x1, =__COHERENT_RAM_UNALIGNED_SIZE__
bl zeromem
#endif
bl plat_set_my_stack //初始化bl2運行的棧
#if STACK_PROTECTOR_ENABLED
bl update_stack_protector_canary //更新棧保護區域數據
#endif
mov x0, x20
bl bl2_early_platform_setup //設置平臺相關
bl bl2_plat_arch_setup //設置架構相關
bl bl2_main //跳轉到BL2的主要函數執行,從該函數中跳轉到bl31以及bl32或者bl33
no_ret plat_panic_handler
endfunc bl2_entrypoint
在bl2_entrypoint函數中, 完成bl2運行棧的初始化,配置完運行環境后 ,會調用 bl2_main函數來完成bl2對bl3x鏡像的加載 ,而CPU控制權限的轉移則是通過觸發安全監控模式調用(smc)來實現。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
ARM
+關注
關注
134文章
9099瀏覽量
367745 -
內存
+關注
關注
8文章
3028瀏覽量
74089 -
鏡像
+關注
關注
0文章
165瀏覽量
10751
發布評論請先 登錄
相關推薦
【NanoPi M2試用體驗】+SD卡啟動BL1拷貝BL2到DDR2中運行
裸機程序SD卡啟動BL1拷貝BL2到DDR2中運行;代碼的拷貝會用到一些指針函數,第一個參數為SD卡存放
發表于 06-11 17:03
如何在BL2中配置DDR init?
:2022 年 10 月 25 日 18:55:21錯誤:BL2:加載圖像失?。?2)身份驗證失敗我認為我們必須更改 atf\plat\nxp\soc-ls1046\ls1046ardb\ddr_init.c
發表于 03-24 08:50
S32g如何在ATF中啟用安全啟動?
/cortexa53-wrs-linux/atf-s32g/2.5-r0/build/batman/release /bl2/bl2_main.o:在函數“bl2_main”
發表于 04-03 07:12
Yocto LS1028定制板用BL2,為了使DDR工作是否需要編輯ddr_init.c中的任何其他函數/值或ATF源中的任何其他文件??
的下一步是創建一個自定義 BL2,用于啟動基于 kirkstone 版本的 yocto 編譯。
為此,我修補了 atf repo 的 ddr_init.c 文件,這個“ddr_cfg_regs”結構
發表于 06-01 09:03
ATF的啟動過程介紹
ATF的啟動過程根據ARMv8的運行模式(AArch32/AArch64)會有所不同,但基本一致。 在AArch32中是不會去加載bl31而是將EL3或者Monitor模式的運行代碼保
ATF中如何用函數完成bl2的啟動
bl2_main函數 bl2_main函數完成了bl2階段的主要操作,包括 ? 對下一個階段鏡像文件的解析、 ? 獲取入口地址和鏡像文件大小等信息, ? 然后對鏡像文件進行驗簽和加載操作。 ? 將
ATF中bl2到bl31的跳轉介紹
數之后,系統將跳轉到中斷處理函數(smc_handler64)繼續執行。該函數定義在bl1/aarch64/bl1_exception.S文件中。 該函數最終通過判定安全監控模式調用的類型(在
uboot的啟動BL1和BL2兩個階段介紹
之前對這個uboot的源碼了解有些許遺忘。最近做AVB校驗,需要uboot到kernel的這個過程。這里再復習一下。 與大多數BootLoader一樣,uboot的啟動過程分為BL1和BL2兩個階段
評論