2281|0

8

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

对uboot启动内核的一点疑问 [复制链接]

我们知道uboot启动内核的一般流程是:
start.s-->start_armboot-->main_loop-->rum_command-->do_bootm-->do_bootm_liunx
但其中有些具体的细节还是弄不太明白

1,
始终不太明白以下这句话是如何能执行命令的
/* OK - call function to do the command */
if ((cmdtp->cmd) (cmdtp, flag, argc, argv) != 0) {
rc = -1;
}

(cmdtp->cmd) (cmdtp, flag, argc, argv)是一个具体的函数吗,好像不是。而是cmd_tbl_s 中的一员

struct cmd_tbl_s{
……
int(*cmd)(struct cmd_tbl_s *, int, int, char *[]);
……
}
对结构体成员赋值,这样就能执行命令吗。
2.
这时候如果在main_loop中
s = getenv ("bootcmd");
if (bootdelay >= 0 && s && !abortboot (bootdelay))-->
run_command (s, 0);-->
而 "bootcmd="CONFIG_BOOTCOMMAND
#define CONFIG_BOOTCOMMAND "nand read c0008000 60000 1c0000;bootm c0008000"

到了run_command中的 (cmdtp->cmd) 传入的就会这个"nand read c0008000 60000 1c0000;bootm c0008000". 我对这句的理解

是从0x60000 nandflash的地址读出0x1c0000字节的数据到内存中的0xc0008000,然后从这里bootm启动内核。
当这一串的搬运指令传到了if ((cmdtp->cmd) (cmdtp, flag, argc, argv) != 0)中,如何再调用到do_bootm()。do_bootm()是

如何被调用到的?
此帖出自Linux开发论坛
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表