uboot啓動過程(代碼流程)

uboot啓動過程:
第一階段(彙編):(boot/fastboot/arch/arm/cpu/hi3798mx/start.S)//不同系統目錄位置可能不同
-------->.../* 硬件相關初始化 */
        ldr pc, _start_armboot -->跳轉到第二階段
            第二階段(C語言)
            ------->start_armboot():(boot/fastboot/arch/arm/lib/board.c)
                    設備外設的初始化
                    Android的recovery系統相關也在此。
                    logo顯示也放於此
                    ...
                    main_loop():進入命令循環檢測
                        --------> (處理環境變量和控制檯人機交互) 
                                1.生成環境變量mtdparts, 調用mtdparts_init
                                2.在啓動過程中
                                若無空格鍵按下則boot_zImage,即run_command(getenv("bootcmd"),0)--->讀取內核存儲位置
                                有空格鍵按下則 run_command("menu",0)
                                3.shell過程,讀取用戶的輸入並執行相應的命令
                                  {
                                     從控制檯獲得命令,保存在全局變量console_buffer中
                                     解析命令行字符串,分割命令與參數,最後執行 run_command(...);
                                  }   
                        //*----------------------------------------------------------------------------------------------------------
                        run_command讀取控制檯bootcmd:
                                例如:bootcmd='sf read 1000000 100000 700000;bootm 1000000'
                                    第一條命令  從flash上讀出內核   kernel是一個分區標誌
                                    第二條命令  啓動命令指示了啓動地址:bootm addr
                        ---------------------------------------------------------------------------------------------------------*//
                                進入run_command()中
                                    ---->find_cmd()在“u_boot_cmd”段找到bootm命令
                                    ---->"bootm"命令的執行函數爲do_bootm()
                                             ---->重啓函數表;
                                             ---->檢查是否有子命令;
                                             ---->bootm_start(cmdtp, flag, argc, argv)://獲取鏡像的信息並存入images
                                             ---->disable_interrupts();//禁用中斷
                                                  ........
                                             ---->//將鏡像的數據從images.os.image_start複製到images.os.load  打印:Loading Kernel Image ... OK
                                                      bootm_load_os(images.os, &load_end, 1);
                                             ---->//根據操作系統的類型獲取引導操作系統的函數
                                                      boot_fn = boot_os[images.os.os];
                                             ---->boot_fn(0, argc, argv, &images);//調用do_bootm_linux

                                        進入do_bootm_linux():獲取"bootargs"環境變量的值,最終將此值傳遞給linux內核.
                                               ---->void    (*theKernel)(int zero, int arch, uint params);/*  第一個參數必須爲0,第二個參數爲機器類型,第三個參數爲傳遞給內核參數的其實地址0x1000000。 */ :定義
                                               ---->theKernel = (void (*)(int, int, uint))images->ep;//鏡像的入口地址處也就是需要執行的函數入口
                                                       .........//初始化傳遞給內核的標籤(tag)
                                               ---->printf ("\nStarting kernel ...\n\n");//引導內核之前最後一次打印信息。
                                               ---->theKernel (0, machid, bd->bi_boot_params);//跳到內核中執行

                                             下面進入內核的啓動 !!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章