一. 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