ARM空间分段(lst文件夹下map文件)

来源:互联网 发布:三国群英传7 mac 编辑:程序博客网 时间:2024/06/10 14:29

 对于ARM,堆是向上生长的,栈是向下生长的。

 局部变量占用栈(stack)空间。

  程序中动态申请的如malloc()和new函数申请的内存空间占用堆(heap)空间。

|Image$$RO$$Base| 
表示RO输出段运行时起始地址,也可以说是程序代码存放的起始地址,由-ro-base这个参数指定;
|Image$$RO$$Limit|
表示RO输出段运行时存储区域界限,其值可通过|Image$$RO$$Base|+Code sizes+RO Data sizes+4计算得出;
|Image$$RW$$Base|
表示RW输出段运行时起始地址,记得是运行时的地址,而不一定是加载时的存放地址,因为RW输出段在加载时可能是在ROM中并紧跟着RO输出段存放的,当程序运行时才移动(在有些书中说是移动,个人觉得应该只是复制,希望大家能帮我解释一下,谢谢!)到RAM起始地址为|Image$$RW$$Base|的区域,由-rw-base这个参数指定;未指定的话,默认紧跟RO输出段,那么|Image$$RW$$Base||Image$$RO$$Limit|;
|Image$$RW$$Limit|
表示RW输出段运行时存储区域界限,其值可通过|Image$$RW$$Base|+RW Data sizes+4计算得出;
|Image$$ZI$$Base|
表示ZI输出段运行时起始地址,它是运行时在RAM中生成的,紧跟着RW输出段存放,其值和|Image$$RW$$Limit|一样
|Image$$ZI$$Limit|
表示ZI输出段运行时存储区域界限,其值可通过|Image$$ZI$$Base|+ZI Data sizes+4计算得出。

 

CODE 是 RO-CODE同义词,也是.text同义词
CONST是RO-DATA同义词,也是.constdata同义词
DATA是RW-DATA同义词,也是.data同义词
ZI是.bss的同义词

 

  Total RO  Size (Code + RO Data)                12216 (  11.93kB)
  Total RW  Size (RW Data + ZI Data)               292 (   0.29kB)
  Total ROM Size (Code + RO Data + RW Data)      12412 (  12.12kB)

 

应用程序的堆栈(stack)和堆(heap)是在C库函数初始化过程中建立起来的,在ADSl.2或更新版本中,在缺省状态下C库函数初始化代码会将连接器生成的符号Image$$ZI$$Limit地址作为堆的基地址。在分散加载时,连接器会将用户的__user_initidl_stackheap()函数代替C库函数默认的堆栈和堆初始化函数,并将其连接到用户的镜像文件中,用户可通过重新实现__user_initial_stackheap()函数来改变堆栈和堆的位置,从而适合自己的目标硬件。

    __user_initial_stackheap()可以用C或汇编语言来实现。它必须返回如下参数:

    r0—堆基地址;

    r1—堆栈基地址;

    r2—堆长度限制值(需要的话);

    r3—堆栈长度限制值(需要的话)。
    当用户使用分散加载功能的时候,必须重新实现一user_initial_staacklaeap(),否则连接器会报错:
    Error:L6218E:Undefined symbol Imager$$ZI$$一Limit(referred from sys_stackheap.o)。
    注:Image$$ZI$$Limit变量为零初始化段(ZI段)的末地址。未使用分散加载时,堆默认就定位在ZI段的末地址,而栈通常位于RAM的顶端

 

(2)使用两个存储区
    汇编语言如下:

 

这种方式定义的堆栈和堆分别采用两个不同存储区。堆栈采用向下增长,从地址Ox40000到地址Ox20000;堆采用向上增长,从地址0x28000000到地址0x28080000,如图4所示。