u-boot第二階段啓動流程分析

第一階段的初始化結束後進入start_armboot函數,也就是進入第二階段的初始化。下面來分析第二階段的主要流程。

在此之前,我們先來明確u-boot的目標,u-boot要做的事情是1、把內核中flash中讀出   2、啓動內核


248行,gd_t是一個結構體指針,保存一些全局變量,這條語句是給它分配一個內存空間

258行,init_sequence是一個函數指針,具體如下:

也就是用for語句依次初始化這些函數。



接下來是對flash的初始化。在開頭我們就說了u-boot的目標,所以得先對flash進行初始化,就是能夠實現flash的讀寫功能。



297行是對malloc的初始化,因爲u-boot是一個單片機程序,所以需要申請相應的內存空間

301行是nand flash的初始化

310行是對環境變量的初始化,其中環境變量有兩種。1、默認的  2、Flash上保存的。當u-boot啓動之後,先去flash上找是否有可用的環境變量,如果沒有話就使用默認的


在前面做了一些初始化之後,u-boot就擁有對flash的讀寫功能,也就是能把內核從flash中讀出。至於如何啓動,就是這個主循環要做的事情了。



在整個main_loop循環中,有兩個函數是最爲關鍵的。一個是432行的s = getenv ("bootcmd");其中bootcmd是一個環境變量,定義如下:

bootcmd=nand_read.jffs 0x30007FC0  kernel:bootm 0x30007FC0    

也就是把內核從nand_flash中kernle分區中讀到0x30007FC0這個地址   而第二條語句bootm 0x30007FC0是啓動內核。



第二關鍵的函數是444行的run_command (s, 0); 去執行各種讀到的命令。而整個u-boot的核心就是這個run_command函數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章