ARM中的各种源文件经过ADS编译后,生成ELF格式的目标文件,然后经过链接后,生成ELF格式的可执行文件(Image),分为bin,hex两种类型。至于axf文件其实也是可执行文件,只是其中加入了调试信息。
在我们的程序中,有CODE和DATA段,就是输入段。
程序链接后,根据属性分为RO,RW,ZI就是输出段。
RO段:包括执行代码和常量,属性为只读(ReadOnly)
RW段:包括已经初始化且不为0的变量,属性为可读写(ReadWrite)
ZI段:包括初始化为0的变量和未初始化的变量(Zero Init)
Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。
可执行文件烧入ROM中后,RO,RW,ZI段所处的区域就叫做加载域。对于加载域中的输出段,一般来说ro段后面紧跟着rw段,rw段后面紧跟着zi段。
程序运行时,会把代码复制到SDRAM中链接时设定的地址。就像在ADS软件中设置的RO base,RW base。ADS也会把这些地址变量输出,以供程序使用。
|Image$$RO$$Base| :RO段起始地址
|Image$$RO$$Limit| :RO段结束地址加1
|Image$$RW$$Base| :RW段起始地址
|Image$$RW$$Limit| :ZI段结束地址加1
|Image$$ZI$$Base| :ZI段起始地址
|Image$$ZI$$Limit| :ZI段结束地址加1
程序复制到SDRAM中后,运行的区域就是运行域。在运行域中这些输出段并不连续,但rw和zi一定是连着的。
加载域中RO,RW,ZI所处的位置都是临时的,运行域中的位置才是它们的真正位置,程序初始化时必须由相应程序将它们从加载域搬移到运行域,这是由启动代码中完成的。
阅读(2895) | 评论(0) | 转发(0) |