uboot啟動linux核心流程分析(三)

2021-10-07 21:59:28 字數 2492 閱讀 8729

uboot bootz命令流程圖

uboot啟動linux核心是使用bootz命令,bootz是如何啟動linux核心?uboot的生命週期是怎麼終止的?linux是如何啟動?

啟動linux核心的時候都會用到乙個重要的區域性變數:images,images在檔案cmd/bootm.c中有定義。

images是bootm_headers_t型別的全域性變數,

bootm_headers_t是個boot頭結構體

os是image_info_t型別的,為系統映象資訊

全域性變數images在bootz命令的執行中頻繁使用,相當於linux核心啟動的靈魂。

bootz命令的執行函式為do_bootz,在cmd/bootm.c中定義

1、呼叫bootz_start函式,在cmd/bootm.c中定義(主要是初始化images相關的成員變數)

①呼叫函式do_bootm_states執行boot_state_start階段

②設定images的ep成員變數,也就是系統映象的入口點,使用bootz命令啟動時就會設定系統在dram中的儲存位置,這個儲存位置就是系統映象的入口點,因此images->ep=0x80800000。

③呼叫bootz_setup

函式,此函式會判斷當前的系統映象檔案是否為linux映象檔案,並且列印出映象的相關資訊。

定義巨集linux_arm_zimage_magic為armlinux系統魔術數,從傳遞進來的引數image(也及時系統映象首位址)中獲取zimage頭,判斷image是否為arm linux系統映象檔案,並列印相關資訊。

④呼叫bootm_find_images查詢ramdisk和裝置(dtb)檔案。

查詢裝置樹的起始位址和長度,並分別寫在images的ft_addr和ft_len成員變數中,我們使用bootz啟動linux時已經指明裝置樹在dram中的儲存位址,因此iamges.ft_addr=0x83000000

2、呼叫bootm_disable_interrupts函式  關閉中斷

3、設定iamges.os.os為ih_os_linux也就是設定系統映象為linux,表示我們要啟動的是linux系統,後面會呼叫images.os.os來挑選具體的啟動函式。

4、呼叫函式do_bootm_states來執行不同的boot階段。要執行的boot階段有:

①函式do_bootm_states根據不同的boot狀態執行不同的**段,通過

states&&boot_state_***

來判斷。

②通過函式

bootm_os_get_boot_func

來查詢系統啟動函式,引數iamges->os.os就是系統型別amges.os.os=ih_os_linux,所以linux

系統啟動函式為

do_bootm_linux=boot_fn

③處理bootm_state_os_prep狀態,呼叫do_bootm_linux,即呼叫boot_prep_linux,主要處理環境變數bootargs,bootargs儲存著傳遞誒linux kernel的引數。

④呼叫函式boot_selected_os啟動核心,此函式第4個引數是linux系統映象頭,第5個引數是linux系統啟動函式do_bootm_linux。

函式bootm_os_get_boot_func

中的boot_os

陣列裡面存放著不同系統對應的啟動函式 函式

do_bootm_linux 呼叫

boot_jump_linux

函式,變數

machid

儲存機器id,

linux

核心會在自己的機器

id列表中查詢是否存在與

uboot

傳遞來的

machid

匹配的專案,如果存在,則

linux

核心啟動,如果使用裝置樹,這個

machid

就無效,裝置樹具有相容性這個屬性。

當boot_jump_linux

函式呼叫

kernel_entry

函式,說明此函式進入

linux

核心,第乙個引數為

0,第二個引數為機器

id,第三個引數

atags

(傳統的方法)或者裝置樹的首位址。 獲取

kernel_entry

函式,該函式並不是

uboot

定義的,而是

linux

核心定義的,

linux

核心映象檔案的第一行**就是函式

kernel_entry

,而images->ep

儲存著linux

核心映象的起始位址,也就是

linux

核心的第一行**。

最後呼叫

announce_and_cleanup

函式列印一些資訊並做一些清理工作。

uboot啟動核心

假設bootcmd nand read.jffs2 0x30007fc0 kernel bootm 0x30007fc0 1 nand read.jffs2 0x30007fc0 kernel nand read.jffs2 0x30007fc0 kernel 從nand讀出核心 從 讀?從kern...

uboot啟動核心

經過了前面的的一系列準備,終於要啟動核心了。在uboot分析二中,提到過下面的這個函式 void main loop void 在啟動核心的時候在uboot裡面用到什麼命令呢?bootcmd 命令 nand.read.jffs 0x30007f00 kernel 從nand的kernel 分割槽讀核...

uboot啟動核心

uboot 映象為 uboot.bin,linux 映象為 zimage 嵌入式裝置中的分割槽表是自己定義的,uboot 和核心中的分割槽表應一致 核心執行前必須載入到 ddr 中指定的位址處 uboot 需要提供核心必要的引數 uboot 啟動核心有兩種方式,一種是等待倒計時結束後直接啟動核心,一...