u boot 原始碼分析 1 啟動過程分析

2021-09-10 14:28:25 字數 2699 閱讀 4637

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

crt0c runtime startup的簡稱,這部分程式主要完成c語言環境的初始化,最終會執行_main函式,由於水平有限,這裡暫不對細節進行分析。

由於需要適配不同的硬體平台,提高可移植性和**的復用,這部分使用基本使用c語言,在common下,board_f.cboard_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 ...