1. 程式人生 > >uboot啟動第一階段——start.S

uboot啟動第一階段——start.S

一:引入start.S

    u-boot整個程式的入口取決於連結指令碼u-boot.lds中ENTRY宣告的地方。ENTRY(_start)因此 _start符號是整個程式的入口。

二:分析start.S

    

從SD卡和nand啟動是需要16位元組校驗頭(mkv210image.c就是為了計算這個校驗頭),dnw下載方式不需要校驗頭。這16位元組在目前只能起到佔位的功能,內容是不對的,還需要後面去計算校驗和填充。

構建異常向量表,這個異常表順序是CPU設計時決定的,是硬體決定的。這些異常應該被處理,如果不處理這些這些異常,程式會跑飛。復位異常的程式碼是 b reset ,因此在CPU復位後真正去執行的有效程式碼是reset處的程式碼,因此reset符號處,才是真正有意義程式碼的開始處。

異常處理程式指標。其中,.balignl 16,0xdeadbeef  .balignl 16 是以16位元組對齊,如果沒有對齊,用0xdeadbeef這個數字來填充,這個填充沒有什麼特別的意義。為什麼要對齊呢?有時候是為了提高訪問效率,有時候是硬體的要求。

TEXT_BASE在makefile配置階段@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk進行設定的。這就是我們指定程式的連結地址,這是一個虛擬地址。

CFG_PHY_UBOOT_BASE也是連結地址,但是和TEXT_BASE不同的是,CFG_PHY_UBOOT_BASE是實體地址。

armboot_start後面重定位的時候會用到。_bss_start是bss段的起始地址,_bss_end是bss段的結束地址。

後面就開始真正分析,啟動之後開始執行的程式reset

設定CPU執行SVC模式,禁止IRQ和FIQ。其實s5pv210上電預設就是在SVC模式,這裡用軟體重新設定一下,是為了保證程式碼的完整性,相容更多的硬體。

設定L2 cache

重新整理icache和dcache

關閉MMU

讀取啟動資訊,並且判斷啟動方式。最後將判斷出來的啟動方式存進專門用來儲存資訊的暫存器中。

在sram中設定棧指標,因為馬上要開始呼叫C語言函式

呼叫C語言函式,用於初始化底層外設,包括關看門狗、時鐘、DDR和串列埠。這部分完全屬於裸機層面的開發,這裡不展開分析。

這個是開發板供電鎖存,具體看開發板的設計,不用太糾結於此

再一次設定棧指標,由於之前已經初始化過DDR,因此現在可以將棧指標設定到DDR中,記憶體更大了。

判斷在sram中執行還是在DDR中執行,如果在sram中執行則表示冷啟動。冷啟動的情況下需要對程式碼進行重定位,反之不要。

判斷啟動方式,準備從啟動介質中將程式碼重定位到DDR中

假設我們是從SD卡中啟動uboot的,我們的程式就會跳轉到mmcsd_boot進行執行

這部分程式碼就是將uboot從SD卡中將程式拷貝到DDR中,然後跳轉到after_copy

設定轉換表基地址,並且使能MMU。以後再操作記憶體的時候,就將使用虛擬記憶體地址。

重新設定棧指標,這次將棧指標設定到uboot上方2MB的地方,使得記憶體規劃地更加緊湊,之後開始清理bss段。

萬事具備之後,使用一個遠跳轉,跳轉到DDR中去執行。

至此uboot第一部分的使命就結束了。