一個cmd_tbl_t結構體變量包含了調用一條命令的所需要的信息。
- ? 對于環境變量bootcmd,執行run_command(bootcmd, flag)之后,最終是將bootcmd中的參數解析為命令,海思hi3521a中默認參數是bootcmd=bootm 0x82000000
- ? 相當于執行bootm 0x82000000 命令
- ? 最終將調用do_bootm函數,do_bootm函數在cmd_bootm.c中實現
在這個里面有一個函數:
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
{
bd_t *bd = gd- >bd;
char *s;
int machid = bd- >bi_arch_number;
void (*theKernel)(int zero, int arch, uint params);
#ifdef CONFIG_CMDLINE_TAG
#ifdef CONFIG_HI3536_A7
char *commandline = getenv("slave_bootargs");
#else
char *commandline = getenv("bootargs"); //(1)
#endif
#endif
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
return 1;
theKernel = (void (*)(int, int, uint))images- >ep; //(2)
s = getenv ("machid"); //(3)
if (s) {
machid = simple_strtoul (s, NULL, 16);
printf ("Using machid 0x%x from environmentn", machid);
}
show_boot_progress (15);
debug ("## Transferring control to Linux (at address %08lx) ...n",
(ulong) theKernel);
setup_start_tag (bd); //(4)
setup_memory_tags (bd);
setup_commandline_tag (bd, commandline); //(5)
if (images- >rd_start && images- >rd_end)
setup_initrd_tag (bd, images- >rd_start, images- >rd_end);
setup_eth_use_mdio_tag(bd, getenv("use_mdio"));
setup_eth_mdiointf_tag(bd, getenv("mdio_intf"));
setup_ethaddr_tag(bd, getenv("ethaddr"));
setup_end_tag (bd); //(6)
/* we assume that the kernel is in place */
printf ("nStarting kernel ...nn");
#ifdef CONFIG_USB_DEVICE
{
extern void udc_disconnect (void);
udc_disconnect ();
}
#endif
cleanup_before_linux (); //(7)
theKernel (0, machid, bd- >bi_boot_params); //(8)
/* does not return */
return 1;
}
- ? (1)獲取環境變量bootargs中的值,該環境變量用來傳遞參數給kernel
- ? (2)images->ep的地址是kernel的程序的入口地址,也就是將函數指針theKernel指向kernel最先執行的地方。
- ? (3)獲取環境變量machid,這個應該是機器碼,海思設備沒有定義在環境變量中
- ? (4)這里是建立一個鏈表用來存放傳遞給內核的參數,在board_init函數中有賦值 gd->bd->bi_boot_params = CFG_BOOT_PARAMS; CFG_BOOT_PARAMS = 0x80000000 + 0x0100 = 0x80000100
- ? (5)將commandline的值添加到鏈表中
- ? (6)結束參數的填充
- ? (7)啟動linux內核前的一個清除操作,主要是關閉中斷,關閉緩存等操作
- ? (8)由前面我們知道theKernel實際指向的是kernel的入口地址,執行這一句之后,uboot就結束了運行,kernel正式運行就從這里開始。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Linux
+關注
關注
87文章
11306瀏覽量
209571 -
函數
+關注
關注
3文章
4332瀏覽量
62640 -
Uboot
+關注
關注
4文章
125瀏覽量
28241 -
結構體
+關注
關注
1文章
130瀏覽量
10844
發布評論請先 登錄
相關推薦
【ok210試用體驗】如何添加一個簡單的U-boot命令
、屬性、是否可重復、名稱、短幫助信息,長幫助信息。 因此,我們可以建立一個簡單的命令: #include #include intdo_hello (cmd_tbl_t *cmdt
發表于 09-23 18:11
嵌入式Linux學習引導-Uboot移植之添加自定義命令
的cmd_tbl_t結構。然后run_command函數使用返回的cmd_tbl_t結構中的函數指針調用hello
發表于 02-16 17:19
U_BOOT_CMD宏將cmd_tbl_t結構體放在u_boot_cmd段中的過程是以下這樣的嗎?
最近在著手移植UBOOT,對于U_BOOT_CMD宏將cmd_tbl_t結構體放在u_boot_cmd段中的過程不是很確定,請教下各位。對于
發表于 09-02 05:45
批處理常用命令大全
批處理常用命令大全: 批處理文件是無格式的文本文件,它包含一條或多條命令。它的文件擴展名為 .bat 或 .cmd。在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系
發表于 12-08 10:20
?0次下載
C語言常用命令設計的實驗程序資料說明
本文檔的主要內容詳細介紹的是C語言常用命令設計的實驗程序資料說明
1. 熟悉和掌握包括順序結構、選擇結構、循環結構、函數、數組、結構
發表于 11-02 17:18
?7次下載
Uboot之命令行框架
1 #include 2 #include 3 4 int do_cmdusr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 5 { 6
發表于 05-15 15:18
?1693次閱讀
Linux內核中Uboot命令處理
完成。U-Boot在include/command.h中定義了一個非常重要的cmd_tbl_s結構體,它在命令的實現方面起著至關重要的作用。 struct
評論