uboot终极目标:启动内核

本文详细解析了UBoot如何通过main_loop函数获取并执行启动命令,包括nboot从nand的kernel分区加载内核到内存,以及bootm命令启动内核的过程。重点关注了nand分区定义、内核头部结构体和加载地址的确定。
摘要由CSDN通过智能技术生成
uboot总的启动linux内核的流程:启动文件start.S基本软硬件环境初始化好之后,调用arm_lib/board.c下的startarm_boot()函数,这个函数最终调用main_loop()函数,内核的调用肯定就在这里面完成了。

因此,首先分析common/main.c:的main_loop函数:

main_loop()
{
	char *s;
	int bootdelay;
	embedsky_lcd_Init();
	extern int mtdparts_init(void);
	if (!getenv("mtdparts"))
	{
		run_command("mtdparts default", 0);
	}
	else
	{
		mtdparts_init();
	}
	s = getenv ("bootcmd");
	if (bootdelay >= 0 && s && !abortboot (bootdelay)) 
	{
		if (bBootFrmNORFlash())  //如果从Nor启动,即进入u-boot菜单下载模式,可以去分析bBootFrmNORFlash()这个函数
		{
			run_command("menu", 0);
		}
			/*
			 * Main Loop for Monitor Command Processing
			 */
		else  //从nand启动:wince和linux的选择
		{
	#ifdef CONFIG_SURPORT_WINCE //未定义
			if (!TOC_Read())//wince匹配
			{
				/* Launch wince */
				char cmd_buf[16];
				printf("Booting wince ...\n");            
				strcpy(cmd_buf, "wince");
				run_command(cmd_buf, 0);
			}
			else//最终匹配加载Linux内核
	#endif
			{
				printf("Booting Linux ...\n");
				//boot_zImage(0x200000,0x200000);
				//启动内核
				run_command (s, 0);
			}
		}
	}
	//run_command("menu", 0);
	/*进入menu模式后的:获取命令以及操作*/
	for (;;) {
		len = readline (CFG_PROMPT); //获取命令的长度

		flag = 0;	/* assume no special flag
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值