1、FSBL介紹
FSBL是STM32N6微控制器引導(dǎo)過程中的“第一階段引導(dǎo)加載程序”的簡稱,負責(zé)上電時系統(tǒng)的初始化、配置硬件,并將應(yīng)用程序代碼從外部Flash/ROM加載到內(nèi)部或外部存儲器中執(zhí)行。當系統(tǒng)復(fù)位時,引導(dǎo) ROM 遵循特定的步驟序列。 這段話似乎難以理解,我們接下來引用圖解。(本文以介紹和猜測為主暫無代碼驗證)
2、FSBL模式
STM32N6的存儲分布大體如圖所示,其中地址0x18000000起至0x1801FFFF為BOOTRAM對應(yīng)系統(tǒng)引導(dǎo)程序。
0x70000000之后為外部FLASH,F(xiàn)SBL的二進制文件從這里開始總共511KB。
這里的FSBL的二進制文件包含了代碼部分以及簽名頭,F(xiàn)SBL的二進制文件必須經(jīng)過簽名之后才可以被STM32的BOOTROM引導(dǎo)程序啟動。這缺少的1K空間就是給簽名用的。
之后我會出文章演示使用STM32CubeProgram進行文件簽名。
BOOTLoader會將FSBL代碼復(fù)制到搬運至內(nèi)部SRAM2,地址0x34180000中開始,因此這個地址非常的重要,代表著FSBL代碼區(qū),之后跳轉(zhuǎn)到FSBL代碼區(qū)運行。
這種方法的劣勢很多,主要是FSBL的空間只有511KB,想要擴大空間就需要參考接下來的模式。
3、FSBL+Appliction
在此基礎(chǔ)上,我們可以編寫主要的程序代碼,將其二進制文件燒錄至外部FLASH。
該模式下啟動步驟總共有四步:首先是BOOTLoader跳轉(zhuǎn)到外部FSBL代碼區(qū),將外部存儲的FSBL二進制文件拷貝到內(nèi)部存儲的0x34180000處。
FSBL開始執(zhí)行,然后拷貝Application的完整內(nèi)容到內(nèi)部SRAM。然后跳轉(zhuǎn)到APP代碼進行執(zhí)行。
這樣子做的好處是可以解決FSBL只能存放最多511KB代碼的問題。
因為內(nèi)部存儲的其他存儲空間(不包括0x34180000開始的FSBL代碼區(qū))可以用來存放Application的代碼,空間很大,在這種分配模式下,F(xiàn)SBL和Application的代碼量可以達到2MB。
4、就地執(zhí)行
第三種FSBL的啟動模式,F(xiàn)SBL+XiP(Execute in Place),顧名思義:就地執(zhí)行。
與前一種方法對比,F(xiàn)SBL+XiP不再將外部Flash的App代碼復(fù)制到內(nèi)部Flash中,而是在FSBL執(zhí)行后將程序指針設(shè)置為外部Flash中的APP代碼中的第一條開始執(zhí)行。當然這里是否能在外部Flash中存放多份代碼,多份執(zhí)行這里有待嘗試。
由于博主暫時沒試過這個功能,這里就不做過多贅述(博主需要仔細研究一下)
5、總結(jié)
總而言之,F(xiàn)SBL的作用主要是負責(zé)引導(dǎo)程序,用戶決定系統(tǒng)如何啟動。其通過密碼學(xué)算法校驗應(yīng)用程序的完整性和合法性,防止惡意代碼或篡改后的固件運行。STM32在代碼安全性中真的花了很大的功夫,不夠博主在代碼安全性方面真的概念不多,因此就只點一下。
應(yīng)用FSBL之后可以應(yīng)該實現(xiàn)引導(dǎo)程序的多樣化并且有很多應(yīng)用場景,例如無線升級之后,F(xiàn)SBL可以檢測代碼是否進行了升級決定啟動方式,以及可以設(shè)置兩份代碼區(qū),當主要代碼損壞之后運行備份代碼區(qū)等等功能。
當主程序超出內(nèi)部Flash容量時,F(xiàn)SBL負責(zé)將代碼從外部存儲器加載到RAM中執(zhí)行。
所以依據(jù)這些特性將FSBL理解足夠深透的話應(yīng)該可以實現(xiàn)很多很棒的功能,例如雙系統(tǒng)(裸機+RTOS)類似當電腦裝了雙系統(tǒng)之后上機的引導(dǎo)程序那樣子。
或者實現(xiàn)業(yè)務(wù)代碼和啟動邏輯的分離,修改FSBL而不影響主代碼的內(nèi)容。
當然更多的內(nèi)容和使用方法還有待繼續(xù)探索!