天天看點

omapl138移植uboot系列之uboot SPL階段原理分析(第二篇)

2.2  uboot SPL階段

    自2012年以後,uboot分為了uboot-spl和uboot兩個組成部分。SPL即Secondary Program Loader的簡稱,第二階段程式加載器,這裡所謂的第二階段是相對于SOC中固化ROM中的啟動,即RBL(ROM BootLoader)。 

2.2.1 為什麼uboot要增加SPL

    一般廠商固化的RBL上電後會通過相關的硬體引腳電平來判斷開發者期望他去加載UBL(User BootLoader)的方式,比如eMMC、MMC/SD、SPI Flash、NandFlash、NorFlash等,由于在上電初期,DDR還未初始化,這個階段UBL是被加載到Soc的片上RAM來去執行的,然而RAM是很貴的,SocRAM一般在4K~128K左右,Soc廠商是不會把RAM的空間做到足夠容納整個Uboot的。

    以三星的S3C2440為例,S3C2440處理器的内部RAM隻有4K位元組,但對于uboot編譯出的可執行檔案來說,肯定是不夠用的,當然uboot也是可以裁剪的,你也可以将uboot裁剪到4K以内,不過我不建議你這麼做,因為以犧牲uboot的一些調試功能為代價,這樣得不償失,Linux環境下的調試本身就極為複雜,當你調試闆卡的時候更能體會這點。

    在沒有SPL之前,S3C2440上電後,RBL将NandFlash中的前4K資料(也即uboot的前4K)搬移至内部RAM,這時RAM中的uboot代碼并不是完整的,不過也沒關系,根據程式運作的局部性,隻要我們在RAM有限的空間裡能夠執行到代碼重定位部分即可,這也是uboot的連結腳本中要把start.o連結到代碼段最前端的原因,因為uboot的代碼重定位必須要在前128K代碼裡完成。

  自從有了SPL後,Uboot再也不用再自己給自己重定位了,即Uboot的連結位址就是它最後要運作的位址了,這個啟動過程變為了上電後,RBL去加載存儲媒體中的SPL,SPL初始化Uboot的運作環境後(如初始化DDR、時鐘等必要外設),再去存儲媒體中加載uboot至DDR連結位址處,然後跳轉至DDR去運作uboot。

2.2.2 為什麼我們不需要SPL

    uboot作為一款通用bootloader,需要照顧到大多數的處理器,對于一些早期的處理器,SPL是很有用的,對于類似omapl138處理器來說,SPL就顯得沒神馬必要了。

    因為在omapl138處理器上的代碼重定位根本不需要我們使用者來做,如果你領會了上一節的内容,那麼就應該知道需要做重定位的處理器都滿足以下兩個特征:

  1. 上電DDR需要使用者的bootloader進行初始化
  2. 上電後可執行檔案不能直接被加載到連結位址

    以上兩個特征,omapl138都不滿足,還記得我們的AIS工具嗎?如果你對TI的AIS已經有所了解,你就會明白omapl138為什麼可以不需要SPL和代碼重定位,這裡就不再講解了。

    既然uboot出了SPL這個功能,我們就緊跟一下時代的步伐,體驗一下總是沒有壞處的嘛。

繼續閱讀