天天看點

uboot怎麼啟動Linux核心,Uboot的作用以及啟動核心的過程

uboot是用來幹什麼的,有什麼作用?

uboot 屬于bootloader的一種,是用來引導啟動核心的,它的最終目的就是,從flash中讀出核心,放到記憶體中,啟動核心

是以,由上面描述的,就知道,UBOOT需要具有讀寫flash的能力。

uboot是怎樣引導啟動核心的?

uboot剛開始被放到flash中,闆子上電後,會自動把其中的一部分代碼拷到記憶體中執行,這部分代碼負責把剩餘的uboot代碼拷到記憶體中,然後uboot代碼再把kernel部分代碼也拷到記憶體中,并且啟動,核心啟動後,挂着根檔案系統,執行應用程式。

uboot啟動的大過程是怎麼樣的?

uboot啟動主要分為兩個階段,主要在start.s檔案中,第一階段主要做的是硬體的初始化,包括,設定處理器模式為SVC模式,關閉看門狗,屏蔽中斷,初始化sdram,設定棧,設定時鐘,從flash拷貝代碼到記憶體,清除bss段等,bss段是用來存儲靜态變量,全局變量的,然後程式跳轉到start_arm_boot函數,宣告第一階段的結束。

第二階段比較複雜,做的工作主要是1.從flash中讀出核心。2.啟動核心。start_arm_boot的主要流程為,設定機器id,初始化flash,然後進入main_loop,等待uboot指令,uboot要啟動核心,主要經過兩個函數,第一個是s=getenv("bootcmd"),第二個是run_command(s...),是以要啟動核心,需要根據bootcmd環境變量的内容啟動,bootcmd環境變量一般訓示了從某個flash位址讀取核心到啟動的記憶體位址,然後啟動,bootm。

uboot啟動的核心為uImage,這種格式的核心是由兩部分組成:真正的核心和核心頭部組成,頭部中包括核心中的一些資訊,比如核心的加載位址,入口位址。

uboot在接受到啟動指令後,要做的主要是,1,讀取核心頭部,2,移動核心到合适的加載位址,3,啟動核心,執行do_bootm_linux

do_bootm_linux主要做的為,1,設定啟動參數,在特定的位址,儲存啟動參數,函數分别為setup_start_tag,setup_memory_tag,setup_commandline_tag,setup_end_tag,根據名字我們就知道具體的段記憶體儲的資訊,memory中為闆子的記憶體大小資訊,commandline為指令行資訊,

2,跳到入口位址,啟動核心

啟動的函數為the_kernel(0,bd->bi_arch_number,bd->bi_boot_param)

bd->bi_arch_number為闆子的機器碼,bd->bi_boot_param為啟動參數的位址