为什么要搬移代码?
如何搬移代码?
arm启动流程回顾:
2440:这里我们分析的是从nand flash 启动。2440的启动主要依赖于一个部件(SRAM),又名stepping stone.它的地址为0x0,nand flash是不能参与地址编址的,所以它是在内存以外的,当处理器上电以后,2440会自动地从nand flash 的最前端拷贝4k到stepping stone中。pc指针就会指向0x0这个地址。这里要特别注意4kb这个参数。比较大的u-boot,4k是完全不够的,所以我们把主要的硬件软件的初始化放在这4k中,剩余的则利用这4k的程序自动拷贝内存当中。这部分代码就会在内存中运行。
-----------------------------------------------------------
6410:上电之后,6410会去运行bootloader0(SROM),bootloader0会从nand flash 中拷贝8k到SRAM(stepping stone)中。这8k同样满足不了。我们需将剩下的bootloader拷贝到内存中运行。代码的拷贝工作同样需要在前8k中的代码来完成。
----------------------------------------------------
210:类似于6410
----------------------------------------------------
代码搬移主要三个地方:起点,终点,搬移方式。
我们这里的启点事stepping stone(SRAM)
2440的SRAM起始地址为0x0
6410的SRAM起始地址为S3C6410手册p116页stepping stone:0x0c000000
210:0xd0020000
讲终点之前我们需要理解什么是链接地址(如链接脚本里面的链接起始地址):arm-linux-objdump -D -s gboot.elf > dump
vim dump
reset 前面的地址就是链接地址。pc<=0x30008058
还有一个就是我们可以在汇编代码中直接修改ldr pc,=reset.(这是一个内存地址,而不是SRAM地址,那是不是意味着开发板一上电就跳转到内存中了。为解释这个问题,我们引入了相对跳转和绝对跳转。)
-------------------------------------------------
相对跳转:如b指令,相对跳转不是把连接地址直接赋值给pc,而是
跳转之前的地址+跳转之后地址的差值。
如start的地址是0x30000000,reset的地址为0x30000058,stepping stone的地址为0x0,所以跳转之后的真实地址为0x00000058(pc).
绝对跳转:例如函数调用,直接修改pc指针.
--------------------------------------------------
然后将连接的起始地址作为终点:0x50008000
---------------------------------------------------
搬移:
vi start.S
bl copy_to_ram
bl light_led
copy_to_ram:
ldr r0,=0x0c000000
ldr r1,=0x50008000
add r3,r0,#1024*4 //r0复制4k到r3

copy_loop:
ldr r2,[r0],#4 //读取四字节数据到r2
str r2,[r1],#4 //写入4字节数据到r1
cmp r0,r3 //判断r0的位置是否=r3,如果不等说明没有拷贝完。
bne copy_loop
mov pc,lr

