接上
run_main_loop(board_r.c) =》 common/main.c
s = bootdelay_process(); //<! 得到 bootcmd 参数 & save bootdelay, s=bootcmd
autoboot_command(s); // bootdelay时间内如果没有按键,则执行bootcmd里的命令
cli_loop(); /* 执行hush shell命令解释器 */
说到这里,提一下uboot采用的两个比较难理解的东西。
环境变量的操作,使用了哈希表。
uboot命令,使用了哈希shell,不知道是什么鬼。
这里给出链接地址,去找大牛:http://blog.csdn.net/metersun/article/category/6417297
bootcmd的命令:
bootcmd="mmc dev ${mmcdev}; 设置当前设备
if mmc rescan; 扫描设备
then
if run loadbootscript;
then run bootscript;
else if run loadimage; //走的这里
then run mmcboot; bootm ${loadaddr};
else
run netboot;
fi;
fi;
else
run netboot;
fi"
loadimage的内容:
name="loadimage"
value="fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}"
mmcboot内容:
name="mmcboot"
value="echo Booting from mmc ...; "
"run mmcargs; "
"if test ${boot_fdt} = yes || test ${boot_fdt} = try; " 这里为真,环境变量boot_fdt=try
"then "
"if run loadfdt; "
"then"
"bootz ${loadaddr} - ${fdt_addr}; "
"else if test ${boot_fdt} = try; "
"then"
"bootz; " 这里
"else"
"echo WARN: Cannot load the DT; "
"fi; "
"fi; "
"else bootz; "
"fi;"
然后bootz,启动了内核。
然而,原来uboot不是要给内核传机器ID、环境变量地址吗?
这一套是怎么传的,就不知道了,以后再深究吧。。。