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

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

3天内不再提示

Linux内核中Uboot命令处理

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

命令处理

main.c中的代码实现了将一个命令的所有参数分离存放在argv数组中,参数的数目为argc,完成了读取命令行和解析命令行的工作。命令的处理由common/command.c文件中的函数完成。U-Boot在include/command.h中定义了一个非常重要的cmd_tbl_s结构体,它在命令的实现方面起着至关重要的作用。

struct cmd_tbl_s {
            char    *name;       /* 命令名称            */
            int     maxargs; /* 命令的最大参数   */
            int     repeatable;  /* 是否可重复(按回车键是否会重复执行)
            */
            int     (*cmd)(struct cmd_tbl_s *, int, int, char * const []);  /* 命令响应函数*/
            char    *usage;      /* 简短的用法说明   */
        #ifdef   CONFIG_SYS_LONGHELP
            char    *help;       /* 较详细的帮助*/
        #endif
        #ifdef CONFIG_AUTO_COMPLETE
            /* 响应自动补全参数*/
            int     (*complete)(int argc,char*const argv[],char last_char,int maxv,char*cmdv[]);
        #endif
        };

cmd_tbl_s结构体包含的成员变量:命令名称、最大参数个数、可重复性、命令响应函数、用法、帮助和命令补全函数,每个命令都由这个结构体来描述。当输入“help”或者“?”会打印出所有的命令和它的usage,输入“help”或者“?”和命令名称时,会打印出help信息

添加一个命令时,利用宏U_BOOT_CMD定义一个新的cmd_tbl_s结构体,并对这个结构体初始化和定义结构体的属性。例如,在文件common/cmd_bdinfo.c中:

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

增加了一个命令,它的名称为bdinfo,最大参数数目为1,可重复,响应函数是do_bdinfo, usage为“print Board Info structure”,没有帮助信息。U_BOOT_CMD宏在include/command.h中定义,当不配置命令补全时,它最终被展开为:

#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}

其中,“##”与“#”是预编译操作符,“##”表示字符串连接,“#”表示后面紧接着的是一个字符串。cmd_tbl_t就是struct cmd_tbl_s,用于__u_boot_cmd_##name结构体。

__attribute__定义了结构体的属性,将结构体放在.u_boot_cmd段中。简单的说,就是利用U_BOOT_CMD定义struct cmd_tbl_s结构体变量,并把类变量都放在一个段中。

在链接脚本中指定了.u_boot_cmd段的起始地址和结束地址,又已知每个struct cmd_tbl_s结构体占用内存空间的大小,这样就很方便地遍历所有的struct cmd_tbl_s结构体。这种巧妙的方式充分利用了链接器的功能特点,避免了花费大量的精力,去维护和更新命令结构体表。

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

cmd_process函数首先调用find_cmd函数根据传入的参数,在.u_boot_cmd段区域查找命令,如果没有找到对应的命令,打印出提示信息并返回。

如果找到则返回命令结构体 cmdtp,再检查传入参数的合法性,最后通过cmd_call函数调用命令响应函数(cmdtp->cmd)(cmdtp, flag, argc, argv)。

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

    关注

    3

    文章

    1309

    浏览量

    39862
  • Linux
    +关注

    关注

    87

    文章

    10994

    浏览量

    206772
  • 函数
    +关注

    关注

    3

    文章

    3911

    浏览量

    61313
  • Uboot
    +关注

    关注

    4

    文章

    123

    浏览量

    27877
收藏 人收藏

    评论

    相关推荐

    Linux内核自解压过程分析

    uboot完成系统引导以后,执行环境变量bootm中的命令;即,将Linux内核调入内存中并调用do_bootm函数启动内核,跳转至kern
    的头像 发表于 12-08 14:00 411次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>自解压过程分析

    uboot引导内核问题

    目前手上的板子用的是S3C2440的cpu,外围只挂接了norflash,没有nandflash,现在的想法是把uboot内核和根文件系统都放在norflash,请问下如何修改uboot
    发表于 11-26 20:23

    【TQ335XB_V2试用体验】+uboot内核编译

    uboot使用mak命令进行编译。编译结果:内核的编译也是类似的,进行到内核源码目录,先复制配置文件,这里与手册上的不太一样。打开配置界面
    发表于 11-01 23:32

    uboot启动怎么停在uboot命令

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

    如何在uboot-2012.04修改各分区大小?

    uboot-2012.04怎么修改分区大小?是在哪个文件修改?是修改smdk2440.hbootcmd命令吗?(
    发表于 10-15 03:31

    编译IMX6ULL开发板的UbootLinux内核

    图所示:上图生成的“u-boot.imx”文件就是Uboot的景象文件,我们可以把它拷贝到Windows系统下然后使用MFGTools烧写工具烧写到开发板运行。 29.3 编译终结者开发板Linux内核
    发表于 07-15 10:47

    ubootlinux内核进行适配

    在嵌入式开发过程Linux认为每一个硬件都是定制化的,所以都需要一个唯一的编码,就是机器码,机器码的主要工作就是为了ubootlinux内核
    发表于 12-20 07:51

    如何通过uboot命令行去更新内核

    如何通过uboot命令行去更新内核、dtb、uboot文件?
    发表于 01-11 07:07

    ubootlinux内核构建的环境设置是否相同?

    ubootlinux 内核构建的环境设置是否相同,使用以下命令?来源/opt/fsl-imx-xwayland/5.15-kirkstone/environment-setup-
    发表于 03-21 06:42

    基于ARM9和NANDFlash对ubootLinux内核进行修改

    本文针对嵌入式Linux操作系统提出了一种新的更新机制,并且基于ARM9微处理器和NANDFlash存储器,对ubootLinux内核进行
    发表于 04-07 11:00 2599次阅读
    基于ARM9和NANDFlash对<b class='flag-5'>uboot</b>和<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>进行修改

    英创信息技术嵌入式Linux工控主板uboot命令简介

    成都英利公司提供的EM9X60系列嵌入式Linux工控主板,均预装了Linux2.6.30内核操作系统及根文件系统,包括bootstrap、uboot、uImage及根文件系统,用户可
    的头像 发表于 01-15 14:01 1168次阅读
    英创信息技术嵌入式<b class='flag-5'>Linux</b>工控主板<b class='flag-5'>uboot</b><b class='flag-5'>命令</b>简介

    【嵌入式】构建嵌入式Linux系统(uboot内核、文件系统)

    嵌入式Linux系统知识架构及层次嵌入式Linux系统构成及启动略析嵌入式Linux三剑客之uboot技术嵌入式Linux三剑客之
    发表于 10-20 18:20 41次下载
    【嵌入式】构建嵌入式<b class='flag-5'>Linux</b>系统(<b class='flag-5'>uboot</b>、<b class='flag-5'>内核</b>、文件系统)

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

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

    Uboot命令实现大致流程图

    中传递给内核。 传递相关启动参数必须使用u-boot的bootm命令进行跳转,但是u-boot的bootm命令只能处理uImage镜像。 uImage相对于zImage在头部多了64个
    的头像 发表于 12-04 17:09 195次阅读
    <b class='flag-5'>Uboot</b><b class='flag-5'>命令</b>实现大致流程图

    uboot命令的执行过程是什么

    U-boot是通过执行u-boot提供的命令来加载Linux内核的,其中 命令bootm的功能 即为从memory启动Linux
    的头像 发表于 12-04 17:31 323次阅读