一个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文章
11196浏览量
208668 -
函数
+关注
关注
3文章
4276浏览量
62303 -
Uboot
+关注
关注
4文章
125浏览量
28122 -
结构体
+关注
关注
1文章
129浏览量
10822
发布评论请先 登录
相关推荐
【ok210试用体验】如何添加一个简单的U-boot命令
、属性、是否可重复、名称、短帮助信息,长帮助信息。 因此,我们可以建立一个简单的命令: #include #include intdo_hello (cmd_tbl_t *cmdt
发表于 09-23 18:11
嵌入式Linux学习引导-Uboot移植之添加自定义命令
的cmd_tbl_t结构。然后run_command函数使用返回的cmd_tbl_t结构中的函数指针调用hello
发表于 02-16 17:19
U_BOOT_CMD宏将cmd_tbl_t结构体放在u_boot_cmd段中的过程是以下这样的吗?
最近在着手移植UBOOT,对于U_BOOT_CMD宏将cmd_tbl_t结构体放在u_boot_cmd段中的过程不是很确定,请教下各位。对于
发表于 09-02 05:45
批处理常用命令大全
批处理常用命令大全: 批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系
发表于 12-08 10:20
•0次下载
C语言常用命令设计的实验程序资料说明
本文档的主要内容详细介绍的是C语言常用命令设计的实验程序资料说明
1. 熟悉和掌握包括顺序结构、选择结构、循环结构、函数、数组、结构
发表于 11-02 17:18
•7次下载
Uboot之命令行框架
1 #include 2 #include 3 4 int do_cmdusr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 5 { 6
发表于 05-15 15:18
•1677次阅读
Linux内核中Uboot命令处理
完成。U-Boot在include/command.h中定义了一个非常重要的cmd_tbl_s结构体,它在命令的实现方面起着至关重要的作用。 struct
评论