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:



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。


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

發佈了36 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章