|
我们知道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()是
如何被调用到的?
|
|