kbuild
啟動過程
第二階段
總結參考
對於uboot,我一直是雲裡霧裡的乙個狀態,這部分讓我感到自己很菜,不用縱向深入地掌握uboot整個細節,但是相對它有乙個整體流程上的把握,包括uboot的啟動啟動過程,在整個啟動過程中會涉及到哪些檔案,以此的呼叫過程是什麼?抱著這幾個問題,大量蒐集資料,包括閱讀了uboot原始碼,在一知半解的基礎上,有了進一步的認識。本文寫的並不深入,因為能力有限,從最快速的方式對uboot啟動有乙個整體的了解。
硬體無關的功能函式的api。uboot移植時基本不用管,這些函式是uboot本身使用的。
cpu架構的目錄。裡面放著很多子目錄,都是各種cpu架構。
板級相關配置檔案,針對不同平台的功能下具體的實現。
資料夾下放的是一些與具體硬體無關的普遍適用的一些**。譬如控制台實現、crc校驗的。但是更多的主要是兩類:一類是cmd開頭的,是用來實現uboot的命令系統的;另一類是env開頭的,是用來實現環境變數的。
實現uboot命令列下支援的命令,每一條命令都對應乙個檔案。例如bootm命令對應就是cmd_bootm.c
板級的驅動。這裡面放的就是從linux源**中移植過來的linux裝置驅動,主要是開發板上必須用到的一些驅動,如網絡卡驅動、inand/sd卡、nandflash等的驅動。要知道:uboot中的驅動其實就是linux中的驅動,uboot在一定程度上移植了linux的驅動給自己用。但是linux是作業系統而uboot只是個裸機程式,因此這種移植會有不同,讓我說:uboot中的驅動其實是linux中的驅動的一部分。同樣的uboot中的驅動也支援裝置樹。
檔案系統相關的**,這個也是從linux源**中移植過來的,用來管理flash等資源。
可以通過make menuconfig
進行uboot的基本配置。
uboot啟動主要分為兩個階段。
第一階段主要由start.s
執行並實現相應的初始化,定義程式入口位址,初始化cpu
,初始化記憶體,最後呼叫_main
到第二階段的板級別初始化部分。
第二階段主要是c語言編寫,對於硬體記憶體分配,初始化硬體裝置,串列埠初始化,顯示裝置初始化,執行環境初始化等等,最後啟動核心。
這裡主要會涉及到兩個彙編檔案,完成最底層的初始化。
start.s
路徑:arch/yourplatform/cpu/start.s
yourplatform
按照實際使用的平台進行選擇,如arm
,x86
,mips
這是乙個彙編檔案,如果分析的是arm
的平台,需要對arm
的指令集有簡單的了解。
crt0_64.s
路徑:arch/arm/lib/crt0_64.s
crt0
是c runtime startup
的簡稱,這部分程式主要完成c語言環境的初始化,最終會執行_main
函式,由於水平有限,這裡暫不對細節進行分析。
由於需要適配不同的硬體平台,提高可移植性和**的復用,這部分使用基本使用c語言,在common
下,board_f.c
和board_r.c
這兩個檔案基本包括了通用實現。初始化主要包括兩個部分,前置的初始化在board_f.c
中實現,後置的初始化在board_r.c
中實現。
board_f.c
主要分析一下board_init_f
函式,具體的**
void board_init_f(ulong boot_flags)
init_sequence_f
陣列中儲存了需要初始化的函式指標,所以板級初始化。
board_r.c
這裡和board_f.c
類似,主要有board_init_r
這個函式,完成板級的後置初始化,**如下:
void
board_init_r
(gd_t *new_gd, ulong dest_addr)
函式中通過initcall_run_list
執行initcall_run_list
列表中的函式,可以看一下init_sequence_r
包括了各種板級的初始化,最終執行run_main_loop
。
init_fnc_t init_sequence_r = ;
按照最快的方式熟悉uboot的原始碼,實現從uboot原始碼入門到入門,但是目前對於kbuild
中的配置和原始碼的對應關係並未做到有效的認識,所以如果需要進行uboot原始碼移植,單純掌握這些還是遠遠不夠的。以上的分析基本都是一筆帶過,沒有參雜任何的細節,後面需要通過實戰移植一波uboot然後加深對這塊知識的掌握和認識。 u boot啟動過程分析
備註 本文中使用的u boot版本是2010.3第一階段 初始化soc相關的配置,例如 系統時鐘 mmu 看門狗等 並為c語言提供執行環境1 第一階段 組合語言階段.globl start start b reset 復位異常 進入管理模式 復位電平有效時觸發 ldr pc,undefined in...
u boot啟動過程 1
u boot的啟動過程 1.start.s檔案 此彙編檔案是u boot啟動的第乙個檔案,首先確定是冷啟動還是熱啟動,boot cold or boot warm 通過對r21寫0x01 cold or ox02 warm 完成。接著在boot warm中 1 判斷是否定義config cogent...
u boot 啟動過程
u boot 分為兩個階段第一階段是彙編,入口是 arch arm cpu armv7 start.s,第二階段是 c 語言,入 口是 board.c 第一階段 1.異常向量表定義 2.設定 svc32 模式 arm 七種工作模式 3.呼叫 cpu init crit 進行 cpu 相關初始化 1 ...