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

描述

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

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

Linux

在这个里面有一个函数:

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正式运行就从这里开始。
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分