历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2018年10月14日 | Exynos4412裸机程序之代码重定位初体验

2018-10-14 来源:eefocus

从前面一节Exynos 4412的启动过程分析 ,我们知道:一上电,exynos4412首先执行固化在IROM中的代码,iROM首先设置程序运行环境 (比如关看门狗、关中断、关MMU 、设置栈 、设置栈 、启动PLL等 ),然后根据OM引脚确定启动设备 (NAND Flash/SD 卡/其他 ),把 BL1从里面读出存入iRAM的0x02021400地址处,最后启动 BL1; BL1从SD卡适当的位置读入14K 字节的数据,存在iRAM地址0x02023400处,所以BL2不能大于(14K – 4) 字节,这里引出了为什么写这一节的原因:如果我们的程序很大,大于14K怎么办????

下面我们先来介绍两个概念:

一是程序当前所处的地址,即程序在运行时,所处的当前地址;二是程序的链接地址,即程序运行时应该位于的运行地址。编译程序时,可以指定程序的链接地址。

什么是重定位

对于Tiny4412而言,前面我们已经说过:启动时BL1只会从sd等启动设备中拷贝14K的代码到IRAM中,那么当我们的程序超过14K怎么办?那就需要我们在前14K的代码中将整个程序完完整整地拷贝到DRAM等其他更大存储空间,然后再跳转到DRAM中继续运行我们的代码,这个拷贝然后跳转的过程就叫重定位。

本章中我们主要学习如何重定位,但是并不会涉如何使用到DRAM,而是简单地将代码从IRAM的0x02023400处拷贝到IRAM的0x0202a000处,然后跳转到0x0202a000处继续运行我们的代码。

 

一、程序说明

基于上一个实验的代码进行修改,修改了start,S文件以及链接脚本文件:

在start.S文件中增加如下代码:

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

//重定位 - 将代码从0x02023400处拷贝到链接地址0x0202a000处(在链接脚本里指定的),并跳转到这个地址去执行

adr r0, _start        //adr指令用于读取_start在当前的运行的物理地址,即0x02023400

ldr r1, =_start      //读取_start的链接地址,即0x0202a000

ldr r2, =bss_start // 读取bss段的起始地址,用于计算需要拷贝的字节多少

cmp r0, r1

beq clean_bss    //如果r0=r1,则跳转到clean_bss,说明此时已经在链接地址处了

 

//如果r0!=r1,则进行如下的拷贝

copy_loop:

ldr r3, [r0], #4    // 源

str r3, [r1], #4    // 目的

cmp r1, r2         // 判断是否已经拷贝完

bne copy_loop // 如果没有拷贝完就继续拷贝

 

// 清bss段

clean_bss:

ldr r0, =bss_start //r0保存bss段的起始地址

ldr r1, =bss_end //r1保存bss段的起始地址

cmp r0, r1

beq run_on_dram //如果r0=r1,则跳转到run_on_dram,说明bss段里边没有变量

mov r2, #0

clear_loop:

str r2, [r0], #4

cmp r0, r1

bne clear_loop

 

// 跳转

run_on_dram:

ldr pc, =main //执行完这句话之后,PC就指向了main的链接地址

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

这段代码主要实现了代码重定位、清除BSS段、以及跳转到链接地址继续运行,注释说的已经很明白了,有什么的不熟悉的,大家可以留言共同探讨。

链接脚本reload.lds修改为如下:

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

SECTIONS {

    . = 0x0202a000;

    .text : {

        start.o

        * (.text)

    }

    .data : {

        * (.data)

    }

    

    bss_start = .;

    .bss : {

        * (.bss)

    }

    bss_end = .;

}

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

主要增加了bss段的起始bss_start及结束bss_end 的定义,这两个标号在start.S中被用到。

二、编译、烧写、运行

1.编译

通过FTP或者其他工具将文件上传到服务器上去,输入make命令进行编译将得到reload.bin文件。

2.烧写

将SD卡插入电脑,并让VmWare里的Ubuntu识别出来,然后执行如下命令:

1

sudo ./sd_fusing.sh /dev/sdb ../8_reload/reload.bin

将SD卡插入Tiny4412开发板,上电,你会看到和上一节的运行效果一样(因为我们没有修改LED的显示效果,只是修改了程序的运行地址,这个对外是看不出区别的)。

三、反汇编文件分析

将反汇编文件reload.dis,从服务器上下载下来,我们进行简单分析一下:

反汇编文件1

反汇编文件1

从上图可以看出,程序的链接地址确实是我们在连接脚本里指定的0x0202a000

反汇编文件2

反汇编文件2

我们再来看看跳转的那条指令;

1

