1:回歸到main_loop
uboot啟動第二階段的最後,進入死迴圈main_loop()函式,命令列中沒輸出一次命令,就會執行一次main_loop函式,完成一次命令的獲取、解析和執行。
2:uboot命令體系的實現原理
uboot中裡面維護了很多命令,每個命令對應乙個結構體變數,當我們在命令列輸入乙個命令時。這時就涉及如何去維護這些命令的問題,一般的方法有兩種,陣列或者鍊錶,但是陣列的缺陷在開始的時候需要確定陣列的大小,鍊錶的話效率比較低,所以uboot使用了另一種方式。uboot中乙個命令對應乙個__u_boot_cmd_命令結構,並且繫結了乙個do_命令函式。
uboot裡面給命令新增了乙個段屬性,所以在鏈結的時候相同段屬性的**會連續的發到一起(命令的順序是不定的),所以指定了段屬性的起始位址和結束位址,那麼我們就可以通過指標的方式去訪問這些資料,這樣實現方式在儲存方面和陣列類似,但是有避免陣列大小一開始就需要確定的侷限性。所以在新增和刪除命令的時候很簡單就可以實現。
3:結構體cmd_tbl_s,命令結構體
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct
cmd_tbl_s ;
引數解析:
name:命令的名字
maxargs:命令允許傳入最多的引數個數
repeatable:命令是否允許連續執行(輸入一次命令後,按下回車還會執行之前的命令)
cmd:命令對應的執行函式
usage:命令的短說明
help:命令的長說明
4:兩個巨集定義u_boot_cmd和struct_section
1
2
#define struct_section __attribute__ ((unused,section (".u_boot_cmd")))
#define u_boot_cmd(name,maxargs,rep,cmd,usage,help) cmd_tbl_t __u_boot_cmd_##name struct_section =
struct_section巨集的作用是新增段屬性 .u_boot_cmd,段屬性的起始位址在鏈結指令碼中有指定。
u_boot_cmd巨集的作用是例項化乙個cmd_tbl_t型別的結構體__u_boot_cmd_##name,並且在例項化的時候同時初始化結構
##name:##是轉義字元,效果是將##name用name替代
#name:#轉義字元,效果是將name轉成字串型別的『name』
5:新增uboot命令
方法1:在原有的.c檔案中加
uboot命令很多都儲存在uboot/common/command.c檔案中,所有要新增uboot命令只需要在command.c按照其他的命令的格式新增即可
方法2:自己建立.c檔案並新增命令
首先在uboot/common/中建立乙個.c檔案,然後新增u_boot_cmd巨集和對應的命令函式,需要注意的是要新增相應的標頭檔案,然後在uboot/common/makefile下新增***.o,目的的編譯的時候能將新增的.c檔案編譯鏈結進去。
uboot移植之uboot和kernel的引數傳遞
從uboot啟動核心的形式thekernel 0,machid,bd bi boot params 可以看出uboot給核心傳遞了3個引數,第1個是0,第2個是機器碼,第3個是引數列表在sdram的起始位置 剛好滿足一下呼叫核心的條件 r0 0。r1 機器型別id r2 啟動引數標記列表在ram 中...
uboot移植 uboot啟動回顧
一 uboot啟動的第一階段start.s 路徑uboot cpu s5pc11x start.s 1 include 標頭檔案包含,config.件原始碼中不存 在,配置後自動生成 路徑 include linux config.h 2 include 標頭檔案包含,version.件原始碼中不存...
u boot移植詳解 初識u boot
u boot是一種普遍用於嵌入式系統中的bootloader。bootloader是基於特定硬體平台來實現的,因此幾乎不可能為所有的嵌入式系統建立乙個通用的bootloader,不同的處理器架構都有不同的bootloader,bootloader不但依賴於cpu的體系結構,還依賴於嵌入式系統板級裝置...