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)。

posted @ 2016-09-18 11:26  达达kiki  阅读(173)  评论(0编辑  收藏  举报