关于ARM,堆是向上成长的,栈是向下成长的。
局部变量占用栈(stack)空间。
程序中动态请求的如malloc()和new函数请求的内存空间占用堆(heap)空间。
|ImageRO
Base|
表明RO输出段运行时开始地址,也可以说是程序代码寄存的开始地址,由-ro-base这个参数指定;
|ImageRO
Limit|
表明RO输出段运行时存储区域边界,其值可通过|ImageRO
Base|+Codesizes+RO Data sizes+4核算得出;
|ImageRW
Base|
表明RW输出段运行时开始地址,记住是运行时的地址,而纷歧定是加载时的寄存地址,由于RW输出段在加载时可能是在ROM中并紧跟着RO输出段寄存的,当程序运行时才移动(在有些书中说是移动,个人觉得应该仅仅仿制,期望大家能帮我解释一下,谢谢!)到RAM开始地址为|ImageRW
Base|的区域,由-rw-base这个参数指定;未指定的话,默许紧跟RO输出段,那么|ImageRW
Base|=|ImageRO
Limit|;
|ImageRW
Limit|
表明RW输出段运行时存储区域边界,其值可通过|ImageRW
Base|+RW Data sizes+4核算得出;
|ImageZI
Base|
表明ZI输出段运行时开始地址,它是运行时在RAM中生成的,紧跟着RW输出段寄存,其值和|ImageRW
Limit|相同;
|ImageZI
Limit|
表明ZI输出段运行时存储区域边界,其值可通过|ImageZI
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库函数初始化代码会将连接器生成的符号ImageZI
Limit地址作为堆的基地址。在涣散加载时,连接器会将用户的__user_initidl_stackheap()函数替代C库函数默许的仓库和堆初始化函数,并将其连接到用户的镜像文件中,用户可通过从头完成__user_initial_stackheap()函数来改动仓库和堆的方位,然后合适自己的方针硬件。
__user_initial_stackheap()可以用C或汇编语言来完成。它有必要回来如下参数:
r0—堆基地址;
r1—仓库基地址;
r2—堆长度约束值(需要的话);
r3—仓库长度约束值(需要的话)。
当用户运用涣散加载功用的时分,有必要从头完成一user_initial_staacklaeap(),不然连接器会报错:
Error:L6218E:Undefined symbol ImagerZI
一Limit(referred from sys_stackheap.o)。
注:ImageZI
Limit变量为零初始化段(ZI段)的末地址。未运用涣散加载时,堆默许就定位在ZI段的末地址,而栈一般坐落RAM的顶端
(2)运用两个存储区
汇编语言如下:
这种方法界说的仓库和堆别离选用两个不同存储区。仓库选用向下增加,从地址Ox40000到地址Ox20000;堆选用向上增加,从地址0x28000000到地址0x28080000,如图4所示。