您的位置 首页 技术

ARM基础知识 — ELF映像文件

记录一些简单的ARM的映像文件的内容组成及原理。1ARM映像文件(axf和bin文件)的组成。ARM是32位处理器,地址位宽也是32位,因此其存储器

记载一些简略的ARM的映像文件的内容组成及原理。

1.ARM映像文件(axf和bin文件)的组成。

ARM是32位处理器,地址位宽也是32位,因而其存储器的映射规模能够到达4GB空间。基本上关于ARM处理器,上电或复位时都会从0x00000000出开端履行指令,因而有必要确保映像文件的开端方位放置在0x00000000处,不管是选用NAND或NOR flash,这一点都无法改动。正确放置之后,处理器会获取到正确的指令然后次序履行。

ARM的映像文件(即可履行文件)。生成的ARM映像文件有分为axf和bin两种。bin文件时真实的可履行文件,而axf文件是ARM特有的调试文件,除了包括了bin文件的内容外还包括了许多其他的调试信息。在axf的文件头和文件尾部都包括了能够用在ADW或AXF的load image的调试中。

2.ARM的映像文件的加载域和运转域的不同

加载域映像文件。尽量简略地说,即那些可履行文件例如bin文件,一般由域组成。而域由最多的三个输出段组成即(RO、RW、ZI),RO是只读的代码段,RW是可读写的数据段和ZI未初始化的数据段。剖析bin映像文件的具体内容,也能够印证上面的内容,基本上在bin的前半部分是RO的内容然后半部分是RW的内容,ZI由所认为初始化数据,因而不需求保存在bin文件中。即bin文件时RO+RW的内容的调集。而这三个输出段又是能够由多个输入段组成的,由于在汇编文件中,能够设置多个段称号,只需求在链接的时分链接到相应的方位即可,因而多个输入段能够对应到一个输出段上。上面所说的bin文件都是指的是加载域的状况,由于这都是可履行文件被初始放置在flash中时各个部分的散布状况,便是加载到体系时的状况,所以叫加载域。但体系此刻是并不能运转的。

加载域的映像文件有必要顺畅地过渡到运转时域,这时体系才干够正确地被履行。由于有个很明显的一点,程序一般都固化在flash中。而flash是只读的,上面也提到可读写的RW数据段的内容是跟在RO段后边(即bin文件中),被放置在了flash上,RW段要求可读写,flash明显不满意要求,因而加载域有必要过渡到运转时域。最直观的了解便是,咱们有必要把RW段的内容搬运到可读写的SDRAM或SRAM上去,因而就引发了运转域的问题。

怎么转化,怎么确保前面RO段的程序的内容能够正确地寻址到被搬运了的RW段的内容。由于大部分汇编程序的搬运指令都是肯定寻址的,比较少的伪指令能供给相对寻址,肯定寻址的功率明显比较高。因而咱们有必要在代码中就有必要知道将来运转时RW段被放置在了什么一个当地。在程序链接之后,一切的代码中的地址都将固定。处理这样的问题也并不杂乱,需求链接器确保RO段的运转时开端地址和RW段的运转时开端地址,这便是为什么咱们要在ADS设置衔接选项ro_base和rw_base的意图了。一切的RO段的地址都是依据ro_base指定的内容,而一切代码段的内容也是依据rw_base上的,这样程序在链接后就现已确认了一切的相对地址,剩余的事便是将相应的段的内容从加载域的方位搬移到运转时域的方位。

这样的代码搬移的作业假如是在调试状况的话,一般调试器就会帮咱们做好一切作业了,而假如是在非调试状况,就需求咱们自己仿制代码段的搬移作业,风趣的是,不少ARM都支撑从NAND flash中发动,而NAND flash自身便是不能直接履行的,需求将代码搬移到SDRAM中,因而这儿的运转时域和加载域的区别被屏蔽掉了。一般咱们做代码搬移这样的作业的时分,选用的跳转地址都要用相对跳转指令。这样的优点是,不管用户将程序加载到什么地址,代码搬移指令都能正确地将程序从加载域转化到运转时域,然后确保程序顺畅履行。

