bootloader生命周期:初始化硬件==》设置启动参数==》跳到Linux内核的首地址==》消亡。那么它是怎么启动内核的呢或者说在启动内核之前它究竟完成了哪些工作呢?
.globl _start
_start:
mrs r0 , cpsr
bic r0 , r0 , #0x1f
orr r0 , r0 , #0xd3
msr cpsr , r0
ldr r0,
=0x53000000
ldr r1,
=
0
str r1, [r0]
ldr r0 ,
=0x4a000008
ldr r1 ,
=0xffffffff
str r1 , [r0]
ldr r0 ,
=0x4a00001c
ldr r1 ,
=0x7fff
str r1 , [r0]
mrc p15,
0, r2, c1, c0,
0
orr r2, r2, #(
1
<<
12)
mcr p15,
0, r2, c1, c0,
0
mrc p15,0,r0,c1,c0,0
bic r0,r0,#0x00002300 @clear bits 13,9:8(--V- --RS)
bic r0,r0,#0x00000087 @clear bits 7,2:0(B--- -CAM)
orr r0,r0,#0x00000002 @set bit 1(A)Align
orr r0,r0,#0x00001000 @set bit 12(I)I-Cache
mcr p15,0,r0,c1,c0,0
ldr r1 ,
=
0
str r1, [r1]
ldr r1, [r1]
cmp r1, #
0
ldreq sp,
=
4096
ldrne sp,
=(0x40000000
+
4096)
*1.7 时钟初始化,主要是MPLLCON、CLKDIVN寄存器的设置,特别注意将总线模式改为异步总线模式*/
bl clock_init
bl sdram_init
bl nand_init
bl CopyCode2Ram
ldr r0,
=
__bss_start
ldr r1,
=__bss_end
cmp r0, r1
beq setup_stack
mov r2, #
0
clear_loop
:
str r2, [r0], #
4
cmp r0, r1
bne clear_loop
relocate
:
mov r0, #
0
ldr r1,
=__start
ldr r2,
=__bss_start
sub r2, r2, r1