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

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

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

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

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

U-boot是通過執(zhí)行u-boot提供的命令來加載Linux內(nèi)核的,其中命令bootm的功能即為從memory啟動Linux內(nèi)核映像文件。

在講解bootm加載內(nèi)核之前,先來看看u-boot中u-boot命令的執(zhí)行過程。

1、u-boot命令的執(zhí)行過程

在u-boot命令執(zhí)行到最后時,開始進(jìn)入命令循環(huán),等待用戶輸入命令和處理命令,這是通過循環(huán)調(diào)用main_loop()函數(shù)來實現(xiàn)的,main_loop函數(shù)的主要代碼如下所示。

len=readline (CONFIG_SYS_PROMPT);
                      flag=0;  /*assume no special flags for now*/
                      if (len > 0)
                          strcpy (lastcommand, console_buffer);
                      else if (len == 0)
                          flag —= CMD_FLAG_REPEAT;
                      rc=run_command (lastcommand, flag);

Main_loop函數(shù)從串口終端讀入用戶輸入的要執(zhí)行的命令行(包括命令和參數(shù)),然后調(diào)用run_command函數(shù)來執(zhí)行用戶輸入的命令行。

下面分析 run_command函數(shù)的主要工作流程 ,run_command的主要源碼如下所示。

strcpy(cmdbuf, cmd);
               /*Extract arguments*/
                           if((argc=parse_line(finaltoken, argv))==0){
                               rc=-1;   /*no command at all*/
                               continue;
                           }
                          /*Look up command in command table*/
                           if((cmdtp=find_cmd(argv[0]))==NULL){
                               printf("Unknown command' %s' -try' help' n", argv[0]);
                               rc=-1;   /*give up after bad command*/
                               continue;
                           }
                          /*OK-call function to do the command*/
                           if((cmdtp- >cmd)(cmdtp, flag, argc, argv)! =0){
                               rc=-1;
                           }

從代碼中可以看出,run_command函數(shù)通過調(diào)用函數(shù)parse_line分析出該命令行所對應(yīng)的參數(shù)個數(shù)argc和參數(shù)指針數(shù)組*argv[ ],

其中 argv[0]中保存的是u-boot命令名字符串 ,接著調(diào)用 函數(shù)find_cmd ,

函數(shù) 根據(jù)命令名在u-boot命令列表中找到該命令對應(yīng)的u-boot命令結(jié)構(gòu)體cmd_tbl_t所在的地址 ,

找到該u-boot命令對應(yīng)的命令結(jié)構(gòu)體后,就可以調(diào)用 該結(jié)構(gòu)體中的u-boot命令對應(yīng)的執(zhí)行函數(shù)來完成該u-boot命令的功能 ,這樣一個u-boot命令就執(zhí)行完成了。

下面再來看看u-boot命令結(jié)構(gòu)體cmd_tbl_t及其定義過程和存放的位置。

U-boot命令結(jié)構(gòu)體cmd_tbl_t定義如下所示。

struct cmd_tbl_s{
                    char       *name;         /*Command Name                     */
                    int        maxargs; /*maximum number of arguments*/
                    int        repeatable;/*autorepeat allowed?      */
                                        /*Implementation function    */
                    int        (*cmd)(struct cmd_tbl_s*, int, int, char*[]);
                    char       *usage;        /*Usage message        (short)     */
                #ifdef     CONFIG_SYS_LONGHELP
                    char       *help;         /*Help  message       (long)      */
                #endif
                #ifdef CONFIG_AUTO_COMPLETE
                   /* do auto completion on the arguments */
                    int        (*complete)(int argc, char*argv[], char last_char, int maxv, char*cmdv[]);
                #endif
                };

Cmd_tbl_t結(jié)構(gòu)用來保存u-boot命令的相關(guān)信息, 包括命令名稱、對應(yīng)的執(zhí)行函數(shù)、使用說明、幫助信息等 。

每一條u-boot命令都對應(yīng)一個cmd_tbl_t結(jié)構(gòu)體變量 ,在u-boot中是通過宏U_BOOT_CMD來實現(xiàn)cmd_tbl_t結(jié)構(gòu)體變量的定義和初始化的。

例如,bootm命令對應(yīng)U_BOOT_CMD調(diào)用,代碼如下所示。

U_BOOT_CMD(
                  bootm,    CONFIG_SYS_MAXARGS,     1,    do_bootm,
                  "boot application image from memory",
                  "[addr[arg...]]n     -boot application image stored in memoryn"
                  "tpassing arguments ' arg ...' ; when booting a Linux kernel, n"
                  "t' arg' can be the address of an initrd imagen");

U_BOOT_CMD宏定義如下所示:

#define U_BOOT_CMD(name, maxargs, rep, cmd, usage, help) 
              cmd_tbl_t __u_boot_cmd_##name Struct_Section={#name, maxargs, rep, cmd, usage, help

這樣我們通過U_BOOT_CMD宏就定義了cmd_tbl_t類型的結(jié)構(gòu)體變量,變量名為**__u_boot_cmd_bootm**,同時用U_BOOT_CMD宏中的參數(shù)對cmd_tbl_t結(jié)構(gòu)體中的每個成員進(jìn)行初始化。

Struct_Section也是一個宏定義,定義如下所示。

#define Struct_Section  __attribute__((unused, section(".u_boot_cmd")))