1.ELF格式文件的结构

1.1 映像文件组成部分

* 一个映像文件有一个或多个域组成
* 每个域包括一个或多个输出段
* 每个输出段包括一个或多个输入段
* 各输入段中包括了方针文件中的代码和数据

输入段中包括了四类内容:代码、现已初始化的数据、未经初始化的存储区域、内容初始化成0的存储区域。每个输入段有相应的特点,可认为只读的(RO)、可读写的(RW)以及初始化成0的(ZI)。ARM衔接器依据个输入段的特点将这些输入段分组,再组成不同的输出段及域。

一个输出段中包括了一系列的具有相同的RO、RW和ZI特点的输入段。输出段的特点与其间包括的输入段的特点相同。在一个输出段的内部,各输入段是依照必定的规矩排序的,这将在1.3节油具体地介绍。

一个域中包括1-3个输出段,其间个输出段的特点各不相同。各输出段的摆放次序是由其特点决议的。其间RO特点的输出段排在最前面,其次是RW特点的输出段,最终是ZI特点的输出段。一个域一般映射到一个物理存储器上,如ROM或RAM。

1.2 ARM映像文件各组成部分的地址暗射

ARM映像文件各组成部分在存储体系中的地址有两种:一种是映像文件坐落存储器中时(也便是该映像文件运转之前)的地址,称之为加载地址;一种是映像文件运转时的地址,称之为运转时地址。之所以有这两种地址,是由于映像文件在运转时,其间的有些域是能够移动的新的存储区域。比方,现已初始化的RW特点的数据地点的段运转之前或许保存体系的ROM中,在运转时,他被移动至RAM中。

一般,一个映像文件包括若干个域,各域又包括若干的输出段。ARM衔接器需求知道如下的信息,已决议怎么生成相应的映像文件。

* 分组信息 决议怎么将个输入段安排成相应的输出段和域。
* 定位信息 决议个域在存储空间地址中的开端地址。

依据映像文件中地址映射的杂乱程度,有两种方法来告知arm衔接器这些相关信息。关于映像文件中地址映射联系比较简略的状况,能够运用命令行选项;关于映像文件中地址映射联系比较杂乱的状况,能够运用一个配置文件。

2.arm映像文件的进口点

2.1 arm映像文件的进口点有两种类型:一种是映像文件运转时的进口点,称为初始进口点(initial entry point),另一种是一般进口点(entry point).

初始进口点是映像文件运转时的进口点,每个映像文件只要一个仅有的初始进口点,它保存在ELF头文件中。假如映像文件是被操作体系加载的,操作体系是经过跳转到该初始进口点处来加载该映像文件。

一般的进口点是在汇编顶用ENTRY伪操作界说。他一般用于标志该段代码是经过异常中断处理程序进入的。这样衔接器删去无用的段时不会将该段代码删去。一个映像文件中能够界说多个一般进口点。

应该留意的是,初始进口点能够使一般进口点,但也能够不是一般进口点。

2.2界说初始进口点

初始进口点有必要满意下面两个条件:

* 初始进口点有必要坐落映像文件的运转时域内。
* 浸透初始进口点的运转时域不能被掩盖,他的加载地址和运转地址有必要是相同的。

能够运用衔接选项-entry address来指定映像文件的初始进口点。这时,address指定了映像文件的初始进口点的地址值。

关于地址0x0处为rom的嵌入式运用体系,能够运用-entry 0x0来指定映像文件的初始进口点。这样当体系复位后,主动跳转到该进口开端履行。

假如映像文件是被一个加载器加载的,该映像文件该映像文件有必要包括一个初始化进口点。这种映像文件一般还包括了其他一般进口点,这些一般进口点一般为异常中断处理程序的进口地址。

当用户没有指定-entry address时,衔接器依据下面的规矩决议映像文件的初始进口点。

* 假如输入的方针文件中只要一个一般进口点,该一般进口点被衔接器当成映像文件的初始进口点。

* 假如输入的方针文件中没有一个一般进口点,或许其间的一般进口点多于一个,则衔接器生成的映像文件中不包括初始进口点,并发生正告信息。

