1:bl0 bl1 bl2分別是什麼
(1)bl0:s5pv210的irom中固化的**
作用:初始化系統時鐘,設定看門狗,初始化棧,載入bl1
(2)bl1:從外部啟動介質(nand/sd卡)中載入的uboot.bin的前16k**
作用:初始化ram,關閉cache,初始化ddr,設定棧,載入bl2
(3)bl2:是指在**完成重定位後在ddr中執行的完整的uboot**
作用:初始化其他外設,載入os核心
三者的關係:開機上電自動執行bl0的**,然後載入bl1到sdram中,接著通過重定位將bl2載入到ddr中,最終uboot啟動完成,載入核心到ddr中
2:uboot的啟動過程
下圖是三星公司推薦210的啟動過程
三星推薦的啟動過程也是開機上電自動載入bl1,然後執行bl2,引導有、核心的啟動,需要注意的三星推薦的啟動過程中bl1和bl2都是放在sdram(96k)中的,但是隨著uboot的發展uboot的大小已經超過了96k,所以bl2不能再放在sdram中,而是通過bl1重定位到ddr中
3:uboot啟動時第一階段做了哪些事情
uboot啟動的入口函式是start.s,所以根據start.s這個檔案中的**去分析uboot啟動的第一階段。
(1)通過#include載入相應的標頭檔案
(2)通過彙編偽指令.word定義4個4位元組的變數,作用是為後面的計算校驗和填充佔位,確保image的頭部有16位元組的頭資訊,如果沒有,則uboot會列印出 sd checksun error
(3)構建異常向量表,但是由於uboot的啟動時間很短,異常發生的較少,所以並沒有很細緻地處理各種異常,當異常發生時重啟即可
(4)通過操作cpsr程式狀態暫存器設定soc為svc模式
(5)通過讀取0xe0000004暫存器的值來判斷啟動介質,0xe0000004暫存器的值會根據om0-om5這6 個引腳的電平高低自動設定,通過讀取這個暫存器的值就可以得到uboot從**啟動
(6)設定棧,此時執行的**是bl1,是在sdram中執行的,還有一點需要注意的是arm都是滿減棧,也就是入棧時是向下延伸的
(7)呼叫lowlevel_init函式,這個函式裡面主要是 檢查復位狀態(熱啟動 冷啟動 睡眠喚醒),復位後io口的儲存和恢復,關看門狗,開發板供電鎖存,初始化時鐘,初始化ddr,並在返回start.s之前
列印字元'ok
',需要注意的是,lowlevel_init函式中有一段**用來判斷當前執行位置是在ddr還是sdram,其原理是通過比較執行位址和鏈結位址是否相同,而且它判斷的是執行位址和鏈結位址的第12位開始的12位是否相同
ldr r0, =0xff000fff
bic r1, pc, r0 /* r0
ldr r2, _text_base /* r1
bic r2, r2, r0 /* r0
cmp r1, r2 /* compare r0, r1
beq 1f /* r0 == r1 then skip sdram init */
bic r1, pc, r0 的意思就是把pc中和r0對應的1改為0,0改為1,並存入暫存器r1中,也就是將r0取反在和pc相與 r1 = pc & (~(r0)) 如果相等則說明當前執行在ddr中,那麼就不需要進行時鐘和ddr的初始化,如果不相等則說明當前執行在sdram中,就需要進行時鐘和ddr的初始化。
列印出來的字元'ok',是一種除錯資訊,如果啟動ubooot看到ok 則說明是呼叫lowlevel_init後面的錯誤,如果沒有看到ok則說明是在呼叫這個函式之前。在進行移植的時候也可以使用類似的方法在函式呼叫之間通過列印相應的字元來判斷錯誤發的位置。
(8)再次設定開發板供電鎖存,沒實際意義
(9)在ddr中設定棧,原因是在lowlevel_init函式中已經對ddr進行了初始化,這時候的ddr是可用的
(10)再次判斷當前執行位置是在sdram還是ddr,其方法還是一樣,其目的是為了判斷是否需要進行重定位
(11)虛擬位址對映
(12)第三次設定棧,這次設定棧的為了充分合理地使用記憶體(安全,緊湊不浪費記憶體)
(13)清bss段
(14)uboot第一階段的最後一句:ldr pc, _start_armboot指標指向_start_armboot這個函式,也就是uboot啟動的第二階段的入口函式。
uboot移植 uboot啟動回顧
一 uboot啟動的第一階段start.s 路徑uboot cpu s5pc11x start.s 1 include 標頭檔案包含,config.件原始碼中不存 在,配置後自動生成 路徑 include linux config.h 2 include 標頭檔案包含,version.件原始碼中不存...
u boot移植詳解 初識u boot
u boot是一種普遍用於嵌入式系統中的bootloader。bootloader是基於特定硬體平台來實現的,因此幾乎不可能為所有的嵌入式系統建立乙個通用的bootloader,不同的處理器架構都有不同的bootloader,bootloader不但依賴於cpu的體系結構,還依賴於嵌入式系統板級裝置...
uboot移植之uboot和kernel的引數傳遞
從uboot啟動核心的形式thekernel 0,machid,bd bi boot params 可以看出uboot給核心傳遞了3個引數,第1個是0,第2個是機器碼,第3個是引數列表在sdram的起始位置 剛好滿足一下呼叫核心的條件 r0 0。r1 機器型別id r2 啟動引數標記列表在ram 中...