uboot-2016
u-boot啓動分爲stage1和stage2兩個階段概述:
stage1通常是開發板的配置等設備初始化代碼,需要依賴於SoC體系結構,通常用彙編語言來實現。
stage2階段主要是對外部設備如網卡、Flash等的初始化以及u-boot命令集等的自身實現,通常用C語言來實現,這樣可以實現複雜的功能,而且有更好的可讀性和移植性。
u-boot的stage1代碼通常放在start.S文件中,用彙編語言寫成,其主要代碼部分如下:
(1) 定義入口。系統復位轉入u-boot的stage1入口點,通常這個入口放在rom(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。
(2)設置異常向量。
(3)設置CPU的速度、時鐘頻率及中斷控制寄存器。
(4)初始化內存控制器 ,爲stage2準備RAM空間。
(5)將u-boot的stage2拷貝到到RAM中。
(6)初始化堆棧 、數據段。
(7)轉到stage2的入口點。
stage2 (c語言代碼部分)
(1)初始化本階段使用的硬件設備。
(2)初始化系統內存。
(3)將kernel和文件系統映射從Flash讀取到RAM中。
(4)爲內核設置啓動參數。
(5)調用內核。
從stage1 到stage2
板級代碼早期初始化
在上一步通過ldr pc, =board_init_r指令進入u-boot-2016.05\common\board_r.c:board_init_r函數,進而調用initcall_run_list(init_sequence_r)函數執行一系列初始化函數以實現後半部分板級初始化,並在initcall_run_list函數裏進入run_main_loop不再返回。
包含如下代碼部分
詳細參考如下鏈接
https://www.2cto.com/kf/201607/527936.html