/* main_loop() 是uboot的主循环,负责接收uboot的相应命令执行相应操作 */
for (;;) {
main_loop ();
}
/* NOTREACHED - no way out of command loop except booting */
}
四、U-boot引导Linux镜像分析
1、/common/main.c的main_loop分析
void main_loop (void)
{
debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "");
if (bootdelay >= 0 && s && !abortboot (bootdelay)) {
# ifdef CONFIG_AUTOBOOT_KEYED
int prev = disable_ctrlc(1); /* disable Control C checking */
# endif
# ifndef CFG_HUSH_PARSER
run_command (s, 0);//如果不键入任何健的话就会进入自动启动阶段
# else
parse_string_outer(s, FLAG_PARSE_SEMICOLON |
FLAG_EXIT_FROM_LOOP);
# endif
}
}
int run_command (const char *cmd, int flag)
{
while (*str) {
/* OK - call function to do the command */
/*根据uboot的函数指针执行相应的命令,其中就包含tftp和bootm*/
if ((cmdtp->cmd) (cmdtp, flag, argc, argv) != 0) {
rc = -1;
}
}
}
2、引导函数go指令的实现
int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
ulong addr, rc;
int rcode = 0;
/* we assume that the kernel is in place */
printf ("\nStarting kernel ...\n\n");
theKernel (0, machid, bd->bi_boot_params); /* 启动linux*/
}
五、U-BOOT的内存镜像分布图(1)
(1)在刚上电时的uboot在nor中的内存镜像