天天看點

u-boot關于啟動流程

1.關于啟動流程

1.1 啟動階段分為3個,bl0,bl1,bl2。下面隻是就功能方面對它們做說明,實際設計的時候,也許會對其具體功能做出調整,也就是說,這幾個階段的劃分是就功能而言的,不能看得太死。

      bl0:出廠的時候就固化在irom中一段代碼,主要負責拷貝8kb的bl1到s5pv210的一個96kb大小内部sram(Internal SRAM)中運作。值得注意的是s5pv210的Internal SRAM支援的bl1的大小可以達到16kb,容量的擴增是為了适應bootloder變得越來複雜而做的。雖然如此,但目前我們制作出來的bl1的大小仍然可以保持在8kb以内,同樣能滿足需求。

      bl1:u-boot的前8kb代碼(s5pv210也支援16kb大小,原因上一點提過了),除了初始化系統時鐘和一些基本的硬體外,主要負責完成代碼的搬運工作(我設計成搬運bl1+bl2,而不僅僅是bl2),也就是将完整的u-boot代碼(bl1+bl2)從nand flash或者mmcSD等的存儲器中讀取到記憶體中,然後跳轉到記憶體中運作u-boot。

      bl2:完成全面的硬體初始化和加載OS到記憶體中,接着運作OS。

上述幾個階段的流程描述在s5pv210_irom_application手冊中有較長的描述。見下圖1:

u-boot關于啟動流程

圖1

1.2 首先把啟動部分的代碼分為3部分,以start.S為主,另外還有lowlevel_init.S,mem_setup.S,ctr0.S。

      其中lowlevel_init.S主要是一部分硬體的初始化,尤其是系統時鐘和DRAM的初始化。如果u-boot一旦被搬運到記憶體中運作,那麼是必須要跳過時鐘和DRAM的初始化的,因為這在搬運之前已經做過了。并且如果代碼在記憶體中運作的時侯你卻去初始化DRAM,那必然導緻崩潰!

     mem_setup.S:DRAM初始化代碼和MMU相關代碼放在這個檔案中。

     ctr0.S:u-boot自帶的代碼檔案,存放彙編函數main。

1.3 啟動代碼相關的幾個檔案在u-boot中的路徑

    start.S:            /arch/arm/cpu/armv7/start.S (需要自己修改)

    lowlevel_init.S:/board/samsung/zsy210/ lowlevel_init.S  (需要自己修改)

    mem_setup.S:   /board/samsung/zsy210/ mem_setup.S   (u-boot沒有,需要自己添加)

    ctr0.S:            /arch/arm/lib/ctr0.S  (u-boot自帶,一般不需要修改)

2. 啟動過程原理

      必須要明白的一點是,當代碼從存儲媒體(nand flash,SD,norflash,onenand等)中搬運到了DRAM中後随即會跳轉到記憶體中運作u-boot,接着會有一個重定位(relocate_code)的過程,relocate_code子函數在start.S中,而給relocate_code子函數傳參數的是crt0.S中的main子函數。當判斷到目前u-boot在記憶體的低位址處,那麼relocate_code就會工作,把u-boot代碼從低位址處再搬運到記憶體位址的頂端,然後跳轉到新的位置去繼續運作u-boot。而搬運的目标位址是在board_init_f()函數(此函數在/arch/arm/lib/board.c中)中計算出來的,見圖2。

u-boot關于啟動流程

圖2

       下面,以start.S為主線,畫出了其程式流程圖,圖中同樣也表現出啟動的整個流程和啟動代碼檔案間的組織關系。是以後面直接貼出start.S的完整代碼,大家結合流程圖相信都可以看明白,至于逐句彙編的分析不是本文的重點。見圖3.

u-boot關于啟動流程

 圖3