历史上的今天
返回首页

历史上的今天

今天是:2024年12月16日(星期一)

正在发生

2021年12月16日 | Tiny4412裸机程序之代码重定位初体验

2021-12-16 来源: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文件中增加如下代码:



.text

.globl _start

_start:

 

/* 关闭看门狗 */

ldr r0, =0x10060000

mov r1, #0x0

str r1, [r0]

 

/* 启动Icache */

mrc p15, 0, r0, c1, c0, 0

orr r0, r0, #0x00001000 //打开ICache

//bic r0, r0, #0x00001000 //关闭ICache

mcr p15, 0, r0, c1, c0, 0

 

/* 重定位 - 将代码从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

 

ldr sp, =0x02060000 

 

/* 跳转 */

run_on_dram:

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


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


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


SECTIONS {

. = 0x0202A000;

.text : { 

*(.text) 

}

.rodata ALIGN(4) : {

*(.rodata*)

}

.data ALIGN(4) : { 

*(.data*) 

}

bss_start = . ;

.bss ALIGN(4) : { 

*(.bss) *(COMMON) 

}

bss_end = . ;

}


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


二、编译、烧写、运行

1.编译

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

2.烧写

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


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


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


三、反汇编文件分析

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

155713_4AHc_2888084.png?imageView2/2/w/550

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

160248_xR3t_2888084.png?imageView2/2/w/550

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


