UBOOT的命令體系分析

2021-10-07 11:49:50 字數 2490 閱讀 6161

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鍵是否會重複執行...