一個cmd_tbl_t結構體變量包含了調用一條命令的所需要的信息。
- ? 對于環(huán)境變量bootcmd,執(zhí)行run_command(bootcmd, flag)之后,最終是將bootcmd中的參數(shù)解析為命令,海思hi3521a中默認參數(shù)是bootcmd=bootm 0x82000000
- ? 相當于執(zhí)行bootm 0x82000000 命令
- ? 最終將調用do_bootm函數(shù),do_bootm函數(shù)在cmd_bootm.c中實現(xiàn)
在這個里面有一個函數(shù):
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)獲取環(huán)境變量bootargs中的值,該環(huán)境變量用來傳遞參數(shù)給kernel
- ? (2)images->ep的地址是kernel的程序的入口地址,也就是將函數(shù)指針theKernel指向kernel最先執(zhí)行的地方。
- ? (3)獲取環(huán)境變量machid,這個應該是機器碼,海思設備沒有定義在環(huán)境變量中
- ? (4)這里是建立一個鏈表用來存放傳遞給內核的參數(shù),在board_init函數(shù)中有賦值 gd->bd->bi_boot_params = CFG_BOOT_PARAMS; CFG_BOOT_PARAMS = 0x80000000 + 0x0100 = 0x80000100
- ? (5)將commandline的值添加到鏈表中
- ? (6)結束參數(shù)的填充
- ? (7)啟動linux內核前的一個清除操作,主要是關閉中斷,關閉緩存等操作
- ? (8)由前面我們知道theKernel實際指向的是kernel的入口地址,執(zhí)行這一句之后,uboot就結束了運行,kernel正式運行就從這里開始。
-
Linux
+關注
關注
87文章
11506瀏覽量
213381 -
函數(shù)
+關注
關注
3文章
4379瀏覽量
64641 -
Uboot
+關注
關注
4文章
129瀏覽量
29019 -
結構體
+關注
關注
1文章
130瀏覽量
11085
發(fā)布評論請先 登錄
【ok210試用體驗】如何添加一個簡單的U-boot命令
嵌入式Linux學習引導-Uboot移植之添加自定義命令
U_BOOT_CMD宏將cmd_tbl_t結構體放在u_boot_cmd段中的過程是以下這樣的嗎?
批處理常用命令大全

cmd常用命令大全

C語言常用命令設計的實驗程序資料說明

Uboot之命令行框架

評論