2.3一般进口点的用法

一般进口点是在汇编顶用ENTRY 伪操作界说。在嵌入式运用中,各异常中断的处理程序进口运用一般进口点标明。这样衔接器在删去无用段时不会将该段代码删去。

一个映像文件中能够界说多个一般进口点。没有指定衔接选项-entry addres时,假如输入的方针文件中只要一个一般进口点,该进口点被衔接器当成映像文件的初始进口点。

3 输入段的排序规矩

衔接器依据输入段的特点来安排这些输入段,具有相同特点的输入段被放到域中一段接连的空间中,组成一个输出段。在一个输出段中,各输入段的开端地址与输出段的开端地址和该输出段中个输入段的摆放次序有关。

一般状况下,一个输出段中个输入段的摆放次序由下面几个要素决议的。用户能够经过衔接选项-first和-last来改动这些规矩。

* 输入段的特点。
* 输入段的称号
* 各输入段在衔接命令行的输入段列表中的摆放次序

依照输入段的特点,其摆放次序如下所示:

* 只读的代码段
* 只读的数据段
* 可读写的代码段
* 其他现已初始化的数据段
* 未出生化的数据

关于具有相同特点的输入段,依照其称号来排序。这是输入段称号是区别巨细写的,依照其ASCII码次序进行排序。

关于具有相同特点和名城的输入段,依照其在输入段列表中的次序进行排序。也便是说,几十个输入段的特点和称号坚持不变,假如其在编译时,各输入段在输入段列表中的摆放次序不同,生成的映像文件也将不同。

能够经过衔接选项-first和-last来改动这些规矩。假如衔接时运用了配置文件,能够在配置文件中经过伪特点FIRST和LAST到达相同的作用。

衔接选项-first和-last不能改动依据输入段进行排序的规矩,它只能改动依据输入段称号和其在输入列表中的次序的排序规矩。也便是说,假如运用-first指定

一个输入段,只要该输入段地点的输出段坐落运转时域的开端方位时,该输入段才干坐落整个运转时域的开端方位。

各个输入段排好次序后,在确认各个输入段的开端地址之前,何故经过填充补丁是个输入段满意地址对齐的要求。

ARM衔接器介绍

ARM衔接器armlink将编译得到的ELF格式文件以及相关的C/C++运转时库衔接生成相应的成果文件。armlink能够完结下面的操作:

* 衔接编译后得到的方针文件相应的c/c++运转时库,生成可履行的印象文件。
* 将一些方针文件进行衔接,生成一个新的方针文件,供将来进一步衔接时运用,这成为部分衔接。
* 指定代码和数据在内存中的方位。
* 生成被衔接文件的调试信息和相互间的引证信息。

Armlink在进行部分衔接和彻底生成可履行文件时作进行的操作是不同的。下面别离介绍:

(1)解析输入的方针文件之间的符号引证联系。
(2)依据输入方针文件对c/c++函数的调用联系,从c/c++运转时库中提取相应模块。
(3)将各个输入段排序,组成相应的输出段。
(4)删去重复的调试信息。
(5)依据用户指定的分组和定位信息,树立映像文件的地址映射联系。
(6)重定位需求重定位的值。
(7)生成可履行的映像文件。

armlink在进行部分衔接生成新的方针文件时履行下面的操作。

(1)删去重复的调试信息
(2)最小化符号表的巨细
(3)保存那些未被解析的符号
(4)生成新的方针文件

下面依据各armlink的命令行选项的功用分类列举了armlink的命令行选项,各选项的具体用法将在后边有具体地介绍。

* 供给关于armlink的协助信息
* 指定输出文件的称号和类型:*-output;*-partial;*-elf
* 运用选项文件,其间能够包括一些衔接选项。
* 拟定可履行映像文件的内存映射联系。*-rwpi;*-ropi;*-rw_base;*-ro_base;*-spit;*-scatter
* 操控可履行映射文件的内容。*-first;*-last
* 生成与映像文件的相关信息
* 操控armlink生成相关的确诊信息。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/255924.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部