Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15078
  • 博文数量: 5
  • 博客积分: 147
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-23 00:25
文章分类
文章存档

2013年(1)

2012年(4)

我的朋友

分类: 嵌入式

2012-11-08 23:12:13

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所处的位置都是临时的,运行域中的位置才是它们的真正位置,程序初始化时必须由相应程序将它们从加载域搬移到运行域,这是由启动代码中完成的。
 
阅读(2827) | 评论(0) | 转发(0) |
0

上一篇:代码复制部分

下一篇:一些C面试题

给主人留下些什么吧!~~