MIPS之u boot流程分析

2021-07-26 00:13:45 字數 2534 閱讀 7057

1、  系統上電後

由uboot的鏈結檔案\u-boot\arch\mips\cpu\u-boot.lds知

entry(_start)程式入口點是\u-boot\arch\mips\cpu\xburst\start.s

2、   由la  t9, board_init_f   知跳轉到board_init_f  函式(\u-boot\arch\mips\lib\board.c)

主要工作:初始化記憶體

3、  回到\u-boot\arch\mips\cpu\xburst\start.s  執行relocate_code:

4、執行la       t9, board_init_r  跳轉到board_init_r  函式(\u-boot\arch\mips\lib\board.c)

主要工作:board_early_init_r();

serial_initialize();

env_relocate();

stdio_init();

console_init_r();

最後進入main_loop(); 跳轉到\u-boot\common\main.c

5、  執行main.c 

p = getenv("preboot");   取得環境變數中的啟動命令  

run_command_list(p,-1, 0);  執行這個命令列

len = readline(config_sys_prompt);  讀取uboot模式下的命令

main.c**

void main_loop(void)

; int len;

int rc = 1;

int flag;

#endif

#ifdef config_preboot

char *p;

#endif

bootstage_mark_name(bootstage_id_main_loop, "main_loop");

#ifdef config_modem_support

debug("debug: main_loop: do_mdm_init=%d\n", do_mdm_init);

if (do_mdm_init)

#endif /* config_modem_support */

#ifdef config_version_variable

#endif /* config_version_variable */

#ifdef config_sys_hush_parser

u_boot_hush_start();

#endif

#if defined(config_hush_init_var)

hush_init_var();

#endif

#ifdef config_preboot

p = getenv("preboot"); //從環境變數中取得命令列

if (p != null)

#endif /* config_preboot */

#if defined(config_update_tftp)

update_tftp(0ul);

#endif /* config_update_tftp */

#ifdef config_bootdelay

process_boot_delay();

#endif

/* * main loop for monitor command processing

*/#ifdef config_sys_hush_parser

parse_file_outer();

/* this point is never reached */

for (;;);

#else

for (;;)

#endif

len = readline (config_sys_prompt); //讀取命令

flag = 0; /* assume no special flags for now */

if (len > 0)

strcpy (lastcommand, console_buffer); //儲存輸入的資料

else if (len == 0)

flag |= cmd_flag_repeat; //如果輸入資料為零,則重複執行上次的命令,如果上次輸入的是乙個命令的話

#ifdef config_boot_retry_time

else if (len == -2)

#endif

if (len == -1)

puts ("\n");

else

rc = run_command(lastcommand, flag); //執行命令

if (rc <= 0)

}#endif /*config_sys_hush_parser*/

}

u boot 啟動流程(mips)

u boot的啟動過程比較簡單,大致做下面的工作 1 cpu初始化 2 時鐘,串列埠,記憶體 ddr ram 初始化 3 記憶體劃分,分配棧,資料,配置引數,以及u boot 在記憶體中的位置。4 對u boot 做relocate 5 初始化 malloc,flash,pci 以及外設 比如,網口...

UBoot流程分析

uboot程式分析 程式入口分析 第一階段bl1程式分析 第二階段bl2程式分析 解壓uboot原始碼,開啟頂層makefile,每個uboot所支援的開發板在makefile中都會有乙個配置選項,在e uboot board samsung smdk2440,有乙個uboot.lds鏈結器指令碼檔...

基於mips架構的uboot啟動流程(3)

要注意mips具有流水線可見性,所以跟在跳轉指令後的下一條指令,在執行跳轉到的地方前,都會執行,這個叫分支延遲。但是編譯器會隱藏該特性,但可以通過設定 set noreorder 來禁止編譯器重新組織 順序。每個板子都有自己的lds檔案。這個主要是用來說明編譯生成的指令,及執行過程中用到的資料放置的...