分散加载文件相关知识_摘录

标签:
it |
分类: 资料收藏 |
一般而言,一个程序包括只读的代码段和可读写的数据段。在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW段必须重新装载到可读写的RAM中,这就涉及到程序的加载域和运行域。简单来说,程序的加载域就是指程序烧入Flash中所占空间,运行域是指程序执行时所占空间。对于比较简单的情况,可以在ADS集成开发环境的ARM
LINKER选项中指定RO BASE和RW
BASE,告知连接器RO和RW的连接基地址。对于复杂情况,如RO段被分成几部分并映射到存储空间的多个地方时,需要创建一个称为“分散加载文件”的文本文件,通知连接器把程序的某一部分连接在存储器的某个地址空间。需要指出的是,分散加载文件中的定义要按照系统重定向后的存储器分布情况进行。在引导程序完成初始化的任务后,应该把主程序转移到RAM中去运行,以加快系统的运行速度。
什么是arm的映像文件,arm映像文件其实就是可执行文件,包括bin或hex两种格式,可以直接烧到rom里执行。在axd调试过程中,我们调试的是axf文件,其实这也是一种映像文件,它只是在bin文件中加了一个文件头和一些调试信息。映像文件一般由域组成,域最多由三个输出段组成(RO,RW,ZI)组成,输出段又由输入段组成。所谓域,指的就是整个bin映像文件所处在的区域,它又分为加载域和运行域。加载域就是映像文件被静态存放的工作区域,一般来说flash里的整个bin文件所在的地址空间就是加载域,当然,程序一般都不会放在 flash里执行,一般都会搬到sdram里运行工作,它们在被搬到sdram里工作所处的地址空间就是运行域。我们输入的代码,一般有代码部分和数据部分,这就是所谓的输入段,经过编译后就变成了bin文件中ro段和rw段,还有所谓的zi段,这就是输出段。对于加载域中的输出段,一般来说ro段后面紧跟着rw段,rw段后面紧跟着zi段。在运行域中这些输出段并不连续,但rw和zi一定是连着的。zi段和rw段中的数据其实可以是rw属性。
什么是arm的映像文件,arm映像文件其实就是可执行文件,包括bin或hex两种格式,可以直接烧到rom里执行。在axd调试过程中,我们调试的是axf文件,其实这也是一种映像文件,它只是在bin文件中加了一个文件头和一些调试信息。映像文件一般由域组成,域最多由三个输出段组成(RO,RW,ZI)组成,输出段又由输入段组成。所谓域,指的就是整个bin映像文件所处在的区域,它又分为加载域和运行域。加载域就是映像文件被静态存放的工作区域,一般来说flash里的整个bin文件所在的地址空间就是加载域,当然,程序一般都不会放在 flash里执行,一般都会搬到sdram里运行工作,它们在被搬到sdram里工作所处的地址空间就是运行域。我们输入的代码,一般有代码部分和数据部分,这就是所谓的输入段,经过编译后就变成了bin文件中ro段和rw段,还有所谓的zi段,这就是输出段。对于加载域中的输出段,一般来说ro段后面紧跟着rw段,rw段后面紧跟着zi段。在运行域中这些输出段并不连续,但rw和zi一定是连着的。zi段和rw段中的数据其实可以是rw属性。
举例:分散加载文件的基本结构如下图
这里面Flash以及SRAM的地址以及大小都是可以修改的,其他的也可以修改,但起始地址以及大小都要在芯片真实存在的有效物理地址上。
几点说明:
<1>分散加载的根本功能是指定程序在存储空间上面的存储分配以及运行空间的分配,所以要有加载域和运行域来分别指定程序存储空间以及程序运行空间。 一般来说程序的运行空间是在芯片的ROM类存储器里面,在Cortex-M里面基本就是芯片内部的Flash空间;
<2>运行域就有意思了,由于MCU内部的Flash(几乎都是Nor-Flash)是可以运行代码的,但是不能用于变量也就是RW与ZI的加载,主要原因是变量需要经常修改,几个小时就可能连续改变几十万次, 但是目前Flash工艺的写寿命介于10万次~100万次之间,如果把RW和ZI放在Flash上,那就是灾难,Flash会因为写次数的限制很快就会挂掉,而且Flash只能按块操作,开销太大,所以一般都是放到SRAM里面,所以你会看到在这个例子里面,运行域分成两个部分,RO数据段放在内部Flash里面,RW与ZI放到片内SRAM中去执行。这点与电脑是不同的,电脑的硬盘是完全不能执行程序的,所以如果你把电脑看成MCU的话,用Keil来编写程序的话,那么电脑的RO、RW、ZI段都是放到内存上执行的,也就是说电脑实际上只有一个执行域就在内存上,可以类似理解为MCU的片内SRAM上。其实很多市面上的A7、A8、A9、A53等内核的应用处理器运行Linux与Android也可以类比为电脑,所有的东西都要加载到RAM上运行。
<3>分散加载可以简单理解为:基本结构就是至少3个域(这个事实上不对,但是对于大多数Cortex-M系列MCU的分散加载可以这样简单理解):至少一个加载域、建议两个运行域 (一个RO运行域、一个RW+ZI运行域),就是你要告诉链接器至少3个信息,即:从哪里加载程序(至少一个域)、在哪里运行程序(至少一个域)、在哪里读写程序运行中用到的变量(至少一个域,实际上也可以跟运行程序的域在一起,但强烈建议分开)。
前一篇:mdk技巧(一)
后一篇:WFE和WFI的异同