0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

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

麥辣雞腿堡 ? 來(lái)源:TrustZone ? 作者:Hcoco ? 2023-12-04 17:23 ? 次閱讀

命令處理

main.c中的代碼實(shí)現(xiàn)了將一個(gè)命令的所有參數(shù)分離存放在argv數(shù)組中,參數(shù)的數(shù)目為argc,完成了讀取命令行和解析命令行的工作。命令的處理由common/command.c文件中的函數(shù)完成。U-Boot在include/command.h中定義了一個(gè)非常重要的cmd_tbl_s結(jié)構(gòu)體,它在命令的實(shí)現(xiàn)方面起著至關(guān)重要的作用。

struct cmd_tbl_s {
            char    *name;       /* 命令名稱            */
            int     maxargs; /* 命令的最大參數(shù)   */
            int     repeatable;  /* 是否可重復(fù)(按回車(chē)鍵是否會(huì)重復(fù)執(zhí)行)
            */
            int     (*cmd)(struct cmd_tbl_s *, int, int, char * const []);  /* 命令響應(yīng)函數(shù)*/
            char    *usage;      /* 簡(jiǎn)短的用法說(shuō)明   */
        #ifdef   CONFIG_SYS_LONGHELP
            char    *help;       /* 較詳細(xì)的幫助*/
        #endif
        #ifdef CONFIG_AUTO_COMPLETE
            /* 響應(yīng)自動(dòng)補(bǔ)全參數(shù)*/
            int     (*complete)(int argc,char*const argv[],char last_char,int maxv,char*cmdv[]);
        #endif
        };

cmd_tbl_s結(jié)構(gòu)體包含的成員變量:命令名稱、最大參數(shù)個(gè)數(shù)、可重復(fù)性、命令響應(yīng)函數(shù)、用法、幫助和命令補(bǔ)全函數(shù),每個(gè)命令都由這個(gè)結(jié)構(gòu)體來(lái)描述。當(dāng)輸入“help”或者“?”會(huì)打印出所有的命令和它的usage,輸入“help”或者“?”和命令名稱時(shí),會(huì)打印出help信息

添加一個(gè)命令時(shí),利用宏U_BOOT_CMD定義一個(gè)新的cmd_tbl_s結(jié)構(gòu)體,并對(duì)這個(gè)結(jié)構(gòu)體初始化和定義結(jié)構(gòu)體的屬性。例如,在文件common/cmd_bdinfo.c中:

U_BOOT_CMD(
            bdinfo,  1,  1,  do_bdinfo,
            "print Board Info structure",
            ""
        );

增加了一個(gè)命令,它的名稱為bdinfo,最大參數(shù)數(shù)目為1,可重復(fù),響應(yīng)函數(shù)是do_bdinfo, usage為“print Board Info structure”,沒(méi)有幫助信息。U_BOOT_CMD宏在include/command.h中定義,當(dāng)不配置命令補(bǔ)全時(shí),它最終被展開(kāi)為:

#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) 
        cmd_tbl_t __u_boot_cmd_##name __attribute__((unused, section(".u_boot_cmd"), aligned( 4))) = {#name, maxargs, rep, cmd, usage, help}

其中,“##”與“#”是預(yù)編譯操作符,“##”表示字符串連接,“#”表示后面緊接著的是一個(gè)字符串。cmd_tbl_t就是struct cmd_tbl_s,用于__u_boot_cmd_##name結(jié)構(gòu)體。

__attribute__定義了結(jié)構(gòu)體的屬性,將結(jié)構(gòu)體放在.u_boot_cmd段中。簡(jiǎn)單的說(shuō),就是利用U_BOOT_CMD定義struct cmd_tbl_s結(jié)構(gòu)體變量,并把類(lèi)變量都放在一個(gè)段中。

在鏈接腳本中指定了.u_boot_cmd段的起始地址和結(jié)束地址,又已知每個(gè)struct cmd_tbl_s結(jié)構(gòu)體占用內(nèi)存空間的大小,這樣就很方便地遍歷所有的struct cmd_tbl_s結(jié)構(gòu)體。這種巧妙的方式充分利用了鏈接器的功能特點(diǎn),避免了花費(fèi)大量的精力,去維護(hù)和更新命令結(jié)構(gòu)體表。

