S3c2440代码重定位详解5---代码重定位与位置无关码

发布者:星空行者最新更新时间:2021-10-20 来源: eefocus关键字:S3c2440  代码重定位  位置 手机看文章 扫描二维码
随时随地手机看文章

一个程序,由代码段、只读数据段、数据段、bss段等组成。


程序一开始可以烧在Nor Flash上面,运行时代码段仍可以在Nor Flash运行,但对于数据段,就必须把数据段移到SDRAM中,因为只要在SDRAM里面,数据段的变量才能被写操作,把程序从一个位置移动到另一个位置,把这个过程就称为重定位。


先梳理下把整个程序复制到SDRAM需要哪些技术细节:


把程序从Flash复制到运行地址,链接脚本中就要指定运行地址(Runtime addr)为SDRAM地址;

编译链接生成的bin文件,需要在SDRAM地址上运行,但上电后却必须先在0地址运行,这就要求重定位之前的代码与位置无关(是位置无关码写成);

参考Uboot修改链接脚本:

SECTIONS

{

    . = 0x30000000;


    . = ALIGN(4);

    .text      :

    {

      *(.text)

    }


    . = ALIGN(4);

    .rodata : { *(.rodata) }


    . = ALIGN(4);

    .data : { *(.data) }


    . = ALIGN(4);

    __bss_start = .;

    .bss : { *(.bss) *(.COMMON) }

    _end = .;

}


现在我们写的这个链接脚本,称为一体式链接脚本,对比前面的分体式链接脚本区别在于代码段和数据段的存放位置是否是分开的。


例如现在的一体式链接脚本的代码段后面依次就是只读数据段、数据段、bss段,都是连续在一起的。


分体式链接脚本则是代码段、只读数据段,中间相关很远之后才是数据段、bss段。

我们以后的代码更多的采用一体式链接脚本,原因如下:


分体式链接脚本适合单片机,单片机自带有flash,不需要再将代码复制到内存占用空间。而我们的嵌入式系统内存非常大,没必要节省这点空间,并且有些嵌入式系统没有Nor Flash等可以直接运行代码的Flash,就需要从Nand Flash或者SD卡复制整个代码到内存;

JTAG等调试器一般只支持一体式链接脚本;

修改start.S段


    /* 重定位text, rodata, data段整个程序 */

    mov r1, #0

    ldr r2, =_start         /* 第1条指令运行时的地址 */

    ldr r3, =__bss_start    /* bss段的起始地址 */


cpy:

    ldr r4, [r1]

    str r4, [r2]

    add r1, r1, #4

    add r2, r2, #4

    cmp r2, r3

    ble cpy



    /* 清除BSS段 */

    ldr r1, =__bss_start

    ldr r2, =_end

    mov r3, #0

clean:

    str r3, [r1]

    add r1, r1, #4

    cmp r1, r2

    ble clean


    bl main  


halt:

    b halt


将修改后的代码重新编译烧写在Nor Flash上,上电运行。

对本代码的启动情况进行分析:

在这里插入图片描述

在生成的bin文件里,代码保存的位置是0x30000000。随后烧写到NOR Flash的0地址,但代码的结构没有变化。之后再重定位到SDRAM


查看反汇编:


3000005c:   eb000106    bl  30000478  


30000060:   e3a01000    mov r1, #0  ; 0x0

