一個cmd_tbl_t結(jié)構(gòu)體變量包含了調(diào)用一條命令的所需要的信息。
- ? 對于環(huán)境變量bootcmd,執(zhí)行run_command(bootcmd, flag)之后,最終是將bootcmd中的參數(shù)解析為命令,海思hi3521a中默認參數(shù)是bootcmd=bootm 0x82000000
- ? 相當(dāng)于執(zhí)行bootm 0x82000000 命令
- ? 最終將調(diào)用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,這個應(yīng)該是機器碼,海思設(shè)備沒有定義在環(huán)境變量中
- ? (4)這里是建立一個鏈表用來存放傳遞給內(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)啟動linux內(nèi)核前的一個清除操作,主要是關(guān)閉中斷,關(guān)閉緩存等操作
- ? (8)由前面我們知道theKernel實際指向的是kernel的入口地址,執(zhí)行這一句之后,uboot就結(jié)束了運行,kernel正式運行就從這里開始。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
Linux
+關(guān)注
關(guān)注
87文章
11310瀏覽量
209621 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4332瀏覽量
62666 -
Uboot
+關(guān)注
關(guān)注
4文章
125瀏覽量
28245 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
10848
發(fā)布評論請先 登錄
相關(guān)推薦
瀚海微SD NAND存儲功能描述(8)專用命令CMD55 56
應(yīng)用專用命令app_cmd (CMD55) 當(dāng)卡接收到這個命令時,會使卡將下面的命令解釋為一個特定于應(yīng)用程序的
【ok210試用體驗】如何添加一個簡單的U-boot命令
、屬性、是否可重復(fù)、名稱、短幫助信息,長幫助信息。 因此,我們可以建立一個簡單的命令: #include #include intdo_hello (cmd_tbl_t *cmdt
發(fā)表于 09-23 18:11
嵌入式Linux學(xué)習(xí)引導(dǎo)-Uboot移植之添加自定義命令
的cmd_tbl_t結(jié)構(gòu)。然后run_command函數(shù)使用返回的cmd_tbl_t結(jié)構(gòu)中的函數(shù)指針調(diào)用hello
發(fā)表于 02-16 17:19
U_BOOT_CMD宏將cmd_tbl_t結(jié)構(gòu)體放在u_boot_cmd段中的過程是以下這樣的嗎?
最近在著手移植UBOOT,對于U_BOOT_CMD宏將cmd_tbl_t結(jié)構(gòu)體放在u_boot_cmd段中的過程不是很確定,請教下各位。對于
發(fā)表于 09-02 05:45
批處理常用命令大全
批處理常用命令大全: 批處理文件是無格式的文本文件,它包含一條或多條命令。它的文件擴展名為 .bat 或 .cmd。在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系
發(fā)表于 12-08 10:20
?0次下載
cmd常用命令大全 cmd運行命令
cmd常用命令大全
2K和XP下的CMD命令
accwiz.exe > 輔助工具向?qū)?/div>
發(fā)表于 01-08 09:12
?3.1w次閱讀
cmd常用命令大全
Windows系統(tǒng),還是離不開DOS命令的操作。學(xué)習(xí)DOS系統(tǒng)操作,首先了解命令提示符。先了解每個命令提示符的作用,然后才能夠靈活運用。下面將詳細的為大家介紹cmd
C語言常用命令設(shè)計的實驗程序資料說明
本文檔的主要內(nèi)容詳細介紹的是C語言常用命令設(shè)計的實驗程序資料說明
1. 熟悉和掌握包括順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、函數(shù)、數(shù)組、結(jié)構(gòu)
發(fā)表于 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
發(fā)表于 05-15 15:18
?1693次閱讀
Linux內(nèi)核中Uboot命令處理
完成。U-Boot在include/command.h中定義了一個非常重要的cmd_tbl_s結(jié)構(gòu)體,它在命令的實現(xiàn)方面起著至關(guān)重要的作用。 struct
評論