(一)u boot啟動流程分析

2021-08-11 05:40:26 字數 1935 閱讀 9601

u-boot是標準的開放原始碼,主要的作用是系統引導。uboot支援多種嵌入式作業系統核心,如linux、netbsd, vxworks, qnx, rtems, artos, lynxos, android

,支援多個處理器系列,如powerpc、arm、x86、mips

。根據具體的專案情況,我們需要修改

uboot**,來支援實際的專案需求。u

大多數bootloader都分為stage1和stage2兩大部分,u-boot也不例外。依賴於cpu體系結構的**(如裝置初始化**等)通常都放在stage1且可以用組合語言來實現,而stage2則通常用c語言來實現,這樣可以實現複雜的功能,而且有更好的可讀性和移植性。

1、 stage1(組合語言部分)

u-boot的stage1**通常放在start.s檔案中,它用組合語言寫成,其主要**部分如下:

(1) 定義入口。由於乙個可執行的image必須有乙個入口點,並且只能有乙個全域性入口,通常這個入口放在rom(flash)的0x0位址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改聯結器指令碼來完成。

(2)設定異常向量(exception vector)。

(3)設定cpu的速度、時鐘頻率及中斷控制暫存器。

(4)初始化記憶體控制器 。

(5)將rom中的程式複製到ram中。

(6)初始化堆疊 。

(7)轉到ram中執行,該工作可使用指令ldrpc來完成。

2、 stage2(c語言**部分

lib_arm/board.c中的start armboot是c語言開始的函式,也是整個啟動**中c語言的主函式,同時還是整個u-boot(armboot)的主函式,該函式主要完成如下操作:

(1)呼叫一系列的初始化函式。

(2)初始化flash裝置。

(3)初始化系統記憶體分配函式。

(4)如果目標系統擁有nand裝置,則初始化nand裝置。

(5)如果目標系統有顯示裝置,則初始化該類裝置。

(7)進入命令迴圈(即整個boot的工作迴圈),接受使用者從串列埠輸入的命令,然後進行相應的工作。

u-boot**架構

├── api                 存放uboot提供的介面函式

├── arch               與體系結構相關的**,uboot的重頭戲

├── board             根據不同開發板定製的**,**也不少

├── common         通用的**,涵蓋各個方面,已命令列處理以及環境變數為主

├── disk                磁碟分割槽相關**

├── doc                文件,一堆readme開頭的檔案

├── drivers            驅動,很豐富,每種型別的裝置驅動占用乙個子目錄

├── examples         示例程式

├── fs                   檔案系統,支援嵌入式開發板常見的檔案系統

├── include            標頭檔案,已通用的標頭檔案為主

├── lib                   通用庫檔案

├── nand_spl         nand儲存器相關**

├── net                 網路相關**,小型的協議棧

├── onenand_ipl

├── post               加電自檢程式

└── tools              輔助程式,用於編譯和檢查uboot目標檔案

根據這些基本資訊,我們知道了,u-boot主要分為兩部分功能,且分別由彙編與c實現,具體這兩部分,我們在後面兩節,結合**詳細學習。

參考:

Uboot啟動流程分析

uboot是嵌入式系統中最常用的bootloader,這裡我們以s3c2410為例分析一下uboot的啟動流程。首先通過uboot的鏈結檔案,我們可以看到uboot執行是執行的第一段 在start.s中。entry start sections align 4 rodata align 4 data...

u boot的啟動流程分析(一)

這週翻了翻u boot xilinx的原始碼,結合著網上看的對cortexa8 a9的u boot的原始碼分析,再結合自己在xilinx上下的u boot原始碼,試著對u boot的啟動流程進行一下分析,也給自己理一下思路。u boot原始碼的目錄結構 第一階段 1 start.s arch arm...

u boot啟動流程(一)

arch arm cpu armv7 start.s 這裡要看你用的是什麼樣的cpu,我用的contex a5,所以在armv7目錄下 set stackpointer in internal ram to call board init f call board init f ldr sp,con...