202a064: e59ff01c ldr pc, [pc, #28] ; 202a088

将当前PC的值加上28后的地址的内容赋给PC,即:

0x202a064 + 8 + 28 = 0x202a088

将0x202a088这个地址的值赋给PC

反汇编文件3

反汇编文件3

即PC指向0x0202a22c这个地址,我们继续往下看,发现:

反汇编文件4

反汇编文件4

0x0202a22c这个地址正是main函数的入口地址。

 

上一张运行的图片:

运行效果

运行效果


推荐阅读

史海拾趣

Atlantic Microwave Ltd公司的发展小趣事

Atlantic Microwave Ltd公司成立于电子科技蓬勃发展的年代,初期只有几名志同道合的工程师,他们怀揣着对微波技术的热情,在狭小的办公室中开始了他们的创业之旅。资金短缺、技术难题、市场认可度低等问题接踵而至。然而,团队凭借着对技术的执着追求和对市场的敏锐洞察,不断攻克技术难关,优化产品设计,逐渐在市场上站稳了脚跟。

BILIN公司的发展小趣事

在追求经济效益的同时,Atlantic Microwave Ltd公司始终不忘履行社会责任。公司积极参与公益事业,捐赠资金和技术支持给需要帮助的地区和行业。同时,公司还注重环保和可持续发展,采用环保材料和节能技术,降低生产过程中的能耗和排放,为社会的可持续发展做出了积极贡献。

以上五个故事仅是对Atlantic Microwave Ltd公司可能经历的发展阶段的虚构描述,实际情况可能因各种因素而有所不同。这些故事旨在展示一个电子企业在发展过程中可能面临的挑战和机遇,以及如何通过不断努力和创新实现持续发展。

中微股份(Cmsemicon)公司的发展小趣事

在刻蚀设备领域取得成功后,中微并没有满足于现状,而是积极拓展多领域,实现业务多元化。2012年,公司完成了首台MOCVD设备的研制,成功进入薄膜沉积领域。2016年,公司又完成了首台ICP刻蚀设备的研制,进一步巩固了在刻蚀设备领域的领先地位。此外,公司还在环保领域有所布局,成功研制出首台VOC设备。这些举措不仅丰富了公司的产品线,也为公司带来了更多的市场机遇。

EPIC公司的发展小趣事

近年来,随着元宇宙概念的兴起,Epic Games也开始在这一领域进行布局。公司首席执行官Tim Sweeney对元宇宙的发展潜力持乐观态度,并认为这将是未来游戏和社交领域的重要发展方向。为了实现这一愿景,Epic Games不仅在技术上进行了大量投入和研发,还与多个合作伙伴共同推动元宇宙生态的建设和发展。这些举措使得Epic Games在元宇宙领域取得了显著的进展,并有望在未来成为该领域的领军企业之一。

Avel Lindberg公司的发展小趣事

近年来,随着元宇宙概念的兴起,Epic Games也开始在这一领域进行布局。公司首席执行官Tim Sweeney对元宇宙的发展潜力持乐观态度,并认为这将是未来游戏和社交领域的重要发展方向。为了实现这一愿景,Epic Games不仅在技术上进行了大量投入和研发,还与多个合作伙伴共同推动元宇宙生态的建设和发展。这些举措使得Epic Games在元宇宙领域取得了显著的进展,并有望在未来成为该领域的领军企业之一。

EMC Technology RF Labs公司的发展小趣事

RF Labs非常重视产品质量和品质保证。他们建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,RF Labs还引进了先进的生产设备和技术,确保产品的质量和性能达到国际先进水平。这些举措使得RF Labs的产品在市场上享有很高的声誉和口碑。

问答坊 | AI 解惑

PCI驱动问怪异题请教

我们开发了一块pci9052芯片的PCI接口板,出现怪异问题,请帮忙分析下! 基于PDC1000开发的接口板(使用PCI9052)。 数据采集有两部分,第一部分较少数据读写;第二部分大量数据频繁读写(80ms定时器,每80ms有2048次*3*12位/次,时钟由2M晶振产 ...…

查看全部问答>

Oops SIGSEGV错误,请教一下如何分析定位

Oops SIGSEGV: 0000 [#1] Modules linked in: embxmailbox(P) stgfb_core(P) led st7105_ks nandbm embxloopback(P) embxshell(P) mme_host(P) embxshm(P) stapi_ioctl(P) stapi_core(P) Pid : 5705, Comm:        &nbs ...…

查看全部问答>

为什么我的CEdit不显示啊~????

这几天刚刚装好EVC,连接板子上搞了半天,现在终于可以在板子上运行调试了,可是马上又有问题来了,我新开了个对话框,里面放了几个STATIC和几个Edit,刚刚开始的时候用中文的,Static里面的字是乱的,Edit不显示,改成英文的,Static那几个也可显示一个了``` ...…

查看全部问答>

时钟问题,讨论,请教!

用到了5个时钟,19.2k、40k、80k、480k、960k、dc综合之后(用的umc库)做了一下后仿40k跟80k时钟总是没有,一直保持为0;我单独把40k和80k拿出来后仿时钟都能出来,可一到总模块就不行了,这是为什么啊??我试着用smic库做了以下综合和后仿没有任 ...…

查看全部问答>

硬件测试技术:没有规矩不成方圆

硬件测试概述    1、硬件测试的概念    2、硬件测试的目的    3、硬件测试的目标——产品的零缺陷    4、硬件测试的意义    5、目前业界硬 ...…

查看全部问答>

lm3s811小问题

谁知道 那个白色的 长条的 是什么?是液晶吗 ,为什么是粘上去了 ,今天被同学拿下来了,有知道 的告诉我一声,谢谢了 …

查看全部问答>

在单位遇到一个2B

刚才在写项目文档,居然我对面的一个2B突然站起来对我说让我敲键盘的声音小一点,说影响到他睡觉了,公司有规定12点到13点之间可以休息,但是都13.20了它还在睡觉,这个先不说,凭什么就让我打字的声音小点呀,我在工作,我做的是正当事情,难道正 ...…

查看全部问答>

方波放大电路有过冲,不知如何解决

想把一个输入Vpp=500mV,频率等于200K的方波放大9倍,两级放大,但是出现了过冲(应该算是振铃吧),不知道该如何解决,求大神们讲解下过冲的由来及解决方案,不胜感激…

查看全部问答>

CC2530的输出阻抗是多少

CC2530的输出阻抗是多少…

查看全部问答>