ARM映像文件及其地址映射.

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ARM映像文件及其地址映射

2010-06-24 14:16

1、什么是arm的映像文件,

arm映像文件其实就是可执行文件,包括bin或hex两种格式,可以直接烧到ROM里执行。在axd调试过程中,我们调试的是axf文件,其实这也是一种映像文件,它只是在bin文件中加了一个文件头和一些调试信息。

映像文件一般由域组成,域最多由三个输出段组成(RO,RW,ZI),输出段又由输入段组成。所谓域,指的就是整个bin映像文件所处在的区域,它又分为加载域和运行域。对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW段必须重新装载到可读写的RAM中。简单来说,程序的加载时域就是指程序烧入Flash中的状态,运行时域是指程序执行时的状态。一般来说flash里的整个bin文件所在的地址空间就是加载域,当然在程序一般都不会放在 flash里执行,一般都会搬到sdram里运行工作,它们在被搬到sdram里工作所处的地址空间就是运行域。我们输入的代码,一般有代码部分和数据部分,这就是所谓的输入段,经过编译后就变成了bin文件中ro段和rw段,还有所谓的zi段,这就是输出段。在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW 段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。对于加载域中的输出段,一般来说RO段后面紧跟着RW段,RW段后面紧跟着ZI段。在运行域中这些输出段并不连续,但RW和ZI一定是连着的。ZI段和RW段中的数据其实可以是RW属性。

2、简单地址映射

对于比较简单的情况,可以在ADS集成开发环境的ARM LINKER选项output中指定RO Base和RW Base,即在simple模式下,告知连接器RO和RW的连接基地址。

这种模式下,ARM Linker会输出以下符号,它们指示了在运行域中各个输出段所处的地址空间,在使用的时候可以用IMPORT引入:

| Image$$RO$$Base|:表示RO段在运行域中的起始地址

|Image$$RO$$Limit|:表示RO区末地址后面的地址,即RW数据源的起始地址

|Image$$RW$$Base|:RW区在RAM里的执行区起始地址,也就是编译器选项

RW_Base指定的地址

|Image$$ZI$$Base|:ZI区在RAM里面的起始地址

|Image$$ZI$$Limit|:ZI区在RAM里面的结束地址后面的一个地址

RO Base对应的就是| Image$$RO$$Base|,RW Base 对应的是

|Image$$RW$$Base|,由于ZI段是包含在RW段里的,所以|Image$$RW$$Limit| 就等于|Image$$ZI$$limit| 。

下面给出一个例子,假设RO Base设为0x00000000,后面的RW Base 地址是

0x30000000,然后在Options选项中有Image entry point ,是一个初始程序的入口地址,设为0x00000000,。现在要做的就是将RW section移到以0x30000000开始的地方,并且创造一个ZI section。

首先比较Image$$RO$$Limit和Image$$RW$$Base,如果相等,说明execution view 下RW section的地址和load view 下RW section的地址相同,这样,不需要移动RW section;如果不等, 说明需要移动RW section 到它在execution view中的地方,把ROM里|Image$$RO$$Limt|开始的RW初始数据拷贝到RAM里面

|Image$$RW$$Base|开始的地址,当RAM这边的目标地址到达|Image$$ZI$$Base|后就表示RW区的结束和ZI区的开始,接下去就对这片ZI区进行清零操作,直到遇到结束地址|Image$$ZI$$Limit|

示例代码如下:

IMPORT |Image$$RO$$Limit|

IMPORT |Image$$RW$$Base|

IMPORT |Image$$ZI$$Base|

IMPORT |Image$$ZI$$Limit|

IMPORT main AREA ; 声明C程序中的Main()函数 Start,CODE,READONLY ; 声明代码段Start ; 标识程序入口 ; 声明32位ARM指令 ENTRY CODE32

Reset LDR SP,=0x40003F00

; 初始化C程序的运行环境

LDR R0,=|Image$$RO$$Limit| ;得到RW数据源的起始地址

LDR R1,=|Image$$RW$$Base| ;RW区在RAM里的执行区起始地址 LDR R3,=|Image$$ZI$$Base| ;ZI区在RAM里面的起始地址

CMP R0,R1 ;检查RW section的地址在load view和

execution view下是否相等

BEQ LOOP1 ;如果相等就不移动RW section,直接建立ZI scetion

LOOP0 ;否则就copy RW section到execution view下指定的地址

CMP R1,R3

LDRCC R2,[R0],#4 ;它把从R0中的地址开始的section copy到R1

中的地址开始的section

STRCC R2,[R1],#4

BCC LOOP0

LOOP1

LDR

R1,=|Image$$ZI$$Limit| ;ZI section末地址 MOV R2,#0 ;将ZI section 需要的初始化量装入R2

LOOP2

CMP

R3,R1 ;建立并初始化ZI section STRCC R2,[R3],#4 BCC LOOP2 B END main ; 跳转到C程序代码Main()函数

注:LDRCC R2,[R0],#4 ;将地址为R0的内存单元数据读取到R2中,然后

R0=R0+4

CC(小于)为条件码。

ARM映像文件及其地址映射二

2010年07月26日星期一 18:37

转载自 kun知道

最终编辑 kun知道

当我们把程序编写好以后,就要进行编译和链接了,在ADS1.2中选择MAKE按钮,会出现一个Errors and Warnings 的对话框,在该栏中显示编译和链接的结果,如果没有错误,在文件的最后应该能看到Image component sizes,后面紧跟的依次是Code,RO Data ,RW Data ,ZI Data ,Debug 各个项目的字节数,最后会有他们的一个统计数据,后面的字节数是根据用户不同的程序而来的。Image component sizes

Code RO Data RW Data ZI Data Debug

17256 158096 8 184 112580 Object Totals

1064 299 0 0 796 Library Totals

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

Code RO Data RW Data ZI Data Debug

18320 158395 8 184 113376 Grand Totals

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

Total RO Size(Code+RO Data) 176715(172.57KB)

Total RW Size(RW Data+ZI Data) 192 ( 0.19KB)

Total ROM Size(Code+RO Data+RW Data) 176723(172.58KB)

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Code :显示代码占用了多少字节。

RO Data 显示只读数据占用了多少字节。

相关文档
最新文档