为什么要搬移代码?
如何搬移代码?
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. ABB安全区域(全局区域)的指令解析

    VAR wztemporary wzone;//VAR:变量 //wztemporary:全局区域数据类型(wztemporary临时全局区域数据.wzstationary固定式全局区域)wzone: ...

  2. ajax跳转到新的jsp页面

    ajax可以实现局部刷新页面,即在不刷新整个页面的情况下更新页面的局部信息. 项目中遇到一个问题:在用户列表也,当点击某个按钮时需要去查询用户的信息,查询成功跳转到用户详情界面:查询失败,则在原页面弹 ...

  3. WIN2016安装织梦没写入权限怎么办听语音

    配置好了WINSERVER2016环境,一切看起来都弄得差不多了,可是安装织梦的时候提示我没有写入权限,不能继续安装,于是我很郁闷,开始寻求解决办法. 工具/原料 WINSERVER2016 织梦5. ...

  4. Centos 6.9安装配置MongoDB

    注意:centos6上就不要装mongo3了,容易出错. 1. 下载 curl -O http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2 ...

  5. Codeforces 897D. Ithea Plays With Chtholly (交互)

    题目链接:D. Ithea Plays With Chtholly 题意: 给你n张纸,在纸上写字(在 1 - c之间)可以写m次数 (,).(主要是交互,让你判断) 题解: 首先,看到m>=n ...

  6. salesforce零基础学习(八十一)更改标准字段的label名称(Admin)

    我们在开发中往往需要考虑国际化功能,salesforce 提供了国际化功能,在search部分搜索translate,便可以找到translate部分,从而对需要的进行translate.比如pick ...

  7. WKWebView--JS调用OC的方法

    WKWebView---JS调用OC方法 一.使用的协议进行简单的介绍 1.在WKWebView中OC和JS交互也非常简单,WebKit的库中有个代理WKScriptMessageHandler就是专 ...

  8. python_16_序列化

    如何实现不同编程语言进行交互? json数据,相当于语言中间的沟通桥梁 什么是json数据? imoprt json json.dumps(内容)                    --把内容转换 ...

  9. 在CMainFrame里使用定时器是有讲究的

    设置定时器函数:SetTimer 单位毫秒 销毁定时器函数:KillTimer 消息:WM_TIMER 注意事项: (1)不要在构造函数里设置定时器. (2)不要在析构函数里销毁定时器. 原因:构造函 ...

  10. 多对多中间表详解 -- Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...