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 校驗核心...