202a060: e59ff010 ldr pc, [pc, #16] ; 202a078

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


0x202a060 + 8 +16 = 0x0202a078

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


160549_gx0J_2888084.png?imageView2/2/w/550

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


我在自己的开发板上面试验成功。有兴趣的小伙伴可以自行试验。

推荐阅读

史海拾趣

Britool Expert公司的发展小趣事

撰写5个关于电子行业里Britool Expert公司发展起来的相关故事,每个故事字数至少500字,可能内容过多,我可以为您提供1个故事的示例,如果需要更多故事,您可以在之后输入继续。


Britool Expert公司的发展故事之一:技术创新的突破

在电子行业的激烈竞争中,Britool Expert公司以其独特的技术创新策略脱颖而出。公司创立之初,就明确了以技术研发为核心的发展道路。在一次关键的技术研讨会上,公司的研发团队提出了一个前所未有的想法——开发一种新型的高效能芯片。

这个想法在当时看来极具挑战性,但团队成员们凭借着对技术的热爱和对市场的敏锐洞察,决心将这个想法变为现实。经过数月的艰苦努力,团队终于攻克了技术难关,成功研发出了这款芯片。这款芯片不仅性能卓越,而且成本大大降低,迅速在市场上获得了广泛的认可。

这一技术创新的突破,为Britool Expert公司打开了新的发展空间。公司借此机会,不断扩大生产规模,优化产品结构,逐渐在电子行业中树立了良好的口碑。随着技术的不断进步和市场的不断扩大,Britool Expert公司逐渐成为了电子行业中的佼佼者。

这个故事只是Britool Expert公司发展历程中的一个缩影。在公司的成长过程中,还有许多类似的技术创新故事。正是这些故事,构成了Britool Expert公司不断发展壮大的坚实基石。


若您想要探索更多内容,随时可以继续输入。

欧密格光电(Amicc)公司的发展小趣事

由于电子行业内江苏欧密格光电科技股份有限公司(Amicc)的详细发展故事并不公开透明,并且会涉及到公司内部的具体运营和策略,因此我无法直接提供5个具体的发展故事。但我可以根据公开信息,概括性地描述欧密格光电在电子行业中的几个重要发展节点和事实。

  1. 创立与初期发展:江苏欧密格光电科技股份有限公司成立于2009年,由现任董事长兼总经理盛刚创立。盛刚在创办公司之前,拥有丰富的工学背景和外贸业务经验。这为公司早期的技术研发和市场拓展奠定了坚实的基础。在创立初期,欧密格光电就专注于半导体和光电元器件的生产加工,凭借过硬的技术和品质,逐渐在行业中崭露头角。

  2. 新三板挂牌上市:经过几年的稳健发展,欧密格光电于2015年成功在新三板挂牌上市。这一举措不仅为公司带来了更多的资金支持,也提升了公司的知名度和市场影响力。上市后,欧密格光电进一步加强了技术研发和市场拓展,逐步巩固了在行业中的地位。

  3. 质量管理体系建设:欧密格光电高度重视产品质量和企业管理。公司先后通过了ISO9001、ISO14001、ISO45001等多项国际质量管理体系认证,建立了严格的质量管理体系。同时,公司还建设了千级至万级净化车间,确保产品在生产过程中能够达到最高品质标准。这些举措不仅提升了公司的产品质量,也增强了客户对公司的信任。

  4. 产品多元化与市场拓展:随着技术的不断进步和市场需求的不断变化,欧密格光电的产品线也逐渐丰富起来。从最初的半导体和光电元器件,逐渐扩展到CHIP LED、PLCC LED、LAMP LED、红外发射管等多种产品。同时,公司还积极拓展市场,产品广泛应用于手机、安防、照明、汽车等多个领域,为众多知名企业提供产品服务。

  5. 持续创新与技术升级:在竞争激烈的电子行业中,欧密格光电始终保持对创新的追求。公司不断投入研发资金,引进先进技术和设备,提升产品的技术含量和附加值。同时,公司还积极与高校、科研机构等合作,开展产学研合作,推动技术创新和产业升级。

这些只是欧密格光电在电子行业中的部分发展事实,每个节点都体现了公司的战略眼光和执行力。当然,公司的发展过程中也面临过各种挑战和困难,但正是通过不断的努力和创新,欧密格光电才能在竞争激烈的市场中脱颖而出,成为行业内的佼佼者。

Advanced Power Solutions公司的发展小趣事

随着公司的发展,Advanced Power Solutions开始寻求与行业内其他企业的合作。通过与一家知名电子设备制造商建立战略合作关系,公司成功将其电源管理解决方案集成到对方的产品中。这一合作不仅扩大了公司的市场份额,也提高了公司的品牌知名度。此后,公司陆续与多家企业建立了合作关系,进一步巩固了其在行业内的地位。

DCCOM [ DC COMPONENTS ]公司的发展小趣事

随着公司规模的扩大和市场份额的提升,DCCOM开始注重品牌建设和市场推广。公司投入大量资金进行品牌宣传和市场推广,通过参加各种行业展会、举办技术研讨会等方式提高品牌知名度和影响力。这些举措使得DCCOM的品牌价值得到了显著提升。

Engineered Components Co公司的发展小趣事

Engineered Components Co(ECC)公司成立于XXXX年,由几位在电子制造领域有丰富经验的工程师共同创立。他们看到了电子行业中对于高质量、高精度电子元件的迫切需求,因此决定专注于此领域。ECC在创立初期就确立了以客户需求为导向,以技术创新为驱动的发展战略。他们通过自主研发,生产出了第一批高精度电子连接器,并在市场上获得了良好的反响。

Euvis Inc公司的发展小趣事

为了进一步提升竞争力,Euvis Inc公司积极开展跨界合作,与互联网、通信、汽车等领域的企业建立战略合作关系。通过资源整合和优势互补,公司实现了在多个领域的快速发展,进一步巩固了其在电子行业中的领先地位。

问答坊 | AI 解惑

请蓝眼狐大人!进来给检查一下!

电子锁画好了PCB图  但不知道是否可行  请蓝眼狐大人给看看  有问题我好立刻改 没问题我就制板了!!!谢谢!!…

查看全部问答>

硬件微分电路

实用微分电路对于高频信号检测比较敏感,特别适合于检测脉冲信号;但对于低频信号微分作用效果就不那么理想。我想请问诸位高手,如何精确的实现对低频信号的微分????(需要检测低频信号频率大概是50HZ。)…

查看全部问答>

读取8253计数器的问题?

我打算通过扩展定时器的方法测出多路PWM信号的占空比,利用GATE门控位,当GATE低电平的时候读取外部定时器8253计数器的值。可是我怎么也读不出来值,当我使RD位有效时,读的计数器的值也总是不变是个固定值,大家看看我的程序有什么问题??怎么改 ...…

查看全部问答>

通过PFILE_OBJECT的DeviceObject如何修改盘符??十万火急!

如题: UNICODE_STRING usDosName; PFILE_OBJECT pFileObject = IrpSp->fileObject; 使用RtlVolumeDeviceToDosName(pFileObject->DeviceObject,&usDosName) 可以得到usDosName的盘符,如C: 问题是如何修改C:为 J:,实现文件的跨盘存储 ...…

查看全部问答>

【MSP430共享】IAR+kegen++MSP430_V5.3

IAR+kegen++MSP430_V5.3,很常用的软件,也是430使用率很高的软件!!! [ 本帖最后由 鑫海宝贝 于 2011-10-12 09:37 编辑 ]…

查看全部问答>

uCOS-II移植到Cortex-M4问题

今天把uCOS-II移植到Cortex-M4上面,由于M4和M3内核相似,M3的程序直接拿到M4上面就可以用,我用的是KeilMDK V4.23,硬件是STM32的stm32f4discovery开发套件需要注意的只有一点,不要选择使用FPU,就没有问题了。虽然uCOS-II是不支持浮点运算的。但 ...…

查看全部问答>

g组 电阻桥测电流(简化版)

本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 电阻桥测电流(简化版)    …

查看全部问答>

用CubeSuite+下载程序下载不进去???

使用78K0R的78f1213_44脚  图如下…

查看全部问答>

X射线探测器A121

有人用过X射线探测器A121,急需帮助…

查看全部问答>