资源描述:
《arm映像文件及其地址映射》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、ARM映像文件及其地址映射2010-06-2414:161、什么是arm的映像文件,arm映像文件其实就是可执行文件,包括bin或hex两种格式,可以直接烧到ROM里执行。在axd调试过程中,我们调试的是axf文件,其实这也是一种映像文件,它只是在bin文件中加了一个文件头和一些调试信息。映像文件一般由域组成,域最多由三个输出段组成(RO,RW,ZI),输出段又由输入段组成。所谓域,指的就是整个bin映像文件所处在的区域,它又分为加载域和运行域。对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW段必须重新装载到可读写的RAM
2、中。简单来说,程序的加载时域就是指程序烧入Flash中的状态,运行时域是指程序执行时的状态。一般来说flash里的整个bin文件所在的地址空间就是加载域,当然在程序一般都不会放在flash里执行,一般都会搬到sdram里运行工作,它们在被搬到sdram里工作所处的地址空间就是运行域。我们输入的代码,一般有代码部分和数据部分,这就是所谓的输入段,经过编译后就变成了bin文件中ro段和rw段,还有所谓的zi段,这就是输出段。在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化
3、为零的变量被称为ZI段(ZeroInit)。对于加载域中的输出段,一般来说RO段后面紧跟着RW段,RW段后面紧跟着ZI段。在运行域中这些输出段并不连续,但RW和ZI一定是连着的。ZI段和RW段中的数据其实可以是RW属性。2、简单地址映射对于比较简单的情况,可以在ADS集成开发环境的ARMLINKER选项output中指定ROBase和RWBase,即在simple模式下,告知连接器RO和RW的连接基地址。这种模式下,ARMLinker会输出以下符号,它们指示了在运行域中各个输出段所处的地址空间,在使用的时候可以用IMPORT引入:
4、Image$$RO$$Base
5、:表示RO段
6、在运行域中的起始地址
7、Image$$RO$$Limit
8、:表示RO区末地址后面的地址,即RW数据源的起始地址
9、Image$$RW$$Base
10、:RW区在RAM里的执行区起始地址,也就是编译器选项RW_Base指定的地址
11、Image$$ZI$$Base
12、:ZI区在RAM里面的起始地址
13、Image$$ZI$$Limit
14、:ZI区在RAM里面的结束地址后面的一个地址ROBase对应的就是
15、Image$$RO$$Base
16、,RWBase对应的是
17、Image$$RW$$Base
18、,由于ZI段是包含在RW段里的,所以
19、Image$$RW$$Limit
20、就等于
21、Image$$ZI$$lim
22、it
23、。下面给出一个例子,假设ROBase设为0x00000000,后面的RWBase地址是0x30000000,然后在Options选项中有Imageentrypoint,是一个初始程序的入口地址,设为0x00000000,。现在要做的就是将RWsection移到以0x30000000开始的地方,并且创造一个ZIsection。首先比较Image$$RO$$Limit和Image$$RW$$Base,如果相等,说明executionview下RWsection的地址和loadview下RWsection的地址相同,这样,不需要移动RWsection;如果不等,说明需要移动R
24、Wsection到它在executionview中的地方,把ROM里
25、Image$$RO$$Limt
26、开始的RW初始数据拷贝到RAM里面
27、Image$$RW$$Base
28、开始的地址,当RAM这边的目标地址到达
29、Image$$ZI$$Base
30、后就表示RW区的结束和ZI区的开始,接下去就对这片ZI区进行清零操作,直到遇到结束地址
31、Image$$ZI$$Limit
32、示例代码如下:IMPORT
33、Image$$RO$$Limit
34、IMPORT
35、Image$$RW$$Base
36、IMPORT
37、Image$$ZI$$Base
38、IMPORT
39、Image$$ZI$$Limit
40、IMPORTma
41、in;声明C程序中的Main()函数AREAStart,CODE,READONLY;声明代码段StartENTRY;标识程序入口CODE32;声明32位ARM指令ResetLDRSP,=0x40003F00;初始化C程序的运行环境LDRR0,=
42、Image$$RO$$Limit
43、;得到RW数据源的起始地址LDRR1,=
44、Image$$RW$$Base
45、;RW区在RAM里的执行区起始地址LDRR3,=
46、Image$$ZI$$Base
47、;ZI区在RAM里面的起始地址CMPR0,R1;检查RWsection的