Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5401714
  • 博文数量: 1272
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 15161
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1272)

文章存档

2020年(55)

2019年(193)

2018年(81)

2017年(80)

2016年(70)

2015年(52)

2014年(41)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: Android平台

2013-09-22 16:02:05

crt0.S.  此文件 把原有  Start.S 部分代码进行封装, 一般此文件无需修改. Start.S 中 最后一条执行代码 bl _main 语句跳到此处运行.

点击(此处)折叠或打开

  1. ENTRY(_main)

  2. /*
  3.  * Set up initial C runtime environment and call board_init_f(0).
  4.  */

  5. //为 board_init_f 调用 准备 GD 和 堆栈的存放空间(RAM空间)
  6. #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
  7.     ldr    sp, =(CONFIG_SPL_STACK)
  8. #else
  9.     ldr    sp, =(CONFIG_SYS_INIT_SP_ADDR)   //设置调用c语言函数的堆栈并以八字节对齐.
  10. /*
  11.     #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE=0x30000000 + 0x1000 - GENERATED_GBL_DATA_SIZE=160Bytes=sizeof(struct global_data)+16字节对齐)
  12.     #define GD_SIZE 152 (sizeof(struct global_data))
  13. */
  14. #endif
  15.     bic    sp, sp, #7    /* 8-byte alignment for ABI compliance 8字节对齐 */
  16.     sub    sp, #GD_SIZE    /* allocate one GD above SP */
  17.     bic    sp, sp, #7    /* 8-byte alignment for ABI compliance */
  18.     mov    r8, sp        /* GD is above SP */  
  19.     /* 此处 全局变量 gd 定义.
  20.         arch/arm/include/asm/global_data.h:#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")
  21.         即 gd 的地址是存在 r8寄存器的. 此时gd空间已经准备好, 可以交给 board_init_f 去初始化了.
  22.     */
  23.     mov    r0, #0
  24.     bl    board_init_f   // 设置传递给board_init_f的参数 r0=0, 定义在 board.c, 硬件的初始化init_sequence数组, 设置 gd 信息.

  25. #if ! defined(CONFIG_SPL_BUILD)

  26. /*
  27.  * Set up intermediate environment (new sp and gd) and call
  28.  * relocate_code(addr_moni). Trick here is that we'll return
  29.  * 'here' but relocated.
  30.  */

  31.     ldr    sp, [r8, #GD_START_ADDR_SP]    /* sp = gd->start_addr_sp */
  32.     bic    sp, sp, #7    /* 8-byte alignment for ABI compliance */
  33.     ldr    r8, [r8, #GD_BD]        /* r8 = gd->bd */
  34.     sub    r8, r8, #GD_SIZE        /* new GD is below bd */

  35.     adr    lr, here
  36.     ldr    r0, [r8, #GD_RELOC_OFF]        /* r0 = gd->reloc_off */
  37.     add    lr, lr, r0
  38.     ldr    r0, [r8, #GD_RELOCADDR]        /* r0 = gd->relocaddr */
  39.     b    relocate_code  // 定义在 arch/arm/lib/relocate.S
  40. here:

  41. /* Set up final (full) environment  清除bss段 */

  42.     bl    c_runtime_cpu_setup    /* we still call old routine here */

  43.     ldr    r0, =__bss_start    /* this is auto- */
  44.     ldr    r1, =__bss_end        /* this is auto- */

  45.     mov    r2, #0x00000000        /* prepare zero to clear BSS */
  46. //循环清除bss段
  47. clbss_l:cmp    r0, r1            /* while not at end of BSS */
  48.     strlo    r2, [r0]        /* clear 32-bit BSS word */
  49.     addlo    r0, r0, #4        /* move to next */
  50.     blo    clbss_l

  51.     /* call board_init_r(gd_t *id, ulong dest_addr) */
  52.     mov    r0, r8            /* gd_t */
  53.     ldr    r1, [r8, #GD_RELOCADDR]    /* dest_addr */
  54.     /* call board_init_r */
  55.     ldr    pc, =board_init_r    /* this is auto- board_init_r 正式进入第二阶段的初始化 /  

  56.     /* we should not return here. */

  57. #endif

  58. ENDPROC(_main)


arch/arm/lib/relocate.S 大妈重定位启动的代码

点击(此处)折叠或打开

  1. ENTRY(relocate_code)  //比较当前位置和 __image_copy_start 位置 /* r0 = gd->relocaddr */
  2.     ldr    r1, =__image_copy_start    /* r1 <- SRC &__image_copy_start */
  3.     subs    r9, r0, r1        /* r9 <- relocation offset *
  4.     beq    relocate_done        /* skip relocation */
  5.     ldr    r2, =__image_copy_end    /* r2 <- SRC &__image_copy_end */

  6. copy_loop:
  7.     ldmia     {r10-r11}        /* copy from source address [r1] */
  8.     stmia     {r10-r11}        /* copy to target address [r0] */
  9.     cmp    r1, r2            /* until source end address [r2] */
  10.     blo    copy_loop

  11.     /*
  12.      * fix .rel.dyn relocations
  13.      */
  14.     ldr    r2, =__rel_dyn_start    /* r2 <- SRC &__rel_dyn_start */
  15.     ldr    r3, =__rel_dyn_end    /* r3 <- SRC &__rel_dyn_end */
  16. fixloop:
  17.     ldmia     {r0-r1}        /* (r0,r1) <- (SRC location,fixup) */
  18.     and    r1, r1, #0xff
  19.     cmp    r1, #23            /* relative fixup? */
  20.     bne    fixnext

  21.     /* relative fix: increase location by offset */
  22.     add    r0, r0, r9
  23.     ldr    r1, [r0]
  24.     add    r1, r1, r9
  25.     str    r1, [r0]
  26. fixnext:
  27.     cmp    r2, r3
  28.     blo    fixloop

  29. relocate_done:
  30.     /* ARMv4- don't know bx lr but the assembler fails to see that */
  31. #ifdef __ARM_ARCH_4__
  32.         mov pc, lr
  33. #else
  34.         bx lr
  35. #endif

  36. ENDPROC(relocate_code)


阅读(5043) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

沧海鳅鹏2013-11-11 14:36:49

非常感谢你的这篇文章,我这几天老正纳闷呢,怎么就跳到C函数的_main,然后就do_reset了呢,怎么什么都没做呢,谢谢你的文章帮我解答了这个问题