uboot啟動後進入命令列模式,即可輸入命令
uboot會進行命令接收,命令解析,命令執行操作
uboot的命令體系實現**在uboot/common/cmd_xx.c中(command.c 和main.c也和命令相關)
每個命令都對應乙個函式
有些命令支援傳參(和main引數傳參差不多),使用argc&ar**傳遞,比如" print ipaddr "會以argc(2),ar**(ar**[0] = print,ar**[1] = ipaddr)傳遞給命令函式
main_loop函式:
在uboot啟動第二階段結束後,會進入main_loop函式進行死迴圈
/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;)
main_loop函式執行一次,就是乙個獲取,解析,執行命令的過程(main_loop應該是乙個阻塞式函式)
run_command函式:
在main_loop函式裡解析之後用run_command函式執行命令
陣列(結構體陣列,每個結構體中存放命令的各種資訊),最簡單的實現方式,但是增減不便
鍊錶,鍊錶的每個節點data段放乙個結構體存放命令資訊,但是佔空間大,演算法稍麻煩
uboot使用另一種方式,
(1)使用結構體儲存命令的各種資訊
(2)命令結構體全部放在使用者自定義段(給命令附加特殊的段屬性,就像.bss段,.data段),鏈結時將帶有該段屬性的內容鏈結在一起排列
(3)uboot重定位時將該段整體載入到ddr中。載入到ddr中的uboot映象中帶有特定段屬性的這一段其實就是命令結構體的集合,有點像乙個命令結構體陣列
(4)段的起始和結束位址決定了命令集的範圍(在鏈結指令碼u-boot.lds裡面定義),如下圖:
__u_boot_cmd_start = .;
.u_boot_cmd :
__u_boot_cmd_end = .;
命令結構體cmd_tbl_t:
struct cmd_tbl_s ;
定義了命令的具體資訊:
name 名稱
maxargs 可接收的最大引數個數
repeatable 是否可重複執行,重複執行是uboot命令列的一種工作機制,就是直接按回車則執行上一條執行的命令
cmd,函式指標,指向這個命令的具體實施函式
usage:命令的短幫助資訊。對命令的簡單描述
help:命令的長幫助資訊。細節的幫助資訊
complete:函式指標,指向這個命令的自動補全的函式
總結:uboot的命令體系在工作時,乙個命令對應乙個cmd_tbl_t結構體的乙個例項,然後uboot支援多少個命令,就需要多少個結構體例項。uboot的命令體系把這些結構體例項管理起來,當使用者輸入了乙個命令時,uboot會去這些結構體例項中查詢(查詢方法和儲存管理的方法有關)。如果找到則執行命令,如果未找到則提示命令未知。
分析乙個命令:
version命令,執行結果如下:
執行後列印uboot版本資訊。
int
do_version (cmd_tbl_t *cmdtp, int flag, int argc, char *ar**)
u_boot_cmd(
version, 1, 1, do_version,
"version - print monitor version\n",
null
);
u_boot_cmd巨集分析:每個命令函式都帶有乙個u_boot_cmd巨集,該巨集定義如下:
#define u_boot_cmd(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name struct_section =
#define struct_section __attribute__ ((unused,section (".u_boot_cmd")))
version命令的u_boot_cmd
u_boot_cmd(
version, 1, 1, do_version,
"version - print monitor version\n",
null
);
展開後變成
cmd_tbl_t __u_boot_cmd_version __attribute__ ((unused,section (".u_boot_cmd"))) =
uboot 的命令體系
1 位置 1 uboot命令體系的實現 在uboot common cmd c中。有若干個.c檔案和命令體系有關。還有command.c main.c也是和命令有關的 2 傳參方式 命令引數以argc argv傳給函式 1 有些uboot的命令還支援傳遞引數。也就是說命令背後對應的函式接收的引數列表...
uboot移植之uboot命令體系解析
1 回歸到main loop uboot啟動第二階段的最後,進入死迴圈main loop 函式,命令列中沒輸出一次命令,就會執行一次main loop函式,完成一次命令的獲取 解析和執行。2 uboot命令體系的實現原理 uboot中裡面維護了很多命令,每個命令對應乙個結構體變數,當我們在命令列輸入...
Uboot命令U BOOT CMD分析
u boot cmd name,maxargs,repeatable,command,usage help 各個引數的意義如下 name 命令名,非字串,但在u boot cmd中用 符號轉化為字串 maxargs 命令的最大引數個數 repeatable 是否自動重複 按enter鍵是否會重複執行...