bl2鏡像將為后續(xù)鏡像的加載執(zhí)行相關(guān)的初始化操作,主要是內(nèi)存、MMU、串口以及EL3軟件運(yùn)行環(huán)境的設(shè)置,并且加載bl3x的鏡像到內(nèi)存中。
通過(guò)查看bl2.ld.S文件可發(fā)現(xiàn),bl2鏡像的入口函數(shù)是bl2_entrypoint。該函數(shù)定義在bl2/aarch64/bl2_entrypoint.S文件中。該階段的執(zhí)行流程如圖所示。
bl2執(zhí)行流程
bl2_entrypoint函數(shù)
bl2_entrypoint函數(shù)最終會(huì)觸發(fā)安全監(jiān)控模式調(diào)用(smc) ,通知bl1將CPU的控制權(quán)限轉(zhuǎn)交給bl31,然后執(zhí)行bl31。
該函數(shù)會(huì)執(zhí)行
- ? 平臺(tái)相關(guān)的初始化、
- ? 獲取存放bl3x鏡像文件的結(jié)構(gòu)體變量、
- ? 解析出bl31的入口地址等。
該函數(shù)的主要內(nèi)容和注釋如下:
func bl2_entrypoint
mov x20, x1 //獲取可用安全內(nèi)存的起始地址
adr x0, early_exceptions //設(shè)定異常向量
msr vbar_el1, x0 //將異常向量表地址寫入到VBAR寄存器中
isb
msr daifclr, #DAIF_ABT_BIT //使能SErrot中斷
/* 使能指令cache、棧頂?shù)刂芬约皵?shù)據(jù)訪問(wèn)權(quán)限對(duì)齊檢查 */
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內(nèi)存以備bl2使用 */
adr x0, __RW_START__ //獲取RW內(nèi)存的起始地址
adr x1, __RW_END__ //獲取RW內(nèi)存的末端地址
sub x1, x1, x0 //計(jì)算出RW內(nèi)存的大小
bl inv_dcache_range //禁止數(shù)據(jù)cache
ldr x0, =__BSS_START__ //獲取bl2中BSS段的起始地址
ldr x1, =__BSS_SIZE__ //獲取bl2中BSS段的大小
bl zeromem //清空BSS段中的內(nèi)容
#if USE_COHERENT_MEM
ldr x0, =__COHERENT_RAM_START__
ldr x1, =__COHERENT_RAM_UNALIGNED_SIZE__
bl zeromem
#endif
bl plat_set_my_stack //初始化bl2運(yùn)行的棧
#if STACK_PROTECTOR_ENABLED
bl update_stack_protector_canary //更新棧保護(hù)區(qū)域數(shù)據(jù)
#endif
mov x0, x20
bl bl2_early_platform_setup //設(shè)置平臺(tái)相關(guān)
bl bl2_plat_arch_setup //設(shè)置架構(gòu)相關(guān)
bl bl2_main //跳轉(zhuǎn)到BL2的主要函數(shù)執(zhí)行,從該函數(shù)中跳轉(zhuǎn)到bl31以及bl32或者bl33
no_ret plat_panic_handler
endfunc bl2_entrypoint
在bl2_entrypoint函數(shù)中, 完成bl2運(yùn)行棧的初始化,配置完運(yùn)行環(huán)境后 ,會(huì)調(diào)用 bl2_main函數(shù)來(lái)完成bl2對(duì)bl3x鏡像的加載 ,而CPU控制權(quán)限的轉(zhuǎn)移則是通過(guò)觸發(fā)安全監(jiān)控模式調(diào)用(smc)來(lái)實(shí)現(xiàn)。
-
ARM
+關(guān)注
關(guān)注
134文章
9180瀏覽量
369474 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3064瀏覽量
74388 -
鏡像
+關(guān)注
關(guān)注
0文章
170瀏覽量
10810
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
【NanoPi M2試用體驗(yàn)】+SD卡啟動(dòng)BL1拷貝BL2到DDR2中運(yùn)行
關(guān)于TF-A(ATF)固件的基本知識(shí)詳解
如何在BL2中配置DDR init?
S32g如何在ATF中啟用安全啟動(dòng)?
Yocto LS1028定制板用BL2,為了使DDR工作是否需要編輯ddr_init.c中的任何其他函數(shù)/值或ATF源中的任何其他文件??
TF-A的不同啟動(dòng)階段有哪些
![TF-A的不同<b class='flag-5'>啟動(dòng)</b>階段有哪些](https://file1.elecfans.com/web2/M00/A3/EA/wKgaomT-1KSAI6SoAAQc3T1xT_Q621.jpg)
冷啟動(dòng)(Cold boot)流程及階段劃分
![冷<b class='flag-5'>啟動(dòng)</b>(Cold boot)流程及階段劃分](https://file1.elecfans.com/web2/M00/AE/A4/wKgZomVJ41OAdwLVAAIdo04Wsto821.jpg)
ATF的啟動(dòng)過(guò)程介紹
![<b class='flag-5'>ATF</b>的<b class='flag-5'>啟動(dòng)</b>過(guò)程介紹](https://file1.elecfans.com/web2/M00/AC/D8/wKgaomVJ5oiAVyqCAARE1EfQ2uc433.jpg)
code層面 ATF中bl1的啟動(dòng)
![code層面 <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>1的<b class='flag-5'>啟動(dòng)</b>](https://file1.elecfans.com/web2/M00/AC/DB/wKgaomVJ69uAY4peAALjTJA6NFo855.jpg)
ATF中如何用函數(shù)完成bl2的啟動(dòng)
ATF中bl2到bl31的跳轉(zhuǎn)介紹
ATF中bl31的啟動(dòng)
![<b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>31的<b class='flag-5'>啟動(dòng)</b>](https://file1.elecfans.com/web2/M00/AC/DC/wKgaomVJ8KaAM_dEAAJ1Lv_7AeQ050.jpg)
評(píng)論