- 论坛徽章:
- 0
|
start.s的片段代码:
- relocate: /* 把U-Boot重新定位到RAM */
- adr r0, _start /* r0是程序头 */
- ldr r1, _TEXT_BASE /* U-Boot长度 */
- cmp r0, r1 /* 比较r0和r1,调试的时候不要执行重定位 */
- beq stack_setup /* 如果r0等于r1,跳过重定位代码 */
- /* 准备重新定位代码 */
- ldr r2, _armboot_start
- ldr r3, _bss_start
- sub r2, r3, r2 /* r2 得到armboot的大小 */
- add r2, r0, r2 /* r2 得到要复制代码的末尾地址 */
- copy_loop: /* 重新定位代码 */
- ldmia r0!, {r3-r10} /*从源地址[r0]复制 */
- stmia r1!, {r3-r10} /* 复制到目的地址[r1] */
- cmp r0, r2 /* 复制数据块直到源数据末尾地址[r2] */
- ble copy_loop
-
- /* 初始化堆栈等 */
- stack_setup:
- ldr r0, _TEXT_BASE /* 上面是128 KiB重定位的u-boot */
- sub r0, r0, #CFG_MALLOC_LEN /* 向下是内存分配空间 */
- sub r0, r0, #CFG_GBL_DATA_SIZE /* 然后是bdinfo结构体地址空间 */
- sub sp, r0, #12 /* 为abort-stack预留3个字 */
- clear_bss:
- ldr r0, _bss_start /* 找到bss段起始地址 */
- ldr r1, _bss_end /* bss段末尾地址 */
- mov r2, #0x00000000 /* 清零 */
- clbss_l:str r2, [r0] /* bss段地址空间清零循环... */
- add r0, r0, #4
- cmp r0, r1
- bne clbss_l
复制代码
在网上找到的,不知道对不对,_TEXT_BASE是什么?bss段指什么?
[ 本帖最后由 xxmv99 于 2008-1-30 18:05 编辑 ] |
|