如何用代码实现动态重定位?

如题所述

重定位过程和方法

3.1 nor flash启动-----只重定位 .data

为了实现修改,我们考虑将g_char保存在外部的sdram中,修改Makefile如下:

all:

arm-linux-gcc -c -o led.o led.c

arm-linux-gcc -c -o uart.o uart.c

arm-linux-gcc -c -o init.o init.c

arm-linux-gcc -c -o main.o main.c

arm-linux-gcc -c -o start.ostart.S

arm-linux-ld -Ttext 0 -Tdata 0x30000000 start.o led.ouart.o init.omain.o -o sdram.elf

arm-linux-objcopy -O binary -Ssdram.elf sdram.bin

arm-linux-objdump -D sdram.elf> sdram.dis

clean:

rm *.bin *.o *.elf *.dis

编译之后,发现bin文件为800多M,显然这是不合理的

BIN文件的数值为什么是805306369?我们发现805306369=0x30000001,的确,我们在Makefile中就是指明了全局变量保存在SDRAM中,所以BIN文件的保存地址是从0~0x30000000,其大小正好是0x30000001,因此,这个时候,我们的代码段和数据段的存储格式如下:(中间产生了巨大的空洞hole)

为了解决上面的方法,代码过大的问题,有两种方式来解决:

A. 将data段重定位到SDRAM中,text段仍在NOR Flash中

1. 仍然将全局变量数据段和代码段烧写到nor flash中

2. 在运行时,代码段代码要能实现将数据段拷贝(重定位)到SDRAM中;

3. 以后每次访问全局变量,都是去SDRAM中去访问,不去nor flash中访问
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-12-19
C#实现的话需要频繁的提交请求到服务器,再生成新页面重绘地图。建议用JavaScript(AJAX)在客户端动态绘制这条轨迹,CustomLayer就是用来做这个的。

如何用代码实现动态重定位?
1. 仍然将全局变量数据段和代码段烧写到nor flash中 2. 在运行时,代码段代码要能实现将数据段拷贝(重定位)到SDRAM中;3. 以后每次访问全局变量,都是去SDRAM中去访问,不去nor flash中访问

程序在运行中如何进行重定位?
1. 编译连接时的重定位 程序在编译过程中,链接器会处理程序中的符号和引用,将它们映射到物理地址。这一步骤是在程序从源代码转换成可执行文件时进行的,确保了程序中的地址引用是正确的。2. 装入内存时的重定位 当程序被装入内存时,操作系统负责将程序的逻辑地址空间映射到物理地址空间。这涉及到将...

为什么要引入动态重定位?如何实现?
程序在运行过程中经常要在内存中移动位置,为了保证这些被移动了的程序还能正常执行,必须对程序和数据的地址加以修改,即重定位。引入重定位的目的就是为了满足程序的这种需要。要在不影响指令执行速度的同时实现地址变换,必须有硬件地址变换机构的支持,即须在系统中增设一个重定位寄存器,用它来存放程序在...

程序在运行中如何进行重定位?
动态重定位:是在程序执行期间每次访问内存之前进行重定位。这种变换是靠硬件地址变换机构实现的。通常采用一个重定位寄存器,其中放有当前正在执行的程序在内存空间中的起始地址,而地址空间中的代码在装入过程中不发生变化。

鸿蒙内核源码分析(重定位篇) | 与国际接轨
在理解重定位类型时,我们通常会用到`objdump`命令。`objdump`命令是Linux环境下反汇编目标文件或可执行文件的强大工具,它以易读格式揭示二进制文件的详细信息,帮助我们深入了解静态重定位的实现和动态重定位的前置条件。通过执行`objdump -S .\/obj\/main.o`,我们可以看到`main.o`是可重定位文件,通过...

为什么要引入动态重定位?如何实现?
实现动态重定位需要硬件和软件的支持,硬件方面,需要支持地址转换和地址保护等功能;软件方面,需要编写动态重定位程序,该程序可以在程序运行时根据需要修改程序中的地址,并更新地址转换表等数据结构。在实现动态重定位时需要权衡性能和可移植性之间的关系,要采取一些措施来保证程序的正确性和稳定性。

动态重定位的实现方式有哪些?
重定位技术分为静态与动态两种方式。静态重定位中,操作系统调整进程内存地址以反映其起始位置。一旦分配,直到进程结束,操作系统不进行重定位。动态重定位则通过硬件将重定位寄存器(基值)与编译器生成的虚拟地址相加,生成物理内存地址。此地址与限制寄存器(分配部分的最大值)进行比较。若超出限制,则...

为什么要引入动态重定位如何实现
通过对程序和数据地址进行修改,确保被移动后的程序仍能正常执行。实现动态重定位的方法是系统中设置一个专门用于存放起始地址的寄存器,称为重定位寄存器。寄存器保存着当前正在执行的程序或数据在内存中的起始位置。进行地址变换时,在指令执行期间自动生成并应用新址,随着每条指令或访问数据而不断更新。

为什么要引入动态重定位?如何实现?
1、连续方式下的动态重定位:在连续分配方式中,操作系统会为每个作业(或进程)分配一个固定长度、不可移动的内存区域。此时设置一个特殊寄存器保存当前作业在内存中起始地址。2、离散分配方式下的动态重定位:离散分配主要包括页式管理和段式管理两种方法。使用页表、段表来记录每个页面段所对应到物理块...

动态重定位的实现方式有哪些?
动态重定位:灵活的旋律 相比之下,动态重定位则如交响乐团的指挥,随时调整音符的位置。硬件通过重定位寄存器(一个动态的地址基准)与编译后的虚拟地址相结合,如同指挥家挥动指挥棒,将虚拟地址转化为物理地址。这个过程通过硬件的快速运算,如简单的加法和比较,确保了进程能够根据内存需求在内存池中自由...

相似回答