• 正文
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

飛凌嵌入式ElfBoard ELF 1板卡-uboot啟動流程分析之uboot啟動階段

05/30 09:25
335
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

uboot啟動可分為匯編語言執(zhí)行和C語言執(zhí)行兩個階段,兩個階段以_main函數(shù)為分界。

uboot第一階段由_start (arch/arm/lib/vectors.S)進入,然后跳轉(zhuǎn)到reset(arch/arm/cpu/armv7/start.S)函數(shù), reset函數(shù)進行設(shè)置CPU運行模式,關(guān)閉中斷等一系列CPU內(nèi)部環(huán)境初始化后,跳轉(zhuǎn)到_main函數(shù)。

第二階段通過_main函數(shù)進入,_main主要做了如下功能:

一、設(shè)置C代碼的運行環(huán)境,為調(diào)用board_init_f接口做準備:

(一)設(shè)置堆棧(C代碼的函數(shù)調(diào)用,堆棧是必須的);

(二)調(diào)用board_init_f接口,從堆棧開始的地方,為u-boot中g(shù)lobal data數(shù)據(jù)結(jié)構(gòu),分配空間;

(三)調(diào)用board_init_f_init_reserve接口,對gd進行初始化;

二、調(diào)用board_init_f函數(shù),完成一些前期的初始化工作,例如:

(一)設(shè)置gd結(jié)構(gòu)體中各成員在內(nèi)存中的地址,包括環(huán)境變量地址、uboot重定位的地址;

(二)串口初始化,打印板卡信息;

三、根據(jù)board_init_f 指定的uboot重定位的地址,執(zhí)行u-boot的relocation重定位操作。

四、清除BSS段。

五、調(diào)用board_init_r函數(shù),執(zhí)行后續(xù)的板級初始化操作,包括各種外設(shè)接口、中斷、環(huán)境變量等。最后調(diào)用run_main_loop()函數(shù),進入倒計時等待,等待超時后執(zhí)行bootcmd啟動內(nèi)核。

具體流程如下圖:

相關(guān)推薦