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

    文章

    1362

    浏览量

    40224
  • Linux
    +关注

    关注

    87

    文章

    11222

    浏览量

    208891
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62420
  • Uboot
    +关注

    关注

    4

    文章

    125

    浏览量

    28161
收藏 人收藏

    评论

    相关推荐

    Linux内核自解压过程分析

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

    uboot启动怎么停在uboot命令

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

    编译IMX6ULL开发板的UbootLinux内核

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

    ubootlinux内核进行适配

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

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

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

    在github上下载Xilinx提供的Opensource linuxuboot内核gz格式压缩包的方法

    Xilinx提供的linuxuboot内核版本会不断地维护升级和更新,有些时候,我们碰到的问题可能换一个别的内核版本就能解决。在此,总结一下内核
    发表于 02-08 08:34 1190次阅读
    在github上下载Xilinx提供的Opensource <b class='flag-5'>linux</b>和<b class='flag-5'>uboot</b><b class='flag-5'>内核</b>gz格式压缩包的方法

    UBOOT命令总结

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

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

    本文针对嵌入式Linux操作系统提出了一种新的更新机制,并且基于ARM9微处理器和NANDFlash存储器,对ubootLinux内核进行
    发表于 04-07 11:00 2776次阅读
    基于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 1350次阅读
    英创信息技术嵌入式<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 42次下载
    【嵌入式】构建嵌入式<b class='flag-5'>Linux</b>系统(<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

    uboot自定义命令

    U-Boot本质是一个裸机程序,是一种普遍用于嵌入式系统的开源的Bootloader,作用是用来引导操作系统,以及给开发人员提供测试调试工具。主要负责基本硬件初始化,导启动内核启动
    的头像 发表于 09-17 09:59 1208次阅读

    Uboot命令实现大致流程图

    zImage内核镜像下载到开发板之后,可以使用u-boot的go命令进行直接跳转,这个时候内核直接解压启动。 但是此时的内核无法挂载文件系统,因为go
    的头像 发表于 12-04 17:09 391次阅读
    <b class='flag-5'>Uboot</b><b class='flag-5'>命令</b>实现大致流程图

    uboot命令的执行过程是什么

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

    Linux系统shell命令解析

    shell是Linux系统的用户界面,提供了用户与内核交互的一种接口,它接收用户输入的命令并到送到内核去执行,因此也被称为Linux
    的头像 发表于 11-05 15:40 134次阅读