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)

uboot启动过程 3的更多相关文章

  1. U-Boot启动过程完全分析

    U-Boot启动过程完全分析 1.1       U-Boot工作过程 U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能 硬件设备初始化 加载U-Boot第二阶段 ...

  2. uboot启动过程理解

    对于2440而言,启动的方式不多.一般就是外界一个NAND FLASH ,2440内部有个NAND FLASH Controller,会自动把NAND FLASH的前4K拷贝到2440的片内SRAM. ...

  3. U-Boot启动过程完全分析<转>

    转载自:http://www.cnblogs.com/heaad/archive/2010/07/17/1779829.html 1.1       U-Boot工作过程 U-Boot启动内核的过程可 ...

  4. 【ARM-Linux开发】U-Boot启动过程--详细版的完全分析

    ---------------------------------------------------------------------------------------------------- ...

  5. U-Boot启动过程

    开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot启动函数.看一下board/smdk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序.第一个要链接的是c ...

  6. tiny4412学习之u-boot启动过程

    这个文档简要分析了tiny4412自带的u-boot的启动过程,这个u-boot启用了mmu,并且命令的接收和执行方式跟以前的不同. 文档下载地址: http://pan.baidu.com/s/1s ...

  7. U-Boot 启动过程和源码分析(第二阶段)-main_loop分析

    1> main_loop  common/main.c /******************************************************************** ...

  8. Am335x u-boot 启动过程中的系统频率配置

    Am335x的时钟结构分为:ADPLLS和ADPLLLJ 1.ADPLLS用来配置Core_CLK,Dispaly_clk,ARM系统CLK(mpu_clk),DDR PLLs_clk 2.ADPLL ...

  9. (一)U-Boot启动过程--详细版的完全分析

    博客地址:http://blog.csdn.net/hare_lee/article/details/6916325

  10. (转载)U-boot启动完全分析

    1.1 U-Boot工作过程 U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能 Ø 硬件设备初始化 Ø 加载U-Boot第二阶段代码到RAM空间 Ø 设置好栈 Ø ...

随机推荐

  1. salesforce零基础学习(一百二十一)Limitation篇之Heap Size Limitation

    本篇参考: https://help.salesforce.com/s/articleView?id=000384468&type=1 https://help.salesforce.com/ ...

  2. JDK源码分析实战系列-PriorityQueue

    完全二叉树 一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下.从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树 ...

  3. vue项目中,alert使用

    methods:{ sendData() { ··· // 中间省略的代码 alert(`发送成功,连接失败的号码有:${failList}`) // failList里存的是后台返回的数据 } }

  4. 【每日一题】【(双端)队列初始化&工具类&层次遍历】2022年1月29日-NC14 按之字形顺序打印二叉树

    描述给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 注意:树的初始化 public class TreeNode { int val = 0; Tree ...

  5. vue项目中配置scss

    之前创建 vue 项目的时候没有选择 scss 预编译,现在项目中要使用,不知道如何配置,网上搜了下全都是: npm  install sass-loader --save-devnpm instal ...

  6. Redis如何模糊匹配Key值

    Redis模糊匹配Key值 使用Redis的scan代替Keys指令: public Set<String> scan(String matchKey) { Set<String&g ...

  7. webpack :There are multiple modules with names that only differ in casing

    1, webpack版本3.6.0 2. 报warning文件为 node_modules 下面webpack 里的hot.js和dev-server.js 3. 没有出现模块名混用大小写 解决方法: ...

  8. python中的数学函数

  9. 聊聊CPU的发展历程之单核、多核、超线程

    作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试.职业成长相关资料等更多精彩文章在公众号「小牛呼噜噜」 大家好,我是呼噜噜,在计算机的早期,In ...

  10. 【FAQ】在华为鸿蒙车机上集成华为帐号的常见问题总结

    随着新一代信息技术与汽车产业的深度融合,智能网联汽车正逐渐成为汽车产业发展的战略制高点,无论是传统车企还是新势力都瞄准了"智能座舱"这种新一代人机交互方式.面对竞争如此激烈的车机市 ...