代码从stepping stone搬移到内存的更多相关文章

  1. 重构改善既有代码设计--重构手法11:Move Field (搬移字段)

    你的程序中,某个字段被其所驻类之外的另一个类更多的用到.在目标类建立一个新字段,修改源字段的所有用户,令它们改用新字段.        动机:在类之间移动状态和行为,是重构过程中必不可少的措施.随着系 ...

  2. 重构改善既有代码设计--重构手法10:Move Method (搬移函数)

    你的程序中,有个函数与其所驻类之外的另一个类进行更多的交流:调用后者,或被后者调用.在该函数最常用引用的类中建立一个有着类似行为的新函数.将旧函数编程一个单纯的委托函数,或是将旧函数完全移除. 动机: ...

  3. uboot搬移部分和重定位部分的代码分析

    来看一下搬移部分和重定位部分的代码: relocate: /* 把U-BOOT重新定位到RAM*/          //r0=0; adr r0, _start /* r0是代码的当前位置*/ ld ...

  4. svn搬移到gitlab及使用

    svn是一款非常简便,易用的源代码管理工具,用了这么多年,对它情有独钟.都说习惯最难改,那为何要搬移到gitlab上呢? 喜欢尝试新东西,前提还是git比较强大,svn有的它都有,svn没有的它也有. ...

  5. 重构第2天:方法搬移(Move Method)

    现在就重构来说是非常普通的,虽然我们经常会漏掉或忽略一些需要重构的地方.方法搬移,正如所定义的那样,把方法搬移到更适合他的位置.让我们看看下面这一段重构前的代码: 理解:方法搬移,正如所定义的那样,把 ...

  6. poj3580 伸展树(区间翻转 区间搬移 删除结点 加入结点 成段更新)

    好题.我做了很久,学了大牛们的区间搬移.主要的代码都有注释. #include<cstdio> #include<cstring> #include<iostream&g ...

  7. 【Java重构系列】重构31式之搬移方法

    重构第二式:搬移方法 (Refactoring 2: Move Method) 毋容置疑,搬移方法(Move Method)应该是最常用的重构手段之一,正因为太常用而且较为简单,以至于很多人并不认为它 ...

  8. Part9---代码搬移不可少

    1.回顾ARM启动流程就可知道需要执行代码搬移 2.代码搬移 1)起点:NAND FLASH,今天的起点是SRAM垫脚石.为什么?因为我们要从nandflash取搬移数据需要先对其进行初始化,二而我们 ...

  9. 嵌入式开发之8127---DM8127如何利用EDMA搬移数据

    --------------qq:1327706646 ---------------------author:midu -------------------------------datetime ...

随机推荐

  1. java序列化反序列化深入探究

    When---什么时候需要序列化和反序列化: 简单的写一个hello world程序,用不到序列化和反序列化.写一个排序算法也用不到序列化和反序列化.但是当你想要将一个对象进行持久化写入文件,或者你想 ...

  2. Bootstrap中data-src无法显示图片,但是src可以

    在学习bootstrap时,书中的源码是用的data-src来定义图像位置,但是我在使用的时候无法显示图片:data-src可以在img标签中使用来显示图片吗?我使用src可以,而是用data-src ...

  3. PHP move_uploaded_file() 函数

    PHP Filesystem 函数 定义和用法 move_uploaded_file() 函数将上传的文件移动到新位置. 若成功,则返回 true,否则返回 false. 语法 move_upload ...

  4. 关于userInteractionEnabled的属性的理解

    userInteractionEnabled A Boolean value that determines whether user events are ignored and removed f ...

  5. mybatis_SQL映射(4)鉴别器

    摘录自:http://blog.csdn.net/y172158950/article/details/17505739 鉴别器:有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的 ...

  6. spring 事务隔离级别配置

    声明式的事务处理中,要配置一个切面,即一组方法,如 其中就用到了propagation,表示打算对这些方法怎么使用事务,是用还是不用,其中propagation有七种配置,REQUIRED.SUPPO ...

  7. Jmeter下载时Binaries和Source两类包的区别

    在下载Jmeter时,存在两种类型的下载包,分别为Binaries和Source: 一般开放原代码软件都会有两个版本发布: Source Distribution 和 Binary Distribut ...

  8. 小程序选项卡小Demo,可滑动控制

    思绪1.选项卡使用scroll-view,实现可以滑动控制效果:2.使用current控制选项卡标题和内容的统一,实现同步操作:3.winHeight 这个是我最常用的var calc = clien ...

  9. Redis持久化磁盘IO方式及其带来的问题   有Redis线上运维经验的人会发现Redis在物理内存使用比较多,但还没有超过实际物理内存总容量时就会发生不稳定甚至崩溃的问题,有人认为是基于快照方式持

    转自:http://blog.csdn.net/kaosini/article/details/9176961 一.对Redis持久化的探讨与理解    redis是一个支持持久化的内存数据库,也就是 ...

  10. arduino笔记

    接下来,初来博客,准备自己也写一系列的arduino的学习经验. http://zhongbest.com/2017/05/23/arduino%e4%b8%ad%e7%9a%84%e4%b8%ad% ...