Start.s详细分析4
bss段:用于存放未初始化的全局变量和局部变量的一块内存区域,根据C语言约定全局变量未定义会被初始化为0,而局部变量不会被初始化,其值不一定。
在程序开始处,bss段自动清零,因此如果在程序过程中出现bss段清0,我认为应该是出现了两个独立的程序段,而他们在结构上是一个整体,由于系统的初始化是在整体的最开始处,因此需要人为在第一个程序段结尾处清0,以此保证第二段程序执行时bss段已经清0,未定义全局变量被赋值为0,这个思想是基于C语言的使用约定的,代码段如下:
1 clear_bss: 2 ldr r0, _bss_start 3 ldr r1, _bss_end 4 mov r2, #0x00000000 5 6 clbss_l:str r2, [r0] /* clear loop... */ 7 add r0, r0, #4 8 cmp r0, r1 9 ble clbss_l
下面这段程序含义未知,待添加:
SetLoadFlag: adr r0, _start ldr r1, _TEXT_BASE cmp r0, r1 ldr r2, =PreLoadedONRAM mov r3, #1 streq r3, [r2]
执行完上述过程后,通过下面程序跳转至stage2:
ldr pc, _start_armboot _start_armboot: .word start_armboot
将_start_armboot值装载到pc(pc程序计数器的作用是,装载下一条被执行指令的地址),调用start_armboot(stage2)。