版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。请勿用于商业用途,否则将追究法律责任。http://blog.youkuaiyun.com/wfq0624
详细可参考http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0206ic/Chdcgbjd.html
Realview 编译工具开发指南.pdf 【第三章】
使用分散载入描述文件(链接脚本文件)时,Image$$RW$$Base、Image$$RW$$Limit、Image$$RO$$Base、Image$$RO$$Limit、Image$$ZI$$Base 和Image$$ZI$$Limit 符号是未定义的。
因为默认的实现使用Image$$ZI$$Limit地址作为堆的基地址,所以使用分散加载文件,启动代码里一定要使用__user_initial_stackheap()来重新设置堆栈和堆。
在分散加载时,连接器会将用户的__user_initial_stackheap()函数代替C库函数默认的堆栈和堆初始化函数,并将其连接到用户的镜像文件中,用户可通过重新实现__user_initial_stackheap()函数来改变堆栈和堆的位置,从而适合自己的目标硬件。
__user_initial_stackheap()可以用C或汇编语言来实现。它必须返回如下参数:
R0—堆基地址(heap base)
R1—堆栈基地址(Stack base)
R2—堆长度限制值(heap limit)
R3—堆栈长度限制值(Stacklimit)
当用户使用分散加载功能的时候,必须重新实现__user_initial_stackheap (),否则链接程序显示以下出错信息: Undefined symbol Image$$ZI$$Limit (referredfrom sys_stackheap.o)。
注:Image$$ZI$$Limit变量为零初始化段(ZI段)的末地址。未使用分散加载时,堆默认就定位在ZI段的末地址,如图2所示。
__user_initial_stackheap()函数的实现有两种方法。
共用一个存储区,汇编语言如下:
这种方式定义的堆栈和堆共用一个存储区,采用相向的增长方向
使用两个存储区,汇编语言如下:
这种方式定义的堆栈和堆分别采用两个不同存储区。堆栈采用向下增长,从地址0x40000到地址0x20000;堆采用向上增长,从地址0x28000000到地址0x28080000