0 ) strcpy (lastcommand, console_buffe" />

99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

麥辣雞腿堡 ? 來(lái)源:TrustZone ? 作者:Hcoco ? 2023-12-04 17:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

在u-boot命令執(zhí)行到最后時(shí),開(kāi)始進(jìn)入命令循環(huán),等待用戶輸入命令和處理命令,這是通過(guò)循環(huán)調(diào)用main_loop()函數(shù)來(lái)實(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ù)來(lái)執(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ù)通過(guò)調(diào)用函數(shù)parse_line分析出該命令行所對(duì)應(yīng)的參數(shù)個(gè)數(shù)argc和參數(shù)指針數(shù)組*argv[ ],

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

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

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

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

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)用來(lái)保存u-boot命令的相關(guān)信息, 包括命令名稱、對(duì)應(yīng)的執(zhí)行函數(shù)、使用說(shuō)明、幫助信息等

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

例如,bootm命令對(duì)應(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

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

Struct_Section也是一個(gè)宏定義,定義如下所示。

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

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

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

聲明:本文內(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

    文章

    1416

    瀏覽量

    41443
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

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

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64896
  • Uboot
    +關(guān)注

    關(guān)注

    4

    文章

    129

    瀏覽量

    29102
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    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)內(nèi)核了。 當(dāng)時(shí)我在uboot
    發(fā)表于 06-17 05:45

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

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

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

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

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

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

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

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

    UBOOT命令總結(jié)

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

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

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

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

    在此基礎(chǔ)上進(jìn)行二次開(kāi)發(fā),從而快速完成應(yīng)用產(chǎn)品的開(kāi)發(fā)。 在本文中主要介紹其中uboot部分操作命令,即如何利用uboot命令進(jìn)行啟動(dòng)參數(shù)的設(shè)置。EM9X60系列工控主板在
    的頭像 發(fā)表于 01-15 14:01 ?1626次閱讀
    英創(chuàng)信息技術(shù)嵌入式Linux工控主板<b class='flag-5'>uboot</b><b class='flag-5'>命令</b>簡(jiǎn)介

    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 ?2931次閱讀

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

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

    uboot自定義命令

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

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

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

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

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