uboot/common/cmd_***.c中,其中的若干個.c檔案和命令有著直接的聯絡。每乙個命令的背後都對應著乙個函式來實現具體的命令功能。而很多的命令還需要引數的傳遞,這靠argc和ar**來實現。
在uboot的第二階段bl2初始化完成之後,進入死迴圈,執行main_loop 函式,函式中再次呼叫乙個重要的run_command()函式,實現命令的接收、解析:
for (;;)
(1)首先通過控制台獲取命令;
(2)命令的解析:使用parse_line函式將命令與其引數進行解析;
/* extract arguments */
if ((argc = parse_line (finaltoken, ar**)) == 0)
將命令與引數進行分離,分別存入ar**[ ]陣列內。
(3)在命令集中對輸入的命令進行查詢:
/* look up command in command table */
if ((cmdtp = find_cmd(ar**[0])) == null)
find_cmd()函式,從當前uboot的命令集中查詢是否有某個命令。如果找到則返回這個命令結構體的指標,如果未找到返回null;
(4)呼叫對應的函式指標執行具體的命令功能。
(1)每乙個命令的命令的呼叫函式的基本套路為:
static void do_function1(cmd_tbl_t *cmdtp,int argc,char **ar**,int ***)
}
(2)cmd_tbl_t結構體原型:
typedef struct cmd_tbl_s cmd_tbl_t;
struct cmd_tbl_s ;
引數的解釋:name:命令的名字;
maxargs:命令最多可以接收的引數個數;
cmd:函式指標,命令對應的函式的函式指標,將來執行命令時使用這個函式指標來呼叫,也就是命令的實體函式;
usage:命令的短幫助資訊。對命令的簡單描述;
help:命令的長幫助資訊。細節的幫助資訊;
complete:函式指標,指向這個命令的自動補全的函式;
(3)uboot使用這樣的結構體來管理每乙個命令,在新增命令是需要對命令的這個結構體進行例項化;
1、填充結構體變數例項化命令;
2、給命令結構體例項附加特定段屬性(使用者自定義段),鏈結時將帶有該段屬性的內容鏈結在一起排列(挨著的,不會夾雜其他東西,也不會丟掉乙個帶有這種段屬性的,但是順序是亂序的);
3、uboot重定位時將該段整體載入到ddr中,載入到ddr中的uboot映象中帶有特定段屬性的這一段其實就是命令結構體的集合,有點像乙個命令結構體陣列;
4、命令列集合也有著起始位址和結束位址,分別對應著段起始位址和結束位址(鏈結位址、定義在u-boot.lds中);
end。。。。。。。
uboot的啟動要點整理
對於ppc e500mc而言,從上電的一開始,cpu有預設配置的tlb位址空間,cpu執行的第一條指令一定在這個空間內,這樣虛擬位址才能轉換為實體地址,然後還有啟動的law local access window 預設配置 從實體地址到器件 比如cpu的片選cs0會選擇norflash,然後預設的l...
u boot的啟動流程分析(一)
這週翻了翻u boot xilinx的原始碼,結合著網上看的對cortexa8 a9的u boot的原始碼分析,再結合自己在xilinx上下的u boot原始碼,試著對u boot的啟動流程進行一下分析,也給自己理一下思路。u boot原始碼的目錄結構 第一階段 1 start.s arch arm...
分析uboot是如何啟動核心的
1.uboot啟動核心的 縮減如下 s getenv bootcmd debug main loop bootcmd s n s s if bootdelay 0 s abortboot bootdelay 2.假設bootcmd nand read.jffs2 0x30007fc0 kernel ...