點擊上方藍色“混說Linux”,選擇“設為星標”
如下圖所示是嵌入式系統啟動流程圖,圖中紅色的數字圓點表示啟動的先后順序。主要分為4個階段,分別是第一階段 bootloader,第二階段uboot,第三階段內核啟動,第四階段app啟動。

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進行下一步處理。
uboot階段
首先對dram,flash,串口進行檢查,保障uboot的運行環境是ok的,同時為linux分配內存空間;接下來初始化網絡配置,包括mac地址的設置、通信端口的工作模式設置,可以讓用戶通過網絡加載程序;最后將linux從flash中復制到內存中,linux鏡像文件中包含內核、文件系統和設備管理樹(FDT)三個基本組件,uboot會根據設備管理樹定義的信息進行檢查,然后依次加載到內存中 。包括序號4~5,這個階段最后將linux加載后,就可以交接給內核進行操作。
內核啟動階段
主要負責創建進程、綁定進程、劃分內存、喚醒核1、加載文件系統等基本工作,包括序號6~13。首先會生成一個初始init0進程,后續創建的所有進程都是從該進程中產生,該進程還負責對內存和虛擬內存進行劃分,然后vfork出一個主核進程,綁定到核0上,接下來由cpu主核(核0)喚醒其他的核,從init進程vfork出副核進程,并將該進程綁定到核1上,最后是基于設備管理樹完成對系統中其他設備的初始化。
app啟動階段
這一階段主要對各類app應用進行初始化,如文中以通信設備為例,此處主要完成對轉發芯片的初始化,會涉及一些基礎轉發表項的初始配置,端口和各種通信總線的初始化。接下來會初始化中間件,中間件是作為應用程序和操作系統之間的橋梁,向下屏蔽操作系統的差異,向上為應用程序提供平臺化的技術支持;最后就是各種應用程序的初始化了,包括各種特性的初始化,心跳信息,單板信息,版本信息等等。日常工作中,最容易出問題的地方其實都是在app的啟動階段,這部分才是最應該做一個詳盡的圖出來,后續筆者有了具體的項目案例后將會補充該圖例。
轉自:https://blog.csdn.net/linus_ben/article/details/122709705