Struct_Section定義了結(jié)構(gòu)體變量的段屬性,cmd_tbl_t類型的結(jié)構(gòu)體變量鏈接時全部鏈接到u_boot_cmd段中,可以查看u-boot.lds文件對u_boot_cmd段位置的安排。

(這里我們應(yīng)該有想到,關(guān)于uboot_cmd,我們可以外界輸入,內(nèi)部的肯定也有提前預(yù)設(shè)的值,比如啟動內(nèi)核這些。如果在這個啟動延時的過程中不進(jìn)行輸入,那么就會去執(zhí)行這些默認(rèn)的命令。)

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

    關(guān)注

    3

    文章

    1372

    瀏覽量

    40293
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

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

    關(guān)注

    3

    文章

    4331

    瀏覽量

    62630
  • Uboot
    +關(guān)注

    關(guān)注

    4

    文章

    125

    瀏覽量

    28234
收藏 人收藏

    評論

    相關(guān)推薦

    使用uboot引導(dǎo)應(yīng)用程序

    uboot默認(rèn)是支持執(zhí)行應(yīng)用程序的,就像引導(dǎo)內(nèi)核一樣,我們也可以自己寫一個應(yīng)用程序,讓uboot啟動時引導(dǎo)。
    發(fā)表于 11-16 14:00 ?1005次閱讀

    uboot啟動怎么停在uboot命令

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

    請問在內(nèi)存中執(zhí)行uboot時,可以通過go命令跳轉(zhuǎn)到SpiFlash(NorFlash)去執(zhí)行嗎?

    請教各位大牛,在內(nèi)存中執(zhí)行uboot時,可不可以通過go命令,跳轉(zhuǎn)到SpiFlash(NorFlash)去執(zhí)行?謝謝!
    發(fā)表于 06-21 05:45

    Uboot命令之間有什么區(qū)別?

    我用的板子是SMDK2440,Uboot1.1.16版本就是和視頻里是一樣對于Uboot我有點疑惑,uboot不是有很多命令嗎,bootm , nand,....這些
    發(fā)表于 07-26 05:45

    為什么uboot執(zhí)行save命令無法保存環(huán)境變量?

    uboot執(zhí)行save命令無法保存環(huán)境變量執(zhí)行set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
    發(fā)表于 07-31 02:19

    如何查詢uboot下載執(zhí)行地址?

    我根據(jù)Release包中的燒寫工具和自帶的M7和UBOOT鏡像進(jìn)行測試,UBOOT可以正常下載啟動。但是在基于BSP33.0定制Uboot過程中,遇到了以下問題: 問題一、啟動U-
    發(fā)表于 03-24 07:46

    UBOOT命令總結(jié)

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

    AM335x如何在Uboot時增加自定義的命令控制LCD功能中文概述

    圖片生成十六進(jìn)制的數(shù)據(jù)數(shù)組四. 在新版本的processor SDK v3.0中,在uboot階段如何實現(xiàn)增加LCD logo的顯示五. 基于第四點內(nèi)容,增加Uboot命令,效果是在Uboo
    發(fā)表于 04-23 17:09 ?10次下載
    AM335x如何在<b class='flag-5'>Uboot</b>時增加自定義的<b class='flag-5'>命令</b>控制LCD功能中文概述

    AM335x UBOOT移植編譯命令詳細(xì)概述

    本文的主要內(nèi)容是TI的產(chǎn)品AM335x 的UBOOT移植編譯命令詳細(xì)概述
    發(fā)表于 04-24 16:26 ?37次下載
    AM335x <b class='flag-5'>UBOOT</b>移植編譯<b class='flag-5'>命令</b>詳細(xì)概述

    2021-07-28-uboot-CC2640

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

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

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

    嵌入式Linux開發(fā)-編寫自定義uboot命令

    U-Boot的命令為用戶提供了交互功能,并且已經(jīng)實現(xiàn)了幾十個常用的命令,前面兩篇文章介紹了uboot自帶的常用命令使用。
    的頭像 發(fā)表于 08-14 08:56 ?1237次閱讀

    uboot自定義命令

    。 U-Boot命令眾多,通過uboot命令可完成系統(tǒng)環(huán)境變量設(shè)置。U-Boot本質(zhì)就是一份裸機(jī)程序,這樣可以在U-Boot命令下調(diào)試一些硬件設(shè)備問題。U-Boot
    的頭像 發(fā)表于 09-17 09:59 ?1260次閱讀

    怎么使用uboot引導(dǎo)應(yīng)用程序?

    uboot默認(rèn)是支持執(zhí)行應(yīng)用程序的,就像引導(dǎo)內(nèi)核一樣,我們也可以自己寫一個應(yīng)用程序,讓uboot啟動時引導(dǎo)。
    的頭像 發(fā)表于 02-17 16:01 ?1514次閱讀
    怎么使用<b class='flag-5'>uboot</b>引導(dǎo)應(yīng)用程序?

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

    0x40。 (這里你應(yīng)該知道了為什么要使用bootm命令,以及為什么要是有uImage格式) 在前面我們曾經(jīng)分析過Uboot的啟動流
    的頭像 發(fā)表于 12-04 17:09 ?432次閱讀
    <b class='flag-5'>Uboot</b><b class='flag-5'>命令</b>實現(xiàn)大致流程圖