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