main_loop()是uboot的主循环,位于\/uboot-root\/common\/main.c中。其代码如下:
void main_loop(void)
{
const char *s;
bootstage_mark_name(BOOTSTAGE_ID_MAIN_LOOP, "main_loop");
modem_init();
cli_init();
run_preboot_environment_command();
s = bootdelay_process();
if (cli_process_fdt(&s))
cli_secure_boot_cmd(s);
autoboot_command(s);
cli_loop();
}
首先用bootstage_mark_name()来标记uboot的运行状态。
接下来执行的是modem_init()。该函数什么都没做,忽略。
接下来执行的是位于\/uboot-root\/common\/cli.c中的cli_init()。里面就调用一个函数u_boot_hush_start()。该函数位于\/uboot-root\/common\/cli_hush.c中,主要是初始化一个变量top_vars,其代码如下:
int u_boot_hush_start(void)
{
if (top_vars == NULL) {
top_vars = malloc(sizeof(struct variables));
top_vars->name = "HUSH_VERSION";
top_vars->value = "0.01";
top_vars->next = NULL;
top_vars->flg_export = 0;
top_vars->flg_read_only = 1;
}
return 0;
}
通过代码分析,该函数的内容只执行一次。开始时top_vars为NULL,因此得到初始化。之后因为if判断不满足,所以以后不再执行。
接下来执行的是run_preboot_environment_command()。该函数什么都没做,忽略。
接下来执行的是bootdelay_process()。该函数位于\/uboot-root\/common\/autoboot.c中,其代码如下: