Uboot启动ARM的start.s分析
Uboot中,第一个启动文件是位于CPU/{architecture}目录下的start.s,以ARM720T为例,简单看看uboot的启动过程
_start: b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
_start是整个程序的入口,他是ARM体系结构中的reset中断,可以看到,在reset中断向量中是一条跳转语句,b reset
reset处理的流程如下:
- 将CPU设置为SVC32模式
- 如果没有定义了CONFIG_SKIP_LOWLEVEL_INIT,那么将忽略对cpu_init_crit,cpu_init_crit同样也是定义在start.s中.cpu_init_crit针对不同的处理器做的工作是不一样的.相关的宏定义有CONFIG_IMPA7,CONFIG_EP7312,CONFIG_ARMADILLO,CONFIG_NETARM,CONFIG_S3C4510B,CONFIG_INTEGRATOR,CONFIG_ARCH_INTEGRATOR.
- 接下来就是uboot的relocate,如果定义了CONFIG_SKIP_RELOCATE_UBOOT,uboot的relocate
- 初始化堆栈指针,这是调用函数的基础,在第二步中虽然调用了cpu_init_crit,但该函数使用汇编编写,没有进行堆栈操作.同时,ARM体系结构使用LR保存函数调用返回地址.所以可以在堆栈初始化前调用.
- 清除BBS段内容
- 调用start_armboot,进入C语言处理程序
同时start.s中包含对于中断服务程序的定义