微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM映像文件 he 编译器自动生成的启动函数

ARM映像文件 he 编译器自动生成的启动函数

时间:11-28 来源:互联网 点击:
什么是arm的映像文件

arm映像文件其实就是可执行文件,包括bin或hex两种格式,可以直接烧到rom里执行。在axd调试过程中,我们调试的是axf文件,其实这也是一种映像文件,它只是在bin文件中加了一个文件头和一些调试信息。

可以参考下面的pdf:ARM映像文件及执行机理

part1 part3

映像文件的组成

ARM映像文件是一个层次性结构的文件,包括了域(region),输出段(output section)和输入段(input section)。

所谓域,指的就是整个bin映像文件所处在的区域,它又分为加载域和运行域。

加载域就是映像文件被静态存放的工作区域,一般来说flash里的 整个bin文件所在的地址空间就是加载域,当然在程序一般都不会放在 flash里执行,一般都会搬到sdram里运行工作,它们在被搬到sdram里工作所处的地址空间就是运行域。

ARM映像文件一开始总是存储在ROM/Flash里面的,其RO部分既可以在ROM/Flash里面执行,也可以转移到速度更快的RAM中执行;而RW和ZI这两部分是必须转移到可写的RAM里去,其实RW包括ZI区域。

什么是RO段、RW段和ZI段

一个ARM程序包含3部分:RO,RW和ZI

RO就是ReadOnly,程序中的指令和常量

RW就是Read/Write,程序中的已初始化变量

ZI就是Zero Init,程序中的未初始化的变量

Image文件包含了RO和RW数据。

之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

Q:为什么Image中必须包含RO和RW?

A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的。

ARM程序的执行过程

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

实际上,RO中的指令至少应该有这样的功能:

1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。

2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中

在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。

为了更直观说明RO,RW,ZI在C中的意思,请看下面例子:

1)RO

看下面两段程序,他们之间差了一条语句,这条语句就是声明一个字符常量。因此按照我们之前说的,他们之间应该只会在RO数据中相差一个字节(字符常量为1字节)。

Prog1:

#include

void main(void)

{

;

}

Prog2:

#include

const char a = 5;

void main(void)

{

;

}

Prog1编译出来后的信息如下:

===========================================================

Code RO Data RW Data ZI Data Debug

948 60 0 96 0 Grand Totals

===========================================================

Total RO Size(Code + RO Data) 1008 ( 0.98kB)

Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)

Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)

===========================================================

Prog2编译出来后的信息如下:

===========================================================

Code RO Data RW Data ZI Data Debug

948 61 0 96 0 Grand Totals

===========================================================

Total RO Size(Code + RO Data) 1009 ( 0.99kB)

Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)

Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)

===========================================================

以上两个程序编译出来后的信息可以看出:

Prog1和Prog2的RO包含了Code和RO Data两类数据。他们的唯一区别就是Prog2的RO Data比Prog1多了1个字节。这正和之前的推测一致。

如果增加的是一条指令而不是一个常量,则结果应该是Code数据大小有差别。

2)RW

同样再看两个程序,他们之间只相差一个“已初始化的变量”,按照之前所讲的,已初始化的变量应该是算在RW中的,所以两个程序之间应该是RW大小有区别。

Prog3:

#include

void main(void)

{

;

}

Prog4:

#include

char a = 5;

void main(void)

{

;

}

Prog3编译出来后的信息如下:

===========================================================

Code RO Data RW Data ZI Data Debug

948 60 0 96 0 Grand Totals

===========================================================

Total RO Size(Code +

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top