一圖勝千言 秒懂嵌入式系統的啓動流程

一圖勝千言!看圖:

上圖是嵌入式系統啓動流程圖,圖中紅色的數字圓點表示啓動的先後順序。主要分爲 4 個階段,分別是:

第一階段 bootloader,

第二階段 uboot,

第三階段內核啓動,

第四階段 app 啓動

1、BootLoader 階段

主要完成第一階段系統的引導和初始化工作,包括序號 1~3。

系統上電後,首先是 cpu 開始工作,此時引導程序(通常是彙編代碼)從 ROM 被加載到 RAM 中,對 cpu 的寄存器進行初始化,啓動核 0,如果是核 1 或者其他核則處於休眠狀態,等待覈 0 在內核啓動正常後通過中斷或者事件將其喚醒(圖中 10 的位置)。

接下來就是完成 flash 和 ddr 初始化,爲後面從 flash 加載 bin 文件,在 DDR 中運行程序提供基本環境,一般情況下都是從 flash 爲 0 的位置,將 flash 中的 bootloader 鏡像文件加載到 RAM 或 DDR 中,該引導程序最終將 uboot 從 flash 複製到 DDR 中,然後交接給 uboot 進行下一步處理。

2、uboot 階段

首先對 dram,flash,串口進行檢查,保障 uboot 的運行環境是 ok 的,同時爲 linux 分配內存空間;接下來初始化網絡配置,包括 mac 地址的設置、通信端口的工作模式設置,可以讓用戶通過網絡加載程序;最後將 linux 從 flash 中複製到內存中。

linux 鏡像文件中包含內核、文件系統和設備管理樹 (FDT) 三個基本組件,uboot 會根據設備管理樹定義的信息進行檢查,然後依次加載到內存中 。包括序號 4~5,這個階段最後將 linux 加載後,就可以交接給內核進行操作。

3、內核啓動階段

主要負責創建進程、綁定進程、劃分內存、喚醒核 1、加載文件系統等基本工作,包括序號 6~13。

首先,會生成一個初始進程 init0,後續創建的所有進程都是從該進程中產生,該進程還負責對內存和虛擬內存進行劃分。

然後 vfork 出一個主核進程,綁定到核 0 上,接下來由 cpu 主核(核 0)喚醒其他的核,從 init 進程 vfork 出副核進程,並將該進程綁定到核 1 上。

最後是基於設備管理樹完成對系統中其他設備的初始化。

4、app 啓動階段

這一階段主要對各類 app 應用進行初始化,如文中以通信設備爲例,此處主要完成對轉發芯片的初始化,會涉及一些基礎轉發表項的初始配置,端口和各種通信總線的初始化。

接下來會初始化中間件,中間件是作爲應用程序和操作系統之間的橋樑,向下屏蔽操作系統的差異,向上爲應用程序提供平臺化的技術支持;最後就是各種應用程序的初始化了,包括各種特性的初始化,心跳信息,單板信息,版本信息等等。

日常工作中,最容易出問題的地方其實都是在 app 的啓動階段,這部分纔是最應該做一個詳盡的圖出來,後續筆者有了具體的項目案例後將會補充該圖例。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/ueHQzXc6Lyom_owB7Ju3Lw