u-boot深入分析——启动部分(一)
时间:2009-06-17 来源:fengyuewu
启动分为两个部分,第一部分完成主要功能:
硬件设备、栈指针的初始化、将第二阶段代码复制到ram中。
第二部分主要功能:
检测内存映射,为内核设置启动参数,从flash读取内核到ram,读取ram。
下面分别对两部分进行分析:
第一部分主要文件是start.S和lowlevel_init.S
入口start.S:
.globl _start |
1,start_code步骤分析:
首先将cpu工作状态置于超级用户模式:
start_code:
mrs r0,cpsr |
关闭WatchDog,设置中断屏蔽以及系统时钟
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) |
重置u-boot的代码位置,首先检测当前位置与运行地址(_TEXT_BASE)是否相同,同则转至下步,否则将代码段复制到运行地址:
#ifndef CONFIG_SKIP_RELOCATE_UBOOT |
beq stack_setup |
设置堆栈指针,bss段清零,跳转到第二阶段代码:
/* Set up the stack */ |
2,cpu寄存器初始化过程分析:
清除指令、数据cache:
mov r0, #0 |
禁用mmu和cache,跳转到开发板相关的lowlevel_init函数:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT |
3,lowlevel_init函数分析:
_TEXT_BASE:
.ltorg /*ldr使用的数据缓冲池*/ |
13个寄存器的值:
|
第一阶段启动分析完成。