【ARM系列】分散加载文件(scatter)与堆栈区域分配

什么是分散加载文件?
分散加载文件(scatter file)是一个文本文件,它包含了ARM链接器生成映像文件时所需要的信息。如果不使用scatter文件,ARM链接器在生成映像文件的时候会采用默认的方式对数据进行排放,使用scatter文件,用户可以将某些数据放置在指定的位置

堆、栈空间

堆区:通过new,malloc,realloc分配的内存块,编译器不会释放该空间,需要用户手动free释放
栈区:存放函数内的局部变量,形参和函数返回值等,使用过后,系统自动管理栈区内存,不需要开发人员手动管理。

堆向着内存地址增加的方向增长,从内存的低地址向高地址方向生长
栈向着内存地址减小的方向增长,从内存的高地址向低地址方向生长

方式一:分别指定堆区和栈区

在scatter文件中定义两个地址区域:ARM_LIB_HEAPARM_LIB_STACK,并指定EMPTY属性,在C库中便可以使用如下符号表示堆区和栈区的边界。
在这里插入图片描述

举例说明:
1.scatter文件描述

LOAD 0x80000000
{
	EXEC +0
	{
		startup.o(StartUp,+FIRST)
		*(+RO,+RW,+ZI)
	}
	//独立的堆、栈区,按照64Byte对齐
	ARM_LIB_HEAP    +0 ALIGN 64 EMPTY 0xA0000 {}
	ARM_LIB_STACK   +0 ALIGN 64 EMPTY 0x4000 {}
}

2.栈空间分配代码


//extracr core number from MPIDR_EL1 and store it in x19
bl GetCPUID
mov x19,x0

//Now we're in EL1, setup the application stack,
//the scatter file allocates 2^14 bytes per app stack
ldr x0,=Image$$ARM_LIB_STACK$$ZI$$Limit
sub x0,x0,x19,lsl #14
mov sp,x0

方式二:合并指定堆区和栈区

使用带有EMPTY属性的ARM_LIB_STACKHEAP合并指定堆和栈的区域,在程序中可以使用如下符号表示堆栈区域的边界。
在这里插入图片描述
举例说明
1.scatter文件描述

LOAD 0x04000000
{
	EXEC +0
	{
		startup.o(StartUp,+FIRST)
		*(+RO)
	}
	RAM +0 
	{
	*(+RW,+ZI)
	}
	//独立的堆、栈区,按照128Byte对齐
	ARM_LIB_STACKHEAP   0x04060000 ALIGN 128 EMPTY 0x2000 {}
}

2.栈空间分配代码

//extracr core number from MPIDR_EL1 and store it in x19
bl GetCPUID
mov x19,x0
//allocate 0x1000 per core
ldr x1,=Image$$ARM_LIB_STACKHEAP$$ZI$$Limit
mov x2,#0x1000
mul x3,x2,x19
sub SP,x1,x3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值