历史上的今天
返回首页

历史上的今天

今天是:2025年02月05日(星期三)

正在发生

2020年02月05日 | ARM映像文件的组成

2020-02-05 来源:eefocus

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类型数据。

 ///////

ARM的Image文件又叫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中的RW和ZI段不能写,所以在远行时态时RW和ZI属性段就要被搬到RAM中去。而RO段本身就是只读的,可以放在ROM中运行也可以搬到RAM中运行,当然搬在RAM中运行更块。

推荐阅读

史海拾趣

问答坊 | AI 解惑

1302实时时钟程序共享!

本帖最后由 paulhyde 于 2014-9-15 03:27 编辑 1302实时时钟程序共享!    …

查看全部问答>

想学专业音响吗?

加入专业音响技术QQ:91617962…

查看全部问答>

如何选择限流电阻数值,使三极管进入深度饱和状态

以共发射极电路为例,进入深饱和状态与基极、集电极电阻,三极管的电流放大系数和电源电压有关,基极偏压电阻越小、集电极负载电阻越大、三极管的放大系数越高、电源电压越低,越容易进入饱和状态。 基极开路时集电极电压等于电源电压,逐步减小基 ...…

查看全部问答>

单片机 stc isp 打不开

如题所述。我在安装isp运行或者 用绿色版运行之后都提示缺少一个文件 但是我的文件夹下有这个文件 而且我去网上下了新的解压替换了之后还是这样  。isp下了好几个了都是这样  。请高手指点一下。 注:我没有连接单片机 只是单 ...…

查看全部问答>

LCD1602显示问题?

可以完全显示,只是有点小问题,比如第一次显示的是3位数 类似234,要是第2次在同样位置显示个1位数 如6,现在LCD显示变成634,怎么清除后面2位啊?命令里还是别的问题?…

查看全部问答>

Vxworks网络编程提问

我在Vxworks下实现以太网通讯,采用UDP协议,在调试状态下,程序运行正常,用ping指令ping目标机和测试程序测试均正常,但将程序作成映像下载到DOC中运行时,却发现无法ping通目标机,不知怎么回事,请高手解释一下,另外,我在程序中开了三个任务 ...…

查看全部问答>

请教WinCE6.0开发中关于Emulator的问题(如何自制SDK,Emulator)

我刚刚接触WinCE,我需要做的事情是在一般WinCE设备上开发应用程序,我打算自己在PB6.0上导出一个一般的WinCE6.0的SDK并安装,然后在VS2005上写代码,通过WinCE6.0仿真器看到代码的效果。 现在我按照网上的文章“WinCE6.0安装顺序”依次安装了下列 ...…

查看全部问答>

verilog FPGA 中 状态转换程序中出现的问题

module contral(clk1hz,rst_n,hold,    led,num,flash);input clk1hz;input rst_n;input hold;  //incident happen//input INTI;  //红绿灯初始状态output [2:0] led; //红绿灯output [4:0] num; //显示的倒计时outp ...…

查看全部问答>

2010山东省大学生电子设计大赛优秀论文

本帖最后由 paulhyde 于 2014-9-15 09:25 编辑 2010山东省大学生电子设计大赛优秀论文  …

查看全部问答>