一:为什么需要进行重定位

我们在设计一个程序时,会给这个程序指定一个运行地址(链接地址)。就是说我们在编译程序时其实心里是知道我们程序将来被运行时的地址(运行地址)的,而且必须给编译器链接器指定这个地址(链接地址)才行。最后得到的二进制程序理论上是和你指定的运行地址有关的,将来这个程序被执行时必须放在当时编译链接时给定的那个地址(链接地址)下才行,否则不能运行(就叫位置有关代码)。但是有个别特别的指令他可以跟指定的地址(链接地址)没有关系,也就是说这些代码实际运行时不管放在哪里都能正常运行。

二:重定位的过程

重定位就是通过一段位置无关码将我们的当前运行地址处的代码复制一份到我们的链接地址处,并且在我们重定位代码的最后通过长跳转指令跳转到链接地址的那一份代码中去执行。比如我们设置的链接地址是0xd0024000,但是我们下载时是下载到0xd0021000这个地址里面的,所以我们就需要重定位将我们的代码复制一份到我们的0xd0024000这个地址,并跳转到这里去执行。

三:重定位实现代码

adr r0 _start  //adr指令用于加载_start当前的运行地址
ldr r1, =_strat //ldr指令用于加载_start的链接地址:0xd0024000
//bss段的起始地址,链接是的顺序为 代码段  数据段  bss段
ldr r2,=bss_start  //重定位只需要重定位代码段和数据段即可。
cmp r0, r1
beq clean_bsscopy_loop:ldr r3, [r0], #4  //r0地址中的内容存入r3中同时,r0=r0+4str r3, [r1], #4  //r3的内容写到r1所指的地址中,同时r1=r1+4cmp r1, r2bne copy_loop
//copy_loop就完成了代码的拷贝clean_bss:ldr r0, =bss_startldr r1, =bss_endcmp r0, r1beq run_on_drammov r2, #0cleatr_loop:str r2, [r0], #4cmp r0, r1bne clear_looprun_on_dramldr pc,=led_blink

转载于:https://blog.51cto.com/11674570/1827364

S5pv210裸机实验——SDRAM重定位相关推荐

  1. S5PV210裸机之SDRAM

    1:SDRAM基础: 通过s3c2440的内存原理以及时序来理解s5pv210 SDRAM原理.时序. 首先看一下核心板内存如何连接的 可以看一下两个内存芯片接的地址总线均为Xm1_ADDR[13:0 ...

  2. 韦东山第一期学习笔记——重定位

    重定位 说明 必须知道的几个概念 什么是代码重定位? 什么是位置无关码 什么是运行地址 为什么要代码重定位? nand flash启动的情况 nor flash启动的情况 两种方式的重定位 代码重定位 ...

  3. S5PV210体系结构与接口04:代码重定位 SDRAM初始化

    目录 1. C语言环境初始化 1.1 C语言运行所需环境 1.2 初始化栈 1.2.1 栈的概念 1.2.2 栈的作用 1.2.3 如何初始化 1.3 初始化bss段 1.3.1 bss段的作用 1. ...

  4. 嵌入式学习(二)——刷机和led实验(看门狗、c语言、icache、重定位、SDRAM)

    目录 一.刷机和裸机实验 1.1 刷机步骤 1.2 交叉编译链 1.2.1 环境变量配置 二.led实验 2.1 实验准备 2.2 实验开始 2.2.1 Makefile 2.2.2 mkv210_i ...

  5. tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37407423 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一.实验原 ...

  6. tiny4412 裸机程序 八、重定位到DRAM及LCD实验

    一.实验原理 上一章已经解释的很清楚了,如何将所要运行的user_bin程序定位到DRAM中,这一章要进行重定位到DRAM后运行LCD程序,实际上一章中BL2中程序可以不用改动,直接重写我们的USER ...

  7. 嵌入式linux-----ARM裸机(5)-----SDRAM和重定位relocate

    1.看门狗watch dog timer 现实中因为一些外部因素,电子设备经常会跑飞或者死机(譬如极端炎热.极端寒冷.工业复杂场合).在这种情况下我们希望设备自动复位而不需要人工干预(无人值守).看门 ...

  8. S5PV210裸机之重定位

    1.重定位相关概念 位置无关码(PIC,position independent code):汇编源文件被编译成二进制可执行文件时编码方式与位置(内存地址)无关.  位置有关码:汇编源文件被编译成二进 ...

  9. 《5.SDRAM和重定位relocate》

    转自 https://edu.csdn.net/lecturer/505 朱老师物联网大讲堂 <5.SDRAM和重定位relocate> 第一部分.章节目录 1.5.1.汇编写启动代码之关 ...

最新文章

  1. 采购部管理--餐饮原料的验收管理
  2. 633. Sum of Square Numbers
  3. C# 导出EXCEL文件
  4. jsoup获得css,Jsoup代码解读之五-实现一个CSS Selector
  5. 利用python去除红章
  6. 网页简单上传图片 imgareaselect插件
  7. 六本JAVA架构书,构建科学得架构知识体系
  8. 解决神经网络过拟合问题—Dropout方法、python实现
  9. 如何从OnDocumentComplete事件中获得当前frame的html代码
  10. sparksql与hql语法差异
  11. canvas 文字颜色_一篇图文学会HTML5的canvas标签,直线曲线文字渐变,统统可以有...
  12. Python+Selenium练习篇之4-利用link text定位元素
  13. 权力的游戏登录显示服务器上限,权力与纷争登录不上怎么办 登录不上解决方案...
  14. linux内存回收500M,回收和交换Linux的内存回收和交换
  15. 安川焊接机器人做圆弧运动编程_安川MOTOMAN工业机器人编程与操作(3)
  16. 【Pygame实战】超有趣的泡泡游戏来袭——愿你童心不泯,永远快乐简单哦~
  17. 酷睿i3 10105f参数 i310105f属于什么水平 i3 10105f性能怎么样
  18. 网络安全攻击与防护--HTML学习
  19. pywebview:使用python构建桌面客户端应用
  20. atoi和itoa(头文件stdilb.h)的C实现

热门文章

  1. Windows 增加 Open command window here 选项
  2. 20190822:(leetcode习题)字符串转换整数 (atoi)
  3. php百度地图地址解析失败,javascript - vue中使用百度地图 提示无法解析
  4. 密文恢复出明文的过程称为_整流二极管的反向恢复过程图解
  5. k8s创建pod加入容器_K8S容器编排之POD健康检测(2)
  6. VB控件注册 - 利用资源文件将dll、ocx打包进exe文件
  7. shell 中的参数替换
  8. 国内学者新研究:中医AI登场,自动开出药方
  9. Java基础13:反射与注解详解
  10. C++算法之数据查找的代码