从前面一节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
从上图可以看出,程序的链接地址确实是我们在连接脚本里指定的0x0202a000
反汇编文件2
我们再来看看跳转的那条指令;
1 | 202a064: e59ff01c ldr pc, [pc, #28] ; 202a088 |
将当前PC的值加上28后的地址的内容赋给PC,即:
0x202a064 + 8 + 28 = 0x202a088
将0x202a088这个地址的值赋给PC
反汇编文件3
即PC指向0x0202a22c这个地址,我们继续往下看,发现:
反汇编文件4
0x0202a22c这个地址正是main函数的入口地址。
上一张运行的图片:
运行效果
上一篇:Exynos4412裸机SDRAM工作原理及时序分析
下一篇:Exynos4412裸机程序之操作ICache
推荐阅读
史海拾趣
随着技术的不断进步和市场需求的不断变化,CONEC始终坚持产品创新。1985年,D-SUB滤波连接器的推出,是公司技术实力和市场洞察力的体现。这一创新产品不仅满足了当时市场对高性能连接器的需求,也为公司在电子行业中树立了良好的口碑。此后,CONEC不断推出新产品,逐步扩大市场份额,成为全球电子行业的重要参与者。
在电子行业快速发展的今天,创新是企业持续发展的关键。CBI公司始终坚持创新驱动的发展战略,不断投入研发资源,推出具有创新性的电子产品。这些产品不仅满足了消费者的多样化需求,也为公司带来了丰厚的利润回报。同时,公司还注重知识产权保护,通过申请专利、商标等方式,保护自己的创新成果不受侵犯。
请注意,以上故事均为虚构,旨在为您提供一个关于电子行业里公司发展起来的故事框架。在实际情况中,不同公司的发展历程和故事可能会有所不同。
面对日益激烈的国际竞争,CBI公司积极实施全球化战略,通过海外投资、并购等方式,不断扩大市场份额。同时,公司还注重本土化运营,根据不同地区的市场需求和消费者习惯,提供定制化的产品和服务。这一策略使CBI在全球范围内建立了完善的销售网络和售后服务体系,进一步巩固了市场地位。
随着业务的不断增长,大毅科技意识到需要扩大生产规模以满足市场需求。于是,公司开始在大陆地区寻找合适的生产基地,最终在东莞、清溪、苏州等地设立了生产基地。这一举措不仅降低了生产成本,还提高了生产效率,使大毅科技能够更好地服务全球客户。同时,这也体现了大毅科技对全球市场的战略眼光和布局。
为了进一步提升产品质量和竞争力,大毅科技积极申请并获得了多项国际品质认证,如ISO9001、ISO14001、TS16949等。这些认证不仅证明了大毅科技在品质管理方面的卓越能力,还为公司打开了通往国际市场的大门。随着认证的不断增多,大毅科技的产品开始出口到全球各地,与索尼、雅马哈等知名企业建立了长期合作关系。
随着产品的热销,Empro Technology Corp开始积极寻求市场拓展和战略合作。公司与国际知名电子产品制造商建立了紧密的合作关系,共同研发新产品,共同开拓市场。同时,公司还通过参展国际电子展等方式,不断提升品牌知名度和影响力。
用“忽如一夜春风来,千树万树梨花开”来形容现在市场上的电源绝不为过。面对着这些百花齐放的电源我们该做出怎样的选择呢?还是借用我们中国一句俗语叫“是骡子是马拉出来遛遛”。 首先我们来看一下ATX电源在电脑中所起的作用。从表面或简单点来讲 ...… 查看全部问答∨ |
|
我之前开发了一款winCE5.0系统的PMP产品,我想在此基础上加入GBA游戏模拟器,然后通过TVout输出到电视机上,来玩一些GBA游戏,但不知怎样移植GBA模拟器到winCE5.0系统上,麻烦哪位高手提供一个思路或方法?谢谢 我目前的平台用的是ARM926双核的处理器,CP ...… 查看全部问答∨ |
|
请问wince6.0支持的.NET CF和SQL的版本是什么呢? 谢谢! 我最近一直被困在数据库开发这,老是出现can\'t find p/invoke dll:sqlceme30.dll 试过各种方法都不行,现在怀疑是不是wince6.0所支持的CF和SQL版本和我现在安的不一样才导致的错误。但没看到说wince6.0到底支持哪个版本的CF和SQL,倒是查 ...… 查看全部问答∨ |
|