0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

uboot命令的执行过程是什么

麦辣鸡腿堡 来源:TrustZone 作者:Hcoco 2023-12-04 17:31 次阅读

U-boot是通过执行u-boot提供的命令来加载Linux内核的,其中命令bootm的功能即为从memory启动Linux内核映像文件。

在讲解bootm加载内核之前,先来看看u-boot中u-boot命令的执行过程。

1、u-boot命令的执行过程

在u-boot命令执行到最后时,开始进入命令循环,等待用户输入命令和处理命令,这是通过循环调用main_loop()函数来实现的,main_loop函数的主要代码如下所示。

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函数从串口终端读入用户输入的要执行的命令行(包括命令和参数),然后调用run_command函数来执行用户输入的命令行。

下面分析 run_command函数的主要工作流程 ,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函数通过调用函数parse_line分析出该命令行所对应的参数个数argc和参数指针数组*argv[ ],

其中 argv[0]中保存的是u-boot命令名字符串 ,接着调用 函数find_cmd

函数 根据命令名在u-boot命令列表中找到该命令对应的u-boot命令结构体cmd_tbl_t所在的地址

找到该u-boot命令对应的命令结构体后,就可以调用 该结构体中的u-boot命令对应的执行函数来完成该u-boot命令的功能 ,这样一个u-boot命令就执行完成了。

下面再来看看u-boot命令结构体cmd_tbl_t及其定义过程和存放的位置。

U-boot命令结构体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结构用来保存u-boot命令的相关信息包括命令名称、对应的执行函数、使用说明、帮助信息等

每一条u-boot命令都对应一个cmd_tbl_t结构体变量 ,在u-boot中是通过宏U_BOOT_CMD来实现cmd_tbl_t结构体变量的定义和初始化的。

例如,bootm命令对应U_BOOT_CMD调用,代码如下所示。

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类型的结构体变量,变量名为**__u_boot_cmd_bootm**,同时用U_BOOT_CMD宏中的参数对cmd_tbl_t结构体中的每个成员进行初始化。

Struct_Section也是一个宏定义,定义如下所示。

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

Struct_Section定义了结构体变量的段属性,cmd_tbl_t类型的结构体变量链接时全部链接到u_boot_cmd段中,可以查看u-boot.lds文件对u_boot_cmd段位置的安排。

(这里我们应该有想到,关于uboot_cmd,我们可以外界输入,内部的肯定也有提前预设的值,比如启动内核这些。如果在这个启动延时的过程中不进行输入,那么就会去执行这些默认的命令。)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1372

    浏览量

    40289
  • Linux
    +关注

    关注

    87

    文章

    11304

    浏览量

    209497
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62618
  • Uboot
    +关注

    关注

    4

    文章

    125

    浏览量

    28230
收藏 人收藏

    评论

    相关推荐

    使用uboot引导应用程序

    uboot默认是支持执行应用程序的,就像引导内核一样,我们也可以自己写一个应用程序,让uboot启动时引导。
    发表于 11-16 14:00 1005次阅读

    uboot启动怎么停在uboot命令

    256M的nandflash已经装入了uboot1.1.6和linux2.6.22. 在启动的时候,我想让板子启动时停在uboot命令行,但是停不下来,直接就去启动内核了。 当时我在uboot
    发表于 06-17 05:45

    请问在内存中执行uboot时,可以通过go命令跳转到SpiFlash(NorFlash)去执行吗?

    请教各位大牛,在内存中执行uboot时,可不可以通过go命令,跳转到SpiFlash(NorFlash)去执行?谢谢!
    发表于 06-21 05:45

    Uboot命令之间有什么区别?

    我用的板子是SMDK2440,Uboot1.1.16版本就是和视频里是一样对于Uboot我有点疑惑,uboot不是有很多命令吗,bootm , nand,....这些
    发表于 07-26 05:45

    为什么uboot执行save命令无法保存环境变量?

    uboot执行save命令无法保存环境变量执行set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
    发表于 07-31 02:19

    如何查询uboot下载执行地址?

    我根据Release包中的烧写工具和自带的M7和UBOOT镜像进行测试,UBOOT可以正常下载启动。但是在基于BSP33.0定制Uboot过程中,遇到了以下问题: 问题一、启动U-
    发表于 03-24 07:46

    UBOOT命令总结

    分享到: 很好的UBOOT命令总结,起步时就是看的这篇东西,熟悉了以后就用?看自带帮助就行:) Printenv 打印环境变量。 Uboot》 printenv baudrate=115200
    发表于 11-08 10:24 18次下载

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

    图片生成十六进制的数据数组四. 在新版本的processor SDK v3.0中,在uboot阶段如何实现增加LCD logo的显示五. 基于第四点内容,增加Uboot命令,效果是在Uboo
    发表于 04-23 17:09 10次下载
    AM335x如何在<b class='flag-5'>Uboot</b>时增加自定义的<b class='flag-5'>命令</b>控制LCD功能中文概述

    AM335x UBOOT移植编译命令详细概述

    本文的主要内容是TI的产品AM335x 的UBOOT移植编译命令详细概述
    发表于 04-24 16:26 37次下载
    AM335x <b class='flag-5'>UBOOT</b>移植编译<b class='flag-5'>命令</b>详细概述

    2021-07-28-uboot-CC2640

    uboot命令开发指南:30.4 uboot命令一、uboot启动log简析需要调试性质的开发 ,ub
    发表于 11-30 09:51 11次下载
    2021-07-28-<b class='flag-5'>uboot</b>-CC2640

    嵌入式Linux开发-uboot常用命令介绍(下篇)

    这篇文章是UBOOT命令介绍的下篇,接着上篇文章介绍剩下的几个命令用法。
    的头像 发表于 08-14 08:55 2252次阅读

    嵌入式Linux开发-编写自定义uboot命令

    U-Boot的命令为用户提供了交互功能,并且已经实现了几十个常用的命令,前面两篇文章介绍了uboot自带的常用命令使用。
    的头像 发表于 08-14 08:56 1235次阅读

    uboot自定义命令

    。 U-Boot命令众多,通过uboot命令可完成系统环境变量设置。U-Boot本质就是一份裸机程序,这样可以在U-Boot命令下调试一些硬件设备问题。U-Boot
    的头像 发表于 09-17 09:59 1257次阅读

    怎么使用uboot引导应用程序?

    uboot默认是支持执行应用程序的,就像引导内核一样,我们也可以自己写一个应用程序,让uboot启动时引导。
    的头像 发表于 02-17 16:01 1514次阅读
    怎么使用<b class='flag-5'>uboot</b>引导应用程序?

    Uboot命令实现大致流程图

    0x40。 (这里你应该知道了为什么要使用bootm命令,以及为什么要是有uImage格式) 在前面我们曾经分析过Uboot的启动流
    的头像 发表于 12-04 17:09 431次阅读
    <b class='flag-5'>Uboot</b><b class='flag-5'>命令</b>实现大致流程图