uboot启动流程及内核参数传递

本文详细介绍了开发板上的Bootloader启动流程,包括从iROM中的Bootloader0到uboot的引导过程。uboot启动分为汇编代码的第一阶段和C代码的第二阶段,涉及中断向量设置、内存初始化、设备初始化等多个环节。文章还提及了uboot的主循环,用于接收和执行命令。
摘要由CSDN通过智能技术生成

一. Bootloader启动流程

        开发板中的Bootloader启动过程一般分为三个流程。当开发板上电后,系统首先执行存储在iROM中的Bootloader0(BL0)程序,做一些基本的初始化工作;随后根据选择的存储器(mmc/sd/nand flash/nor flash)中读取Bootloader1(BL1)程序到stepping stone,BL1可以进行系统时钟初始化等工作。最后一步才是真正的uboot程序引导,BL1拷贝uboot程序(称为BL2)到sdram,BL2可以初始化堆栈、内存以及引导os等功能。

 

二. uboot启动流程(BL2阶段)

     在完成了前面两部bootloader的工作后,真正进入了uboot的工作范围。uboot的启动也分为两阶段,以s3c6410提供的uboot代码为例:

 2.1  第一阶段(汇编代码部分)

(1)设置中断向量

(2)设置SVC模式

(3)设置控制寄存器

(4)关闭看门狗

(5)关中断

(6)拷贝第二阶段代码

(7)设置堆栈

(8)清除bss段

(9)跳转到第二阶段代码

	ldr	pc, _start_armboot

_start_armboot:
	.word start_armboot

 2.2 第二阶段(C代码部分)

 (1) 函数start_armboot在lib_arm/Board.c中,各种初始化工作:

void start_armboot (void)

{

    flash_init ()

    mem_malloc_init()

    nand_init()

   env_relocate()

   devices_init()

   jumptable_init()

   console_init_r()

   enable_interrupts()

   board_late_init()

   eth_initialize()

   最后循环方式,等待接受命令

   for (;;) {
          main_loop ();   
   }

}

(2) 主循环负责命令的输入以及调用相应的command

void main_loop (void)
{
#ifndef CFG_HUSH_PARSER
	static char lastcommand[CFG_CBSIZE] = { 0, };
	int len;
	int rc = 1;
	int flag;
#endif

#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
	char *s;
	int bootdelay;
#endif
#ifdef CONFIG_PREBOOT
	char *p;
#endif
#ifdef CONFIG
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值