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. python面试题常用语句

    一.比较与交换1.比较并输出大的 print(a if a>b else b) 2.交换两个元素 a,b = b,alist1[i],list[j]=list1[j],list[i] 二.排序 ...

  2. UBOOT编译--- UBOOT顶层Makefile中目标_all和all的关系及背景(四)

    @ 目录 1. 前言 2. 概述 3. 老版本UBOOT(背景) 4. 新版本UBOOT 5. 参考 1. 前言 UBOOT版本:uboot2018.03,开发板myimx8mmek240. 2. 概 ...

  3. c++学习笔记(入门)

    1 struct和class的区别 struct成员变量(成员函数)的访问属性缺省的情况下默认为public. class成员变量(成员函数)的访问属性缺省的情况下默认为private. 2 初始化列 ...

  4. Pandas_1_预备知识

    Chapter1_Python基础 1.1 Python基础 推导式: 两个对象之间的映射关系,类似于实数之间关系变换的函数,只不过对象变成了矩阵. # Ex1-1 vacabulary = ['co ...

  5. C++编程笔记(多线程学习)

    目录 一.线程创建 二.线程的相关操作 2.1 join 2.2 detach 2.3 joinable 三.线程参数 3.1传参所引发的资源回收问题 3.2 将对象的成员函数作为入口函数 四.线程的 ...

  6. 【kafka】JDBC source&sink connect实现数据从Oracle实时同步插入更新到PostgreSQL(PG)

    〇.所需资料 1.JDBC connect的plugins下载地址(confluent) 一.Oracle建表 1.表规划 表名:Test_TimeFormat_Order.Test_Stress_O ...

  7. java中使用apache poi 读取 doc,docx,ppt,pptx,xls,xlsx,txt,csv格式的文件示例代码

    java使用apache poi 读取 doc,docx,ppt,pptx,xls,xlsx,txt,csv格式的文件示例代码 1.maven依赖添加 在 pom 文件中添加如下依赖 <depe ...

  8. Day37:正则表达式详解

    正则表达式 1.1 概述 正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性. 比如我们在网站上输入用户账号,要求我们输入的账号信息要符合账号的格式,而校验我们输入的账号格式是否正确 ...

  9. NGINX的配置和基本使用

    Linux NGINX NGINX:engine X ,2002年开发,分为社区版和商业版(nginx plus ) 社区版:分为主线版(开发版,奇数),稳定版(偶数) Nginx官网:http:// ...

  10. 《HTTP权威指南》– 2.HTTP报文与URL资源

    URL与资源: 大多数URL方案的URL语法都建立在这个由9部分构成的通用格式上. 方案: 访问服务器以获取资源要使用哪种协议 用户: 某些方案访问资源时需要的用户名 密码: 用户名后面可能包含的密码 ...