開發板:dm3730
虛擬機器:ubuntu
14.04
編譯器:arm-none-linux-gnueabi
x-loader:
這幾天小小的研究了一下linux的啟動機制 所裡這裡做個小小的總結吧
現在一般的晶元的linux啟動機制是這樣的
上電自執行romcode也就是在rom裡固化的**
romcode啟動後會根據sys_boot[5:0]的值來去選擇從nand,nor,mmc,usb,uart之類的模式啟動 也就是啟動x-load/mlo
x-load的主要功能就是去nand,mmc之類的mem讀取uboot到記憶體上執行
具體為什麼要這麼做我還沒到這個境界 現在的程度只能知道他的機制就是這麼做
x-load的**我覺得很像uboot,在我看來就是乙個小型的uboot而已 只不過uboot啟動的是kernel,而x-load啟動的的uboot
話不多說 上來就是看**好吧 理論也扯完了
x-load一開始跑的函式是start_armboot
void start_armboot (void)
}/* uart boot */
#ifdef start_loadb_download
do_load_serial_bin (cfg_loadaddr, 115200);
#else
/* 相關單板的ii2,led初始化 在o***單板上沒有任何作用 */
misc_init_r();
/* cfg_loadaddr=0x80008000 應該是ram位址 */
buf = (uchar*) cfg_loadaddr;
/* always first try mmc without checking boot pins */
#ifndef config_omap3_beagle
if ((get_mem_type() == mmc_onenand) || (get_mem_type() == mmc_nand))
#endif /* config_omap3_beagle */
/* 先嘗試從mmc啟動 */
buf += mmc_boot(buf);
/* 判斷是否從nand啟動 */
if (buf == (uchar *)cfg_loadaddr)
}/* 判斷是否從onenand啟動 */
if (get_mem_type() == gpmc_onenand)}}
/* 和我們的omap單板無關 */
#if defined (config_am3517evm)
/* * fixme: currently coping uboot image,
* ideally we should leverage xip feature here
*/if (get_mem_type() == gpmc_nor)
#endif
/* 如果從mmc,nand,onenand都啟動了 那就懸掛*/
if (buf == (uchar *)cfg_loadaddr)
hang();
#endif
/* 執行uboot */
/* go run u-boot and never return */
printf("starting os bootloader...\n");
((init_fnc_t *)cfg_loadaddr)();
/* should never come here */
}
大概的執行過程就這樣了 其他無非就是nand mmc的初始化 讀取函式罷了 uboot第二階段啟動流程
include typedef unsigned long ulong typedef struct environment s env t typedef struct bd info bi dram 1 bd t int main int argc,const char argv include...
u boot第二階段分析(二)
接著上一章節的內容,繼續往下分析start armboot函式 1.for迴圈執行init sequence 如下 for init fnc ptr init sequence init fnc ptr init fnc ptr 分析 1 init fnc ptr二重指標指向了init sequen...
u boot第二階段分析(一)
一 start armboot函式簡介 start armboot函式是乙個長函式,在uboot lib arm board.c的第444 908行,其中也呼叫了其他函式,共同構成了u boot的第二階段。1.第二階段的主要工作 我們之前已經分析過了第一階段,主要是初始化了soc內部的一些部件和初始...