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

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

3天内不再提示

cmd_tbl_t结构体变量调用命令信息

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

一个cmd_tbl_t结构体变量包含了调用一条命令的所需要的信息

  • • 对于环境变量bootcmd,执行run_command(bootcmd, flag)之后,最终是将bootcmd中的参数解析为命令,海思hi3521a中默认参数是bootcmd=bootm 0x82000000
  • • 相当于执行bootm 0x82000000 命令
  • • 最终将调用do_bootm函数,do_bootm函数在cmd_bootm.c中实现

图片

在这个里面有一个函数:

int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
{
    bd_t *bd = gd- >bd;
    char *s;
    int machid = bd- >bi_arch_number;
    void (*theKernel)(int zero, int arch, uint params);
 
#ifdef CONFIG_CMDLINE_TAG
#ifdef CONFIG_HI3536_A7
    char *commandline = getenv("slave_bootargs");
#else
    char *commandline = getenv("bootargs");   //(1)
 
#endif
#endif
 
    if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
        return 1;
 
    theKernel = (void (*)(int, int, uint))images- >ep; //(2)
 
    s = getenv ("machid");       //(3)
    if (s) {
        machid = simple_strtoul (s, NULL, 16);
        printf ("Using machid 0x%x from environmentn", machid);
    }
 
    show_boot_progress (15);
 
    debug ("## Transferring control to Linux (at address %08lx) ...n",
           (ulong) theKernel);
 
 
    setup_start_tag (bd);     //(4)
 
    setup_memory_tags (bd);     
    setup_commandline_tag (bd, commandline); //(5)
 
    if (images- >rd_start && images- >rd_end)  
        setup_initrd_tag (bd, images- >rd_start, images- >rd_end);
 
    setup_eth_use_mdio_tag(bd, getenv("use_mdio"));
    setup_eth_mdiointf_tag(bd, getenv("mdio_intf"));
    setup_ethaddr_tag(bd, getenv("ethaddr"));   
 
    setup_end_tag (bd);      //(6)
 
 
    /* we assume that the kernel is in place */
    printf ("nStarting kernel ...nn");
 
#ifdef CONFIG_USB_DEVICE
    {
        extern void udc_disconnect (void);
        udc_disconnect ();
    }
#endif
 
    cleanup_before_linux ();   //(7)
 
    theKernel (0, machid, bd- >bi_boot_params); //(8)
    /* does not return */
 
    return 1;
}
  • • (1)获取环境变量bootargs中的值,该环境变量用来传递参数给kernel
  • • (2)images->ep的地址是kernel的程序的入口地址,也就是将函数指针theKernel指向kernel最先执行的地方。
  • • (3)获取环境变量machid,这个应该是机器码,海思设备没有定义在环境变量中
  • • (4)这里是建立一个链表用来存放传递给内核的参数,在board_init函数中有赋值 gd->bd->bi_boot_params = CFG_BOOT_PARAMS; CFG_BOOT_PARAMS = 0x80000000 + 0x0100 = 0x80000100
  • • (5)将commandline的值添加到链表中
  • • (6)结束参数的填充
  • • (7)启动linux内核前的一个清除操作,主要是关闭中断,关闭缓存等操作
  • • (8)由前面我们知道theKernel实际指向的是kernel的入口地址,执行这一句之后,uboot就结束了运行,kernel正式运行就从这里开始。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10992

    浏览量

    206744
  • 函数
    +关注

    关注

    3

    文章

    3904

    浏览量

    61310
  • Uboot
    +关注

    关注

    4

    文章

    123

    浏览量

    27874
  • 结构体
    +关注

    关注

    1

    文章

    125

    浏览量

    10750
收藏 人收藏

    评论

    相关推荐

    cmd用命令大全 cmd运行命令

    cmd用命令大全 cmd运行命令
    发表于 08-15 20:25

    labview调用dll获取硬件信息结构求教

    调用winmm.dll中的waveOutGetDevCaps获取声卡信息,但是里面有结构数据,尝试了几次都失败告终,求大虾指教。MMRESULT waveOutGetDevCaps
    发表于 01-14 10:20

    【ok210试用体验】如何添加一个简单的U-boot命令

    、属性、是否可重复、名称、短帮助信息,长帮助信息。 因此,我们可以建立一个简单的命令: #include #include intdo_hello (cmd_tbl_t *cmdt
    发表于 09-23 18:11

    【Rico Board试用体验】第十四篇☞rico board的uboot添加自定义命令,编译不通过

    #include static int do_hello (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]){printf
    发表于 12-12 20:55

    嵌入式Linux学习引导-Uboot移植之添加自定义命令

    cmd_tbl_t结构。然后run_command函数使用返回的cmd_tbl_t结构中的函数指针调用hello
    发表于 02-16 17:19

    计算机cmd用命令集合之详细攻略

    cmd:计算机cmd用命令集合之详细攻略
    发表于 12-24 11:50

    U_BOOT_CMD宏将cmd_tbl_t结构放在u_boot_cmd段中的过程是以下这样的吗?

    最近在着手移植UBOOT,对于U_BOOT_CMD宏将cmd_tbl_t结构放在u_boot_cmd段中的过程不是很确定,请教下各位。对于
    发表于 09-02 05:45

    常见的CMD命令CMD命令调用步骤

    Java基础——调用CMD命令
    发表于 11-08 08:43

    结构变量的定义与使用变量访问结构成员

    知识点回顾关于找最大公共子串的两种解题方法结构的定义(3种)结构变量的定义与使用变量访问
    发表于 12-17 07:10

    cmd用命令大全 cmd运行命令

    cmd用命令大全 2K和XP下的CMD命令 accwiz.exe > 辅助工具向导
    发表于 01-08 09:12 3.1w次阅读

    vim常用命令

    vim常用命令
    发表于 01-08 15:59 3次下载

    CMD命令行高级教程

    CMD命令行高级教程
    发表于 10-24 08:31 30次下载
    <b class='flag-5'>CMD</b>的<b class='flag-5'>命令</b>行高级教程

    cmd用命令大全

    Windows系统,还是离不开DOS命令的操作。学习DOS系统操作,首先了解命令提示符。先了解每个命令提示符的作用,然后才能够灵活运用。下面将详细的为大家介绍cmd
    的头像 发表于 02-07 10:55 2.3w次阅读
    <b class='flag-5'>cmd</b>常<b class='flag-5'>用命令</b>大全

    Uboot之命令行框架

    1 #include 2 #include 3 4 int do_cmdusr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv
    发表于 05-15 15:18 1593次阅读
    Uboot之<b class='flag-5'>命令</b>行框架

    Linux内核中Uboot命令处理

    完成。U-Boot在include/command.h中定义了一个非常重要的cmd_tbl_s结构体,它在命令的实现方面起着至关重要的作用。 struct cmd_tbl_s { ch
    的头像 发表于 12-04 17:23 217次阅读