uboot启动过程1描述到

_start -> reset ->  save_boot_params -> save_boot_params_ret  

  ->  cpu_init_cp15: 配置cp15, 关闭MMU什么的

  ->  cpu_init_crit -> lowlevel_init -> s_init 
  -> _main
    -> board_init_f_alloc_reserve: 内存布局为gd_t: [0X0091FA00, 0X0091FB00-8)  alloc:[0X0091FB00, 0X0091FF00)
    -> board_init_f_init_reserve: gd->malloc_base=0X0091FB00
    -> board_init_f:  对gd进行了初步初始化,并分配了各个区块的内存空间
    -> relocate_code
    -> relocate_vectors
 
现在开始分析relocate_code
arch/arm/lib/relocate.S
 

ENTRY(relocate_code)

  // __image_copy_start等同_start, 也就是0x87800000
  ldr r1, =__image_copy_start /* r1 <- SRC &__image_copy_start */  

  // uboot启动过程2描述到reserve_uboot定位到了uboot的最终位置并赋值给gd->relocaddr

  // uboot启动过程1由 r0 = gd->relocaddr, 并调用relocate_code, 所以这里r4为两者offset
  subs r4, r0, r1 /* r4 <- relocation offset */  
  beq relocate_done /* skip relocation */  // 源和目标相同,不用复制
  // 通过uboot.lds可知, 其实bss部分没有被复制

  ldr r2, =__image_copy_end /* r2 <- SRC &__image_copy_end */

copy_loop:
  ldmia r1!, {r10-r11} /* copy from source address [r1] */
  stmia r0!, {r10-r11} /* copy to target address [r0] */
  cmp r1, r2 /* until source end address [r2] */
  blo copy_loop

  /*
  * fix .rel.dyn relocations
  */
  ldr r2, =__rel_dyn_start /* r2 <- SRC &__rel_dyn_start */
  ldr r3, =__rel_dyn_end /* r3 <- SRC &__rel_dyn_end */
fixloop:
  ldmia r2!, {r0-r1} /* (r0,r1) <- (SRC location,fixup) */
  and r1, r1, #0xff
  cmp r1, #23 /* relative fixup? */
  bne fixnext

  /* relative fix: increase location by offset */
  add r0, r0, r4
  ldr r1, [r0]
  add r1, r1, r4
  str r1, [r0]
fixnext:
  cmp r2, r3
  blo fixloop

relocate_done:

#ifdef __XSCALE__
  /*
  * On xscale, icache must be invalidated and write buffers drained,
  * even with cache disabled - 4.2.7 of xscale core developer's manual
  */
  mcr p15, 0, r0, c7, c7, 0 /* invalidate icache */
  mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */
#endif

/* ARMv4- don't know bx lr but the assembler fails to see that */

#ifdef __ARM_ARCH_4__
  mov pc, lr
#else
  bx lr
#endif

ENDPROC(relocate_code)

最新文章

  1. 【转】理解Java Integer的缓存策略
  2. 数据结构之图 Part2 - 3
  3. ionic:Build mobile apps faster with the web technologies you know and love
  4. redis ltrim命令
  5. CentOS 6下安装nodejs 0.9.0
  6. B题 - A+B for Input-Output Practice (I)
  7. Database name和SID
  8. 合理的keyword密度散布与黑帽SEO之躲藏文本
  9. 美版SOLOWHEEL与盗版SOLOWHEEL-IPS独轮车终极PK【图】_厂商资讯_太平洋电脑网
  10. spdlog源码阅读 (2): sinks的创建和使用
  11. 利用arpspoof和urlsnarf 进行ARP嗅探
  12. 关于APP在小米5s第一次安装启动后,点击home返回桌面,再次进入重进闪屏页问题
  13. 微信退款流程,以及在过程中遇见的错误和解决方式(php 语言)
  14. 【洛谷P1164 小A点菜】
  15. Ubuntu 16.04下安装zsh和oh-my-zsh
  16. jdk写webservice
  17. stm32复位引脚NRST
  18. 【AI科技大本营】
  19. SIGTERM等信号含义【转】
  20. kindeditor自定义插件插入视频代码

热门文章

  1. (GDB) GDB调试技巧,调试命令
  2. 一个宁静祥和没有bug的下午和SqlSession的故事
  3. 关于解决Failed on cp file to /system - Cross-device link 报错
  4. 如何理性看待国内大热的HuTool工具包
  5. python 之用户自定义函数
  6. JavaScript:控制跳转:break、continue与标签
  7. 6、发送验证码功能(Redis)
  8. vm虚拟机进入boot manager解决
  9. 微信小程序转发onShareAppMessage设置path参数后在onload获取不到值的原因和解决方法
  10. SPOJ GCDMAT - GCD OF MATRIX