Chinaunix首页 | 论坛 | 博客
  • 博客访问: 379705
  • 博文数量: 61
  • 博客积分: 4650
  • 博客等级: 上校
  • 技术积分: 786
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-11 21:07
个人简介

少抱怨,多实干;

文章分类

全部博文(61)

文章存档

2017年(1)

2016年(13)

2015年(1)

2013年(2)

2011年(1)

2010年(3)

2009年(23)

2008年(17)

我的朋友

分类: LINUX

2008-11-20 16:12:10

关于ARM中可执行文件的格式问题

ARM映像文件的组成
        所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image
文件来称呼它。Image文件包含了RO和RW数据。之所以Image文件不包含ZI数据,是因
为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。
包含进去反而浪费存储空间。

烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。因此就有
必要了解ARM程序是如何从ROM中的image到达实际运行状态的。


RO  == ReadOnly      只读的代码段和常量
RW  == ReadWrite  可读写的全局变量和静态变量
ZI     ==  ZeroInit           RW段中要被初始化为零的变量的段(也就是说该段包含在RW内)

        对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,
而在运行时,程序中的RW段必须重新装载到可读写的RAM中。这就涉及到程序的加载
时域和运行时域。简单来说,程序的加载时域就是指程序烧入Flash中的状态,运行时
域是指程序执行时的状态。
        在引导程序完成初始化的任务后,应该把主程序转移到RAM中去运行,以加快系
统的运行速度。


        RO中的指令至少应该有这样的功能:
       1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
       2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器
给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM
中在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否
则只能运行不含变量的代码。

总结:
1; C中的指令以及常量被编译后是RO类型数据。
2; C中的未被初始化或初始化为0的变量编译后是ZI类型数据。
3; C中的已被初始化成非0值的变量编译后市RW类型数据。

 
///////

ARMImage文件又叫ELF文件由若干域组成,通常是加载域和运行域。

加载域:就是Image被静态存放的区域,一般就是指烧在flash中的整个bin文件;

运行域:通常是程序都是被搬到SDRAM中运行,该Image被搬在SDRAM里工作所处的地址空间就是运行域。

每个域又由至多三个输出段组成,每个输出段又由一个或多个输入段组成,输入段由目标文件中的代码和数据。我们写的程序代码其实就是输入段。

输入段包括三种属性:只读(RO:Read Only。对应C程序中的代码和常量),可读写(RW:Read Write。对应C程序中的初始化为非0的变量),初始化为0的属性(ZI:Zero Init。对应于C程序中的未初始化或初始化为0的变量)

在加载域中,三者的排序顺序依次是:           

 

在运行域中,只有RW和自ZI段必须连在一起。

因为ROM中的RWZI段不能写,所以在远行时态时RW和ZI属性段就要被搬到RAM中去。而RO段本身就是只读的,可以放在ROM中运行也可以搬到RAM中运行,当然搬在RAM中运行更块。

阅读(937) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~