bd; char *s; int machid = bd- >bi_arch_number; void (*theKernel)( int zero, int arch, uint" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

cmd_tbl_t結(jié)構(gòu)體變量調(diào)用命令信息

麥辣雞腿堡 ? 來源:TrustZone ? 作者:Hcoco ? 2023-12-04 17:37 ? 次閱讀

一個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
收藏 人收藏

    評論

    相關(guān)推薦

    瀚海微SD NAND存儲功能描述(8)專用命令CMD55 56

    應(yīng)用專用命令app_cmd (CMD55) 當(dāng)卡接收到這個命令時,會使卡將下面的命令解釋為一個特定于應(yīng)用程序的
    的頭像 發(fā)表于 08-08 10:39 ?1174次閱讀
    瀚海微SD NAND存儲功能描述(8)專<b class='flag-5'>用命令</b><b class='flag-5'>CMD</b>55  56

    cmd用命令大全 cmd運行命令

    cmd用命令大全 cmd運行命令
    發(fā)表于 08-15 20:25

    【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

    常見的CMD命令CMD命令調(diào)用步驟

    Java基礎(chǔ)——調(diào)用CMD命令
    發(fā)表于 11-08 08:43

    批處理常用命令大全

    批處理常用命令大全: 批處理文件是無格式的文本文件,它包含一條或多條命令。它的文件擴展名為 .bat 或 .cmd。在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系
    發(fā)表于 12-08 10:20 ?0次下載
    批處理常<b class='flag-5'>用命令</b>大全

    cmd用命令大全 cmd運行命令

    cmd用命令大全 2K和XP下的CMD命令 accwiz.exe > 輔助工具向?qū)?/div>
    發(fā)表于 01-08 09:12 ?3.1w次閱讀

    TMS320F28335_CMD命令

    TMS320F28335_CMD命令TI的TMS320F28335_CMD命令
    發(fā)表于 06-22 15:01 ?16次下載

    CMD命令行高級教程

    CMD命令行高級教程
    發(fā)表于 10-24 08:31 ?30次下載
    <b class='flag-5'>CMD</b>的<b class='flag-5'>命令</b>行高級教程

    cmd用命令大全

    Windows系統(tǒng),還是離不開DOS命令的操作。學(xué)習(xí)DOS系統(tǒng)操作,首先了解命令提示符。先了解每個命令提示符的作用,然后才能夠靈活運用。下面將詳細的為大家介紹cmd
    的頭像 發(fā)表于 02-07 10:55 ?2.5w次閱讀
    <b class='flag-5'>cmd</b>常<b class='flag-5'>用命令</b>大全

    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次下載
    C語言常<b class='flag-5'>用命令</b>設(shè)計的實驗程序資料說明

    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次閱讀
    Uboot之<b class='flag-5'>命令</b>行框架

    Linux內(nèi)核中Uboot命令處理

    完成。U-Boot在include/command.h中定義了一個非常重要的cmd_tbl_s結(jié)構(gòu),它在命令的實現(xiàn)方面起著至關(guān)重要的作用。 struct
    的頭像 發(fā)表于 12-04 17:23 ?495次閱讀

    Linux實用命令大全

    Linux實用命令大全
    的頭像 發(fā)表于 10-23 13:50 ?234次閱讀
    Linux實<b class='flag-5'>用命令</b>大全