接開BIOS開機程式的神秘面紗, U-Boot SPL真面目

啥是SPL

SPL:

Secondary programloader。

顧名思義,SPL並不是一個程式的終結點,它的使命是為了載入第二階段的程式。第二階段的程式可以是U-Boot,也可以是Kernel。我們都知道,U-Boot可以直接引導,那麼為什麼還需要SPL呢?那是因為有的SoC內部RAM非常的小,不足以讓幾百KB的U-Boot直接執行,此時需要一個更小的程式將外部SRAM初始化好,然後將U-Boot load到外部SRAM去執行。這,便是SPL存在的主要意義。當然,在開發除錯階段,也可以使用SPL直接load kernel,減去U-Boot的執行時間提高程式碼除錯的效率。

一個SoC完整的啟動流程如下:

接開BIOS開機程式的神秘面紗, U-Boot SPL真面目

怎麼編譯出SPL

必須定義CONFIG_SPL才能編譯出spl的bin,一般在“include/configs/${CONFIG_NAME}。h”中定義。或者在選單配置介面進行選擇CONFIG_SPL選項,使能後就會定義 CONFIG_SPL_BUILD。SPL和U-Boot會存在使用相同程式碼的情況,此時透過CONFIG_SPL_BUILD選項來控制編譯。

接開BIOS開機程式的神秘面紗, U-Boot SPL真面目

透過Makefile檔案可以再深入瞭解spl是怎麼編譯的,頂層Makefile檔案的1330行進行了定義。透過指令碼資料夾下的Makefile。spl檔案定義spl的具體編譯方式。

接開BIOS開機程式的神秘面紗, U-Boot SPL真面目

編譯出的可執行檔案在根目錄的spl資料夾下。

SPL的執行流程

因為SPL屬於U-Boot的一部分,故此前半部分的彙編部分程式碼基本相同,唯一最大的區別是SPL程式中的異常處理程式中,不能有任何的實際異常處理操作,一旦發生異常便陷入到死迴圈中。

接開BIOS開機程式的神秘面紗, U-Boot SPL真面目

C程式部分的執行情況,可透過CONFIG_SPL_BUILD選項來控制。具體的執行流程如下圖所示:

接開BIOS開機程式的神秘面紗, U-Boot SPL真面目

我們知道U-Boot最終會進入到main_loop中執行命令列,或者執行shell,或者載入kernel。SPL最後的跳轉入口和U-Boot不同,在board_init_r中它根據引數的不同會選擇載入U-Boot或kernel。

接開BIOS開機程式的神秘面紗, U-Boot SPL真面目