Tiny4412裸机程序之代码重定位初体验_第1页
Tiny4412裸机程序之代码重定位初体验_第2页
Tiny4412裸机程序之代码重定位初体验_第3页
Tiny4412裸机程序之代码重定位初体验_第4页
Tiny4412裸机程序之代码重定位初体验_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页Tiny4412裸机程序之代码重定位初体验从前面一节Exynos4412的启动过程分析,我们知道:一上电,exynos4412首先执行固化在IROM中的代码,iROM首先设置程序运行环境(比如关看门狗、关中断、关MMU、设置栈、设置栈、启动PLL等),然后根据OM引脚确定启动设备(NANDFlash/SD卡/其他),把BL1从里面读出存入iRAM的0x02023400地址处,最后启动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:/*关闭看门狗*/ldrr0,=0x10060000movr1,#0x0strr1,[r0]/*启动Icache*/mrcp15,0,r0,c1,c0,0orrr0,r0,#0x00001000//打开ICache//bicr0,r0,#0x00001000//关闭ICachemcrp15,0,r0,c1,c0,0/*重定位-将代码从0x02023400处拷贝到链接地址0x0202a000处(在链接脚本里指定的),并跳转到这个地址去执行*/adrr0,_start/*adr指令用于读取_start在当前的运行的物理地址,即0x02023400*/ldrr1,=_start/*读取_start的链接地址,即0x0202a000*/ldrr2,=bss_start/*读取bss段的起始地址,用于计算需要拷贝的字节多少*/cmpr0,r1beqclean_bss/*如果r0=r1,则跳转到clean_bss,说明此时已经在链接地址处了*//*如果r0!=r1,则进行如下的拷贝*/copy_loop:ldrr3,[r0],#4/*源*/strr3,[r1],#4/*目的*/cmpr1,r2/*判断是否已经拷贝完*/bnecopy_loop/*如果没有拷贝完就继续拷贝*//*清bss段*/clean_bss:ldrr0,=bss_start/*r0保存bss段的起始地址*/ldrr1,=bss_end/*r1保存bss段的起始地址*/cmpr0,r1beqrun_on_dram/*如果r0=r1,则跳转到run_on_dram,说明bss段里边没有变量*/movr2,#0clear_loop:strr2,[r0],#4cmpr0,r1bneclear_loopldrsp,=0x02060000/*跳转*/run_on_dram:ldrpc,=main/*执行完这句话之后,PC就指向了main的链接地址*/

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

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

SECTIONS{.=0x0202A000;.text:{*(.text)}.rodataALIGN(4):{*(.rodata*)}.dataALIGN(4):{*(.data*)}bss_start=.;.bssALIGN(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,从服务器上下载下来,我们进行简单分析一下:从上图可以看出,程序的链接地址确实是我们在连接脚本里指定的0x0202a000我们再来看看跳转的那条指令;

202a060:e59ff010ldrpc,[pc,#16];202a078将当前PC的值加上24后的地址的内容赋给PC,即:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论