先看arm官網(wǎng)提供的一張圖:
上圖詳細(xì)概括了arm官方推薦的armv8的啟動(dòng)層次結(jié)構(gòu):
官方將啟動(dòng)分為了BL1,BL2,BL31,BL32,BL33階段,根據(jù)順序,芯片啟動(dòng)后首先執(zhí)行BL1階段代碼,接著驗(yàn)簽啟動(dòng)BL2,BL2根據(jù)具體設(shè)計(jì)啟動(dòng)BL31或者BL33,BL32只有在有BL31時(shí)才可能會(huì)存在并被驗(yàn)簽加載啟動(dòng)。
armv8分為Secure World和Non-Secure World(Normal World),四種異常級(jí)別從高到低分別為EL3,EL2,EL1,EL0。
? Secure World就是可以執(zhí)行可信的firmware和app,比如密碼支付,指紋識(shí)別等一系列依賴安全保證的服務(wù)。
? Non-Secure World就是我們常見的u-boot,linux,qnx等裸機(jī)程序或者操作系統(tǒng)。
? EL3具有最高管理權(quán)限,負(fù)責(zé)安全監(jiān)測(cè)和安全模式切換。
? EL2主要提供了對(duì)虛擬化的支持。
? EL1是一個(gè)特權(quán)模式,能夠執(zhí)行一些特權(quán)指令,用于運(yùn)行各類操作系統(tǒng),在安全模式則是可信任OS。
? EL0是無特權(quán)模式,所有APP應(yīng)用都在EL0。
上圖中的BL1,BL2,BL31,BL32,BL33分別對(duì)應(yīng)如下功能:
? BL1:是一切信任的根,一般就是固化在ROM中的一段啟動(dòng)加載代碼,用于引導(dǎo)bl2,并對(duì)bl2進(jìn)行驗(yàn)簽保證可信任執(zhí)行;
?BL2:一般是在flash中的一段可信安全啟動(dòng)代碼,它的可信建立在bl1對(duì)它的驗(yàn)證,主要完成一些平臺(tái)相關(guān)的初始化,比如對(duì)ddr的初始化等,并在完成初始化后尋找BL31或者BL33進(jìn)行執(zhí)行;如果找到了BL31則不會(huì)繼續(xù)調(diào)用BL33,如果沒有BL31則BL33必須有;
?BL31:BL31不像BL1和BL2是一次性運(yùn)行的,它作為最后一道可信任固件存在,在系統(tǒng)運(yùn)行時(shí)通過smc指令陷入EL3調(diào)用系統(tǒng)安全服務(wù)或者在Secure World和Non-Secure World之間進(jìn)行切換;在完成BL31初始化后會(huì)去尋找BL32或者BL33進(jìn)行驗(yàn)簽后加載執(zhí)行;
? BL32:OPTee OS + 安全app,它是一個(gè)可信安全的OS運(yùn)行在EL1并在EL0啟動(dòng)可信任APP(上述的指紋驗(yàn)證等app),并在Trust OS運(yùn)行完成后通過smc指令返回BL31,BL31切換到Non-Seucre World繼續(xù)執(zhí)行BL33;
? BL33:非安全固件,也就是我們常見的UEFI firmware或者u-boot也可能是直接啟動(dòng)Linux
kernel;啟動(dòng)BL1,BL2,BL31,BL32則是一個(gè)完整的ATF信任鏈建立流程(ARM Trusted Firmware),像常見的PSCI(Power State Coordination Interface)功能則是在ATF的BL31上實(shí)現(xiàn);
最后一張圖完整展示整個(gè)調(diào)用流程:
BL2根據(jù)是否存在BL31和BL32可選擇性的加載不同firmware;
綜上所述可知u-boot是一個(gè)運(yùn)行在非安全世界的bootloader,負(fù)責(zé)加載各類操作系統(tǒng),并提供豐富的驅(qū)動(dòng)接口;
并根據(jù)是否存在安全固件還可以進(jìn)行不同的boot流程,如下。
?u-boot,u-boot-spl,u-boot-tpl的關(guān)系:對(duì)于一般嵌入式而言只需要一個(gè)u-boot作為bootloader即可,但是在小內(nèi)存,或者有atf的情況下還可以有spl,tpl;
? spl:Secondary Program Loader,二級(jí)加載器
? tpl:Tertiary Program Loader,三級(jí)加載器
出現(xiàn)spl和tpl的原因最開始是因?yàn)橄到y(tǒng)sram太小,rom無法在ddr未初始化的情況下一次性把所有代碼從flash,emmc,usb等搬運(yùn)到sram中執(zhí)行,也或者是flash太小,無法完整放下整個(gè)u-boot來進(jìn)行片上執(zhí)行。
所以u(píng)-boot又定義了spl和tpl,spl和tpl走u-boot完全相同的boot流程,不過在spl和tpl中大多數(shù)驅(qū)動(dòng)和功能被去除了,根據(jù)需要只保留一部分spl和tpl需要的功能,通過CONFIG_SPL_BUILD和CONFIG_TPL_BUILD控制;
一般只用spl就足夠了,spl完成ddr初始化,并完成一些外設(shè)驅(qū)動(dòng)初始化,比如usb,emmc,以此從其他外圍設(shè)備加載u-boot,但是如果對(duì)于小系統(tǒng)spl還是太大了,則可以繼續(xù)加入tpl,tpl只做ddr等的特定初始化保證代碼體積極小,以此再次從指定位置加載spl,spl再去加載u-boot。
從目前來看,spl可以取代上圖中bl2的位置,或者bl1,根據(jù)具體廠商實(shí)現(xiàn)來決定,有一些芯片廠商會(huì)將spl固化在rom中,使其具有從emmc,usb等設(shè)備加載u-boot或者其他固件的能力。
當(dāng)然在有atf的情況下可以由atf加載u-boot,或者由spl加載atf,atf再去加載u-boot。
甚至在快速啟動(dòng)的系統(tǒng)中可以直接由spl啟動(dòng)加載linux等操作系統(tǒng)而跳過啟動(dòng)u-boot;
在上圖中arm官方只是給出了一個(gè)建議的啟動(dòng)信任鏈,具體實(shí)現(xiàn)都需要芯片廠商來決定;
后續(xù)分析啟動(dòng)流程中會(huì)在具有SPL和TPL的地方拓展它們的分叉執(zhí)行路徑盡量把SPL和TPL的功能也一并分析;
-
芯片
+關(guān)注
關(guān)注
452文章
50206瀏覽量
420896 -
ARM
+關(guān)注
關(guān)注
134文章
9027瀏覽量
366479 -
Uboot
+關(guān)注
關(guān)注
4文章
125瀏覽量
28125 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1006瀏覽量
21292
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論