SDRAM和重定位(四)---链接地址和运行地址

在了解重定位之前,必须先区分开链接地址和运行地址,位置有关代码和位置无关代码

=========================================================

链接地址和运行地址:

  • 链接地址:指在链接时指定的地址,是我们设想的将来程序要运行的地址。程序中所有标号的地址在链接后便确定了,不管程序在哪运行,都不会改变。使用arm-linux-objdump反汇编查看的就是链接地址。
  • 运行地址:指程序在板子中实际运行的地址

从上面的定义可以看出,链接地址和运行地址可以相同,也可以不同。

=========================================================

位置有关代码和位置无关代码:

  • 位置有关代码:从字面意思看就是该指令的执行是与内存地址有关的;如果运行地址和链接地址不相等,那么执行到此种指令的时候将会出现程序跑飞的情况。
  • 位置无关代码(PIC):从字面意思看就是该指令的执行是与内存地址无关的;无论运行地址和链接地址相等或者不相等,此种指令都能正常运行。

举几个例子:

  • b/bl label:属于位置无关代码,因为 b/bl 指令找到 label 的方法是根据当前 pc 的值结合偏移量来找到label
  • adr r0, label伪指令:属于位置无关代码,因为adr伪指令在汇编过程中会被替代成 add/sub pc, 偏移量的形式,可见也是基于当前pc和偏移量来找到 label
  • ldr r0,=label伪指令:属于位置有关代码,因为此伪指令将会被替代成 ldr r0, [pc, 偏移量]的形式,pc+偏移量中的内容将会是 label 的值,也就是链接时确定的地址。

=======================================================

重定位:

  重定位就是将代码搬移到链接地址处去运行的动作。

uboot之所以要进行代码重定位:

  是因为uboot的镜像太大了,不可能在iRAM中放得下,所以必须要放在 sdram 中运行,而BL1又必须在iRAM中运行,所以就需要进行代码重定位。

时间: 2024-12-15 06:56:16

SDRAM和重定位(四)---链接地址和运行地址的相关文章

重定位和链接脚本

大部分指令是"位置有关编码" 位置无关编码:汇编源文件编码成二进制可执行程序时,编码方式与位置无关. 在我们写程序时,必须给编译器链接器指定地址.将来的程序被执行时必须放在当时编译链接时给定的地址才能运行. 位置有关编码:汇编源码编码成二进制可执行程序后和内存地址是有关的. 但是也有一种特别的指令他可以跟指定的链接地址没有关系,这些代码不管放在哪里都可以正常运行. 分析: 之前的裸机程序中,makefile中用-Ttext 0x0来指定链接地址是0x0;这意味着我们认为将来这个程序会被

第二部分:S5PV210_重定位和链接脚本_2

重定位和链接脚本 (1)重定位:分为静态重定位和动态重定位 静态重定位:静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始位置,直接修改装配模块中的有关使用地址的指令 我们下面要分析就是静态重定位的情况. 动态重定位:动态重定位是指,不是在程序执行之前而是在程序执行过程中进行地址重定位.更确切地说,是在每次访问内存单元前才进行地址变换.动态重定位可使装配模块不加任何修改而装入内存,但是它需要硬件——定位寄存器的支持. 图片的参考来源:http://c.biancheng.ne

重定位与链接脚本

1.为什么需要重定位 位置无关编码(PIC,position independent code):汇编源文件被编码成二进制可执行程序时编码方式与位置(内存地址)无关. 位置有关编码:汇编源码编码成二进制可执行程序后和内存地址是有关的. 我们在设计一个程序时,会给这个程序指定一个运行地址(链接地址).就是说我们在编译程序时其实心里是知道我们程序将来被运行时的地址(运行地址)的,而且必须给编译器链接器指定这个地址(链接地址)才行.最后得到的二进制程序理论上是和你指定的运行地址有关的,将来这个程序被执

[CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口

1 平台 1.1 硬件 Table 1. 硬件(lscpu) Architecture: i686(Intel 80386) Byte Order: Little Endian 1.2 操作系统 Table 2. 操作系统类型 操作系统(cat /proc/version) 位数(uname -a) Linux version 3.2.0-4-686-pae i686(32bit) 1.3 编译器 Table 3. 编译器信息 编译器(gcc -v) gcc (Debian 4.7.2-5) 4

S5PV210裸机程序之重定位与链接脚本

s5pv210开发板要求代码在0xD0020010处开始执行(BL1),但是有时我们的程序需要重定位在另外一个地址执行(如uboot),这个时候需要我们在汇编代码处加入重定位操作的代码,使得程序能够长跳转到另外一个地址继续执行代码而不会因为执行了与地址有关编码而导致执行错误. 链接脚本如下: SECTIONS {     . = 0xD0024000;     .text : {         start.o         * (.text)         }     .data : {

SDRAM和重定位(二)---开始在汇编代码中调用 C 语言

前面的点亮led的代码由于比较简单,所以全部用汇编代码完成,但是随着代码越来越多,逻辑关系越来越复杂,想要完全用汇编代码来写程序不太现实,必须要借助 c 语言程序,那么就会有从汇编语言到 c 语言的一个过渡阶段. ======================================================= 如何在汇编语言中调用 c 语言? 在汇编中调用 c语言程序的方法很简单,只需利用汇编代码:bl xxx(函数名)即可,但是重点不是如何调用 c 程序,而是汇编代码要为运行 c

SDRAM和重定位(三)---icache的开启和关闭

这里只是简单的介绍下 icache,对于 icache和 dcache 以后有时间再去深入研究下.dcache 主要和虚拟内存管理(MMU)相关. 之所以会出现 cache,主要是为了解决 cpu 和 RAM之间的速度差异.通常来说 cpu 的主频很高速度非常快,但是内存ram的速度相对于cpu来说就慢了很多,这就导致系统整体的速度将会被拖慢. 为了解决这个问题,就在 cpu 和 ram 之间加入一层cache.cache的特点就是容量小,速度比ram快,价格高.这样先将 ram 中的内容放到

SDRAM和重定位(一)---看门狗详解

看门狗(watch dog timer),是s5pv210芯片内部的一种外设,其本质从名字也可以看出就是一种16位的定时器. 看门狗定时器(WDT)有两种用法: 在某些情况下,当出现了芯片中的程序跑飞了或者设备由于外界影响出现错误执行的情况时,我们希望设备能够自动进行复位操作(因为可能这种情况下,人为复位操作很难实现).看门狗就是这种设备,能够自动进行复位操作. 看门狗定时器也可以用作于普通的定时器中断. 看门狗(WDT)的工作原理: 当开启看门狗后,经过一段时间(看门狗就是定时器)后,看门狗就

嵌入式Linux裸机开发(四)——重定位relocate

嵌入式Linux裸机开发(四)--重定位relocate 一.位置有关编码 汇编源文件被编译成二进制可执行程序时编码方式可能与内存地址有关,也可能与内存地址无关.与内存地址有关的为位置有关编码,与内存地址无关的为位置无关编码. 程序在设计时需要规划一个程序运行时的地址(链接地址),编译连接器在链接时必须指定这个链接地址,得到的二进制程序的程序理论规划的运行时地址和编译连接器指定的链接地址才相同,程序才能正常运行.位置无关编码程序则无需设计程序时规划运行时地址,编译链接器链接时同样无需指定链接地址