cmdtp = find_cmd(argv[0]);
            if (cmdtp == NULL) {
                  printf("Unknown command '%s' - try 'help'n", argv[0]);
                  return 1;
            }

cmd_process函數(shù)首先調(diào)用find_cmd函數(shù)根據(jù)傳入的參數(shù),在.u_boot_cmd段區(qū)域查找命令,如果沒(méi)有找到對(duì)應(yīng)的命令,打印出提示信息并返回。

如果找到則返回命令結(jié)構(gòu)體 cmdtp,再檢查傳入?yún)?shù)的合法性,最后通過(guò)cmd_call函數(shù)調(diào)用命令響應(yīng)函數(shù)(cmdtp->cmd)(cmdtp, flag, argc, argv)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1336

    瀏覽量

    40084
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207919
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61969
  • Uboot
    +關(guān)注

    關(guān)注

    4

    文章

    124

    瀏覽量

    28056
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux內(nèi)核自解壓過(guò)程分析

    uboot完成系統(tǒng)引導(dǎo)以后,執(zhí)行環(huán)境變量bootm命令;即,將Linux內(nèi)核調(diào)入內(nèi)存并調(diào)用
    的頭像 發(fā)表于 12-08 14:00 ?706次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>自解壓過(guò)程分析

    uboot啟動(dòng)怎么停在uboot命令

    256M的nandflash已經(jīng)裝入了uboot1.1.6和linux2.6.22. 在啟動(dòng)的時(shí)候,我想讓板子啟動(dòng)時(shí)停在uboot命令行,但是停不下來(lái),直接就去啟動(dòng)
    發(fā)表于 06-17 05:45

    編譯IMX6ULL開(kāi)發(fā)板的UbootLinux內(nèi)核

    圖所示:上圖生成的“u-boot.imx”文件就是Uboot的景象文件,我們可以把它拷貝到Windows系統(tǒng)下然后使用MFGTools燒寫(xiě)工具燒寫(xiě)到開(kāi)發(fā)板運(yùn)行。 29.3 編譯終結(jié)者開(kāi)發(fā)板Linux內(nèi)核
    發(fā)表于 07-15 10:47

    ubootlinux內(nèi)核進(jìn)行適配

    在嵌入式開(kāi)發(fā)過(guò)程Linux認(rèn)為每一個(gè)硬件都是定制化的,所以都需要一個(gè)唯一的編碼,就是機(jī)器碼,機(jī)器碼的主要工作就是為了ubootlinux內(nèi)核
    發(fā)表于 12-20 07:51

    ubootlinux內(nèi)核構(gòu)建的環(huán)境設(shè)置是否相同?

    ubootlinux 內(nèi)核構(gòu)建的環(huán)境設(shè)置是否相同,使用以下命令?來(lái)源/opt/fsl-imx-xwayland/5.15-kirkstone/environment-setup-
    發(fā)表于 03-21 06:42

    在github上下載Xilinx提供的Opensource linuxuboot內(nèi)核gz格式壓縮包的方法

    Xilinx提供的linuxuboot內(nèi)核版本會(huì)不斷地維護(hù)升級(jí)和更新,有些時(shí)候,我們碰到的問(wèn)題可能換一個(gè)別的內(nèi)核版本就能解決。在此,總結(jié)一下內(nèi)核
    發(fā)表于 02-08 08:34 ?1102次閱讀
    在github上下載Xilinx提供的Opensource <b class='flag-5'>linux</b>和<b class='flag-5'>uboot</b><b class='flag-5'>內(nèi)核</b>gz格式壓縮包的方法

    UBOOT命令總結(jié)

    分享到: 很好的UBOOT命令總結(jié),起步時(shí)就是看的這篇東西,熟悉了以后就用?看自帶幫助就行:) Printenv 打印環(huán)境變量。 Uboot》 printenv baudrate=115200
    發(fā)表于 11-08 10:24 ?18次下載

    基于ARM9和NANDFlash對(duì)ubootLinux內(nèi)核進(jìn)行修改

    本文針對(duì)嵌入式Linux操作系統(tǒng)提出了一種新的更新機(jī)制,并且基于ARM9微處理器和NANDFlash存儲(chǔ)器,對(duì)ubootLinux內(nèi)核進(jìn)行
    發(fā)表于 04-07 11:00 ?2717次閱讀
    基于ARM9和NANDFlash對(duì)<b class='flag-5'>uboot</b>和<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>進(jìn)行修改

    英創(chuàng)信息技術(shù)嵌入式Linux工控主板uboot命令簡(jiǎn)介

    成都英利公司提供的EM9X60系列嵌入式Linux工控主板,均預(yù)裝了Linux2.6.30內(nèi)核操作系統(tǒng)及根文件系統(tǒng),包括bootstrap、uboot、uImage及根文件系統(tǒng),用戶可
    的頭像 發(fā)表于 01-15 14:01 ?1284次閱讀
    英創(chuàng)信息技術(shù)嵌入式<b class='flag-5'>Linux</b>工控主板<b class='flag-5'>uboot</b><b class='flag-5'>命令</b>簡(jiǎn)介

    【嵌入式】構(gòu)建嵌入式Linux系統(tǒng)(uboot、內(nèi)核、文件系統(tǒng))

    嵌入式Linux系統(tǒng)知識(shí)架構(gòu)及層次嵌入式Linux系統(tǒng)構(gòu)成及啟動(dòng)略析嵌入式Linux三劍客之uboot技術(shù)嵌入式Linux三劍客之
    發(fā)表于 10-20 18:20 ?41次下載
    【嵌入式】構(gòu)建嵌入式<b class='flag-5'>Linux</b>系統(tǒng)(<b class='flag-5'>uboot</b>、<b class='flag-5'>內(nèi)核</b>、文件系統(tǒng))

    2021-07-28-uboot-CC2640

    uboot命令開(kāi)發(fā)指南:30.4 uboot命令一、uboot啟動(dòng)log簡(jiǎn)析需要調(diào)試性質(zhì)的開(kāi)發(fā) ,ub
    發(fā)表于 11-30 09:51 ?11次下載
    2021-07-28-<b class='flag-5'>uboot</b>-CC2640

    嵌入式Linux開(kāi)發(fā)-uboot常用命令介紹(下篇)

    這篇文章是UBOOT命令介紹的下篇,接著上篇文章介紹剩下的幾個(gè)命令用法。
    的頭像 發(fā)表于 08-14 08:55 ?1982次閱讀

    uboot自定義命令

    U-Boot本質(zhì)是一個(gè)裸機(jī)程序,是一種普遍用于嵌入式系統(tǒng)的開(kāi)源的Bootloader,作用是用來(lái)引導(dǎo)操作系統(tǒng),以及給開(kāi)發(fā)人員提供測(cè)試調(diào)試工具。主要負(fù)責(zé)基本硬件初始化,導(dǎo)啟動(dòng)內(nèi)核啟動(dòng)
    的頭像 發(fā)表于 09-17 09:59 ?1109次閱讀

    Uboot命令實(shí)現(xiàn)大致流程圖

    zImage內(nèi)核鏡像下載到開(kāi)發(fā)板之后,可以使用u-boot的go命令進(jìn)行直接跳轉(zhuǎn),這個(gè)時(shí)候內(nèi)核直接解壓?jiǎn)?dòng)。 但是此時(shí)的內(nèi)核無(wú)法掛載文件系統(tǒng),因?yàn)間o
    的頭像 發(fā)表于 12-04 17:09 ?326次閱讀
    <b class='flag-5'>Uboot</b><b class='flag-5'>命令</b>實(shí)現(xiàn)大致流程圖

    uboot命令的執(zhí)行過(guò)程是什么

    U-boot是通過(guò)執(zhí)行u-boot提供的命令來(lái)加載Linux內(nèi)核的,其中 命令bootm的功能 即為從memory啟動(dòng)Linux
    的頭像 發(fā)表于 12-04 17:31 ?590次閱讀