主题 : 对uboot启动内核的一点疑问 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 76978
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
贡献值: 0 点
综合积分: 12 分
注册时间: 2012-09-01
最后登录: 2012-11-19
楼主  发表于: 2012-09-16 11:16

 对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()是

如何被调用到的?望过来人提点。