30000064:   e59f204c    ldr r2, [pc, #76]   ; 300000b8 <.text+0xb8>

30000068:   e59f304c    ldr r3, [pc, #76]   ; 300000bc <.text+0xbc>


这里的bl 30000478不是跳转到30000478,这个时候sdram并未初始化;

为了验证,我们做另一个实验,修改连接脚本sdram.lds, 链接地址改为0x32000478,编译,查看反汇编:


3000005c:   eb000106    bl  30000478  


30000060:   e3a01000    mov r1, #0  ; 0x0

30000064:   e59f204c    ldr r2, [pc, #76]   ; 300000b8 <.text+0xb8>

30000068:   e59f304c    ldr r3, [pc, #76]   ; 300000bc <.text+0xbc>


可以看到现在变成了bl 30000478,但两个的机器码eb000106都是一样的,机器码一样,执行的内容肯定都是一样的。

因此这里并不是跳转到显示的地址,而是跳转到: pc + offset,这个由链接器决定。


假设程序从0x30000000执行,当前指令地址:0x3000005c ,那么就是跳到0x30000478;如果程序从0运行,当前指令地址:0x5c 调到:0x00000478


跳转到某个地址并不是由bl指令所决定,而是由当前pc值决定。反汇编显示这个值只是为了方便读代码。


重点:

反汇编文件里, B或BL 某个值,只是起到方便查看的作用,并不是真的跳转。


怎么写位置无关码?


1、使用相对跳转命令 b或bl;

2、重定位之前,不可使用绝对地址,不可访问全局变量/静态变量,也不可访问有初始值的数组(因为初始值放在rodata里,使用绝对地址来访问);

3、重定位之后,使用ldr pc = xxx,跳转到/runtime地址;


写位置无关码,其实就是不使用绝对地址,判断有没有使用绝对地址,除了前面的几个规则,最根本的办法看反汇编。


因此,前面的例子程序使用bl命令相对跳转,程序仍在NOR/sram执行,要想让main函数在SDRAM执行,需要修改代码


 //bl main  /*bl相对跳转,程序仍在NOR/sram执行*/

 ldr pc, =main/*绝对跳转,跳到SDRAM*/

关键字:S3c2440  代码重定位  位置 引用地址:S3c2440代码重定位详解5---代码重定位与位置无关码

上一篇:S3c2440代码重定位详解4---拷贝代码和链接脚本的改进
下一篇:S3c2440代码重定位详解6---重定位清除BSS段的C函数实现

推荐阅读最新更新时间:2024-11-16 19:52

I2S音频总线学习(三)S3C2440的I2S控制器
一、I2S控制器结构框图 S3C2440A的Inter-IC Sound (IIS)总线接口作为一个编解码接口连接外部8/16位立体声音频解码IC用于迷你碟机和可携式应用。IIS总线接口支持IIS总线数据格式和MSB-justified数据格式。该接口对FIFO的访问采用了DMA模式取代了中断。它可以在同一时间接收和发送数据。 图1 结构框图 总线接口,寄存器组和状态机(BRFC):总线接口逻辑和FIFO 访问由状态机控制。 5 位双预定标器(IPSR):一个预定标器用于IIS 总线接口的主时钟发生器,另外一个用作外部编解码时钟发生器。 64 位FIFO(TxFIFO 和RxFIFO):在发送数据传输时,数据写到T
[单片机]
电池供电电子产品中的位置编码
在所有的传感器技术领域中,超低功耗节能设计的趋势非常明显。带有无线网络和故障安全保护功能的便携式设备和传感器尤其需要对位置数据进行低功耗测量。此外,在很多应用中,即便外部电源不可用,也需要检测出位置变化。测量所需的能量可通过能量采集解决方案获得或由电池提供。使用霍尔传感器的磁性位置测量,可以集成到包含完整信号调理电路的单芯片编码器中。 集成式霍尔传感器可节省空间和节约成本,但工作期间所需的功率相对较高。这里的解决方法是让霍尔传感器短时启动。快速位置测量(像电机控制所需的位置测量)需要霍尔传感器快速评估和发送脉冲,而计量应用程序所需要的采样率较低。因此,节能工作需要采取特殊的解决方案。 如果实现微安? 霍尔传感器生成的信号电压
[电源管理]
电池供电电子产品中的<font color='red'>位置</font>编码
工程师笔记|如何开发与存储位置无关的 STM32 应用
1、前言 最近有客户询问,能否使用 STM32CubeIDE 在编译时通过设置某个编译选项,让STM32 应用与存储位置无关。这样的优势是能使同一个固件被烧在 STM32 Flash 里的不同位置, 而在系统 Bootloader 里只需要跳到相应的位置就可以正常执行固件代码。客户希望STM32 代码从 Flash 里执行,不复制到 RAM 里;客户希望是一个完整的映像,而不仅仅是其中某个函数做到了位置无关。 2、分析 在嵌入式场景下,不一定有操作系统。即使有操作系统,一般也是 RTOS。一般 RTOS没有一个通用的程序加载器。因此,存储位置无关的需求,在这时可以说无关紧要。但是,如果客户需要进行在线固件更新,例如 IoT 应用的
[单片机]
S3C2440时钟体系结构与编程
如果cpu是计算机的大脑,电流是计算机的血液,那么时钟则是计算机的心脏,时钟频率决定了处理器运算的快慢,它的每一次“跳动”都驱动着处理器不停的执行命令。不同的是,人的各个部位心率是一样的,但计算机却有多个频率,而且每个部位可能有不同的频率,比如“大脑”有一个频率,“手“有一个频率,“脚”使用的是另外一个频率,这样就产生了两个问题:怎么产生这些不同的频率?处理器怎么与自己不同频率的外设实现交互? 怎么产生这些不同的频率? 为了获取稳定的时钟,我们一般使用外部晶振来提供,晶振是由石英和震荡电路组成的,石英能够提供稳定的频率。一般一个计算机系统最少需要一个晶振,有些特殊的外设也会有自己特有的晶振,比如网卡,显卡等,但是对于大多数连接
[单片机]
<font color='red'>S3C2440</font>时钟体系结构与编程
疑苹果iPhone8CAD工厂图泄出 TouchID位置未知
【环球科技综合报道】据外媒5月10日报道,苹果iPhone 8的新渲染图在网上流出。这些渲染图据称来自一家制作三星Galaxy S8的工厂,而三星Galaxy S8一直备受瞩目。最新渲染图的流出似乎证实了此前有关下一代苹果手机的传言。 5月9日,iPhone 8的CAD设计图通过MySmartPrice(一家专注于技术故事的新闻网站)和著名的Twitter leaker @OnLeaks流出。后者在推文中称,他所分享的渲染图是基于工厂CAD设计图。而MySmartPrice称其在线发布的内容是下一部苹果手机的“精确渲染图”。该网站还表示,虽然渲染图展示了下一部苹果手机,但不确定此渲染图属于iPhone 8还是iPhone
[手机便携]
研究:声学传感器可准确定位城市环境中的枪手位置
在枪击过程中,会发生两个声音事件--枪口爆炸和超音速冲击波。声学传感器,如单个或数组麦克风,可以捕捉到这些声音,并利用它们来估计射手的位置。作为5月23日在丹佛市中心喜来登酒店举行的美国声学学会第182次会议的一部分,传感器数据和信息融合部的Luisa Still将讨论决定射手定位准确性的重要因素。她的演讲题目是 “城市环境中枪手定位精度的预测”。 在城市环境中,建筑物或其他障碍物可以反射、折射和吸收声波。这些影响的组合会严重影响射手定位的准确性。预先预测这一准确性对于城市环境中的任务规划至关重要,因为它可以告知必要的传感器数量及其要求和位置。 Still和她的团队利用几何因素对声学传感器测量进行建模。这种建模,结合传感
[物联网]
S3C2440裸机------LCD_LCD设置
1.lcd_4.3.c 首先我们根据芯片手册对LCD所需要的参数赋初值。 #define LCD_FB_BASE 0x33c00000 lcd_params lcd_4_3_params = { .name = lcd_4.3 .pins_polarity = { .de = NORMAL, /* normal: 高电平时可以传输数据 */ .pwren = NORMAL, /* normal: 高电平有效 */ .vclk = NORMAL, /* normal: 在下降沿获取数据 */ .rgb = NORMAL, /* normal: 高电平表示1 */ .hsync = INVERT, /*
[单片机]
<font color='red'>S3C2440</font>裸机------LCD_LCD设置
S3C2440的camera接口特性及WinCE 下的驱动
  S3C2440是应用十分广泛且适用于嵌入式系统的一款嵌入式处理器。winCE 5.0/6.O是微软公司开发的一款专用于嵌入式系统的实时操作系统。其模块化设计使开发人员可以根据需求定制设备。目前,国内大部分OEM商都提供了对S3C2440的camera接口在WinCE5.O/6.0下的驱动支持。遗憾的是,目前国内OEM商提供的驱动仅限于对几款微型摄像头(如ov9650等)的驱动支持。当用户采用CCD摄像头作为图像采集的前端设备时,原来的驱动已经不能使用了,而CCD摄像头因其优越的性能,在监控领域扮演着主力军角色。本文从分析S3C2440的camera接口特性出发,详细介绍当摄像设备为CCD摄像头时,在WinCE 5.O/6.0操
[嵌入式]

推荐帖子

PCB设计中遇到的一些问题整理
PCB设计中遇到的一些问题整理谢谢你的资料最近开始用PADS,谢谢LZ的资料谢谢你的无私贡献啦,学习啦回复楼主静若幽兰的帖子
静若幽兰 PCB设计
开关电源兴趣小组 第13次任务
  第12次思考题  本次活动要求阅读的《精通开关电源设计(第2版)》第3章3.2.5小节中给出的正激变换器变压器的设计例子中,变压器的损耗为3.131W,超出了原来2.26W的预计损耗,致使温升达到55℃,超过预定的40℃。该书也说:不可否认,仍有优化的余地。  如果要降低该变压器的损耗,你打算怎样修改设计?或者说打算怎样优化?    要降低变压器的损耗,无非是降低变压器的铁损或者变压器的铜损。  要降低变压器的铁损,就要降低铁芯中的磁通密度,或者降低工作频率。降低工作频率
maychang 开关电源学习小组
是德科技有奖直播:如何让你的Wi-Fi测试“兔”飞猛进?报名中
是德科技有奖直播:如何让你的Wi-Fi测试兔飞猛进?报名中点击报名直播直播时间:2023年03月01日(周三)下午14:00-15:30直播主题:如何让你的Wi-Fi测试兔飞猛进?直播简介:兔年归来,返工的攻城狮们看过来!虽然物联网设备提供了极大的便利,但要在狭小的空间内容纳大量设备,会导致设备设计、测试、性能和安全防护变得非常复杂。如何测试这些器件是设计工程师和器件制造商面临的一个最大挑战正因为射频环境非常拥挤,因此一定要进行合规性测试
EEWORLD社区 综合技术交流
单片机控制TC35i GSM 模块的问题
单片机控制TC35iGSM模块的问题单片机发给模块的每句AT指令结束的回车在c语言里面要怎么表示,\\r还是\\r\\n还是什么比如我是直接puts(AT\\r);的。然后单片机连接模块后发不了短信,求解释单片机控制TC35iGSM模块的问题如果你不确定是\\r还是\\n那么你都写上就可以然后单片机连接模块后发不了短信,求解释?你都用了哪些命令,回复的内容是什么,你说一下我就知道怎么回答你了二种方式发送短信:1:文本方式2:PDU编码方式 回复楼主chao
chaosyp 嵌入式系统
雨伞在高压线下放电,毛骨悚然
今天下大雨之后下班回家路上打着伞经过了一条高压线路的下方,突然听到一阵奇怪的滋滋声,有点像静电放电的声音,然后我抬头一看发现伞骨的位置真的有一个电火花在晃来晃去,还以为是雷电要来了,吓得我赶紧加快了脚步。然后想起来好像不是这么回事,其实每次下雨天打伞经过高压线都有类似的现象,网上看到有人说这个是因为下过雨空气湿度大,上面的高压线有很强的电场,空气变得有了一点导电性,伞骨尖端放电,电流流过空气就会看见电弧。然后还有人说,这样的现象虽然不是雷电引起的,但是被电离的空气会形成一条低阻抗的路径,更容易
Nubility 综合技术交流
【AT32A403A 车规MCU开发板】 SPI-DMA方式驱动LCD
测试SPI-DMA方式驱动LCD显示屏。一、硬件部分测试使用SPI1接口二、程序部分2.1、SPI初始化部分#include"main.h"uint16_t*lcd_data_buf;//LCD_RS--D7//LCD-RST--D6//LCD-CS--D10//LCD-BK--A3//TP-CS--D8//TP-INT--D9/***@briefinitializelcdspi1
TL-LED 汽车电子
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved