一個(gè)cmd_tbl_t結(jié)構(gòu)體變量包含了調(diào)用一條命令的所需要的信息。
- ? 對(duì)于環(huán)境變量bootcmd,執(zhí)行run_command(bootcmd, flag)之后,最終是將bootcmd中的參數(shù)解析為命令,海思hi3521a中默認(rèn)參數(shù)是bootcmd=bootm 0x82000000
- ? 相當(dāng)于執(zhí)行bootm 0x82000000 命令
- ? 最終將調(diào)用do_bootm函數(shù),do_bootm函數(shù)在cmd_bootm.c中實(shí)現(xiàn)
在這個(gè)里面有一個(gè)函數(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)境變量用來(lái)傳遞參數(shù)給kernel
- ? (2)images->ep的地址是kernel的程序的入口地址,也就是將函數(shù)指針theKernel指向kernel最先執(zhí)行的地方。
- ? (3)獲取環(huán)境變量machid,這個(gè)應(yīng)該是機(jī)器碼,海思設(shè)備沒(méi)有定義在環(huán)境變量中
- ? (4)這里是建立一個(gè)鏈表用來(lái)存放傳遞給內(nèi)核的參數(shù),在board_init函數(shù)中有賦值 gd->bd->bi_boot_params = CFG_BOOT_PARAMS; CFG_BOOT_PARAMS = 0x80000000 + 0x0100 = 0x80000100
- ? (5)將commandline的值添加到鏈表中
- ? (6)結(jié)束參數(shù)的填充
- ? (7)啟動(dòng)linux內(nèi)核前的一個(gè)清除操作,主要是關(guān)閉中斷,關(guān)閉緩存等操作
- ? (8)由前面我們知道theKernel實(shí)際指向的是kernel的入口地址,執(zhí)行這一句之后,uboot就結(jié)束了運(yùn)行,kernel正式運(yùn)行就從這里開(kāi)始。
-
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213814 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4381瀏覽量
64879 -
Uboot
+關(guān)注
關(guān)注
4文章
129瀏覽量
29098 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
131瀏覽量
11115
發(fā)布評(píng)論請(qǐng)先 登錄
瀚海微SD NAND存儲(chǔ)功能描述(8)專用命令CMD55 56

【ok210試用體驗(yàn)】如何添加一個(gè)簡(jiǎn)單的U-boot命令
嵌入式Linux學(xué)習(xí)引導(dǎo)-Uboot移植之添加自定義命令
U_BOOT_CMD宏將cmd_tbl_t結(jié)構(gòu)體放在u_boot_cmd段中的過(guò)程是以下這樣的嗎?
批處理常用命令大全

cmd常用命令大全 cmd運(yùn)行命令
cmd常用命令大全

C語(yǔ)言常用命令設(shè)計(jì)的實(shí)驗(yàn)程序資料說(shuō)明

Uboot之命令行框架

評(píng)論