uboot簡介及分析

2021-07-22 20:11:08 字數 3349 閱讀 4604

1: uboot的作用:

在系統剛上電的時候,系統需要執行一段程式去初始化硬體,設定軟體執行環境,最後呼叫系統核心,這段程式就是uboot

在了解uboot過程之前我們要搞清楚,整個系統可以執行起來,從軟體上來看到底是有哪幾部分組成?

1)bootloader:引導程式,即上電之後就執行的第乙個程式

2)kernel:linux核心主要的功能有儲存管理、cpu和程序管理,檔案系統、裝置管理和驅動、網路通訊,以及系統的初始化(引導)、系統呼叫等

3)檔案系統。包括根檔案系統和建立在flash檔案裝置之上的檔案系統,裡面包含了系統能夠所執行的應用程式,庫等

4)應用程式

下面是linux系統中典型的區分結構

bootloader的兩個階段

1:彙編階段

硬體初始化

為第二階段執行準備ram空間

拷貝第二階段的**到ram空間

設定好堆疊

跳轉到c語言入口

2:c語言階段

必要的硬體初始化

檢測系統核心記憶體對映

將核心映像和根檔案系統從flash記憶體中

設定好核心啟動引數

呼叫核心

在uboot中呼叫核心需要下列條件滿足

1 暫存器設定

r0 = 0

r1 = 機器型別的id。對於arm 其機器型別的id可參考/linux/arch/arm/tools/match-types

r2 = 啟動引數標記列表在arm中的起始位址

cpu工作模式

svc模式

cpu必須禁止中斷

catch和mmu的設定

mmu 必須關閉

指令catch可以開啟可以關閉

資料catch必須關閉

如c語言可以如下呼叫核心

void (*thekernel)(int zero, int arch, u32 params_addr) = (void (*)(int, int, u32 ))kernel_ram_base

the_kernel(0, arch_number, (u32 )kernel_params_start)

bootloader啟動核心,引數傳遞

引數傳遞是單向的,只能從boot傳送給kernel。所以傳送辦法只有乙個,首先把傳送的引數存放在某個約定的地方,然後再啟動核心,核心啟動後從這個位址獲取引數。

這個引數存放的結構也是約定好的。核心2.4以後都期望是以標記列表的形式來存放啟動引數,標記列表以atag_core開始,atag_none結束。這個資料結構存放在linux核心原始碼/include/asm/setup.h

設定標記核心啟動引數:

比如uboot和核心約定引數存放位址為0x30000100,標記atag_core

params = (struct tag *)0x30000100

params->hdr.tag = atag_core;

params->hdr.size = tag_size(tag_core)

params->u.core.flags = 0;

params->u.core.pagesize = 0;

params->u.rootdev = 0;

params->tag_next(params);

#define tag_next  ((struct tag *)((u32 *)(t) +(t)->hdr.size))

設定記憶體標記:

假設記憶體起始位址為0x300000000, 大小為0x40000000記憶體標記如下

params->hdr.tag = atag_mem;

params->hdr.size = tag_size(tag_mem)

params->u.mem.start = 0x30000000;

params->u.mem.size = 0x4000000;

params = text_next(params);

設定命令列標記

例如:「root=/dev/mtdblock 2 init=/linuxrc console=ttysac0"表示根檔案系統在mtd2分割槽上,起來之後執行第乙個程式為linuxrc, 控制平台為ttysac0(即第乙個串列埠)

命令列通過如下標記傳給核心

char *p = 「root=/dev/mtdblock 2 init=/linuxrc console=ttysac0";

params->hdr.tag = atag_cmdline;

params->hdr.size = (sizeof(struct tag_header) + strlen(p) +1 + 4) >> 2;

strcpy(params->u.cmdline.cmdline, p);

params = text_next(params)

設定標記atag_none

params->hdr.tag = atag_none;

params->hdr.size = 0;

二: uboot **目錄結構:

1: uboot**總共有26個目錄結構,總體可以分為4類

(1)與平台相關的**。

(2)通用的函式

(3)通用的裝置程式函式

(4)工具相關的示例程式**,文件

u-boot

目錄結構主要經歷過2次變化,u-boot版本第一次從u-boot-1.3.2開始發生變化,主要增加了api的內容;變化最大的是第二次,從2010.6版本開始。

u-boot-2010.03

及以前版本

├──api 

存放uboot提供的介面函式

├──board 

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

├──common 

通用的**,涵蓋各個方面,已命令列處理為主

├──cpu 

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

├──disk 

磁碟分割槽相關**

├──doc 

文件,一堆readme開頭的檔案

├──drivers 

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

├──examples 

示例程式

├──fs 

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

├──include 

標頭檔案,已通用的標頭檔案為主

├──lib_【arch】 

與體系結構相關的通用庫檔案

├──nand_spl 

nand儲存器相關**

├──net 

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

├──onenand_ipl

├──post 

加電自檢程式

└──tools 

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

U Boot 移植簡介

u boot的介紹 u boot 是乙個依賴硬體的moniter 引導程式。其主要任務就是在系統上電瞬間,初始化硬體裝置,準備好軟體環境,最後呼叫 跳轉 到核心。所謂moniter 實際上是乙個增強型bootloader,為了除錯核心和軟體提供了條件。選擇u boot的理由 開放原始碼 支援多種嵌入...

U boot目錄簡介

u boot目錄簡介 1.檔案介紹 gitignore git是乙個版本管理工具 類似svn arm config.mk 字尾是.mk,是乙個makefile檔案,其他的makefile檔案可以呼叫。changelog 修改記錄檔案,記錄u boot專案的版本變遷以及每個版本較上版本的修改記錄。co...

uboot分析 uboot啟動核心

u boot啟動核心概述 u boot啟動完成後,最終進入到main loop 迴圈中。若在bootdelay倒計時為0之前,u boot控制台有輸入,則進入命令解析 執行的迴圈 若控制台無輸入,u boot將啟動核心。u boot啟動核心可歸結為以下四個步驟 1 將核心搬移至ddr中 2 校驗核心...