什么是分散加载文件?
分散加载文件(scatter file)是一个文本文件,它包含了ARM链接器生成映像文件时所需要的信息。如果不使用scatter文件,ARM链接器在生成映像文件的时候会采用默认的方式对数据进行排放,使用scatter文件,用户可以将某些数据放置在指定的位置
堆、栈空间
堆区:通过new,malloc,realloc分配的内存块,编译器不会释放该空间,需要用户手动free释放
栈区:存放函数内的局部变量,形参和函数返回值等,使用过后,系统自动管理栈区内存,不需要开发人员手动管理。
堆向着内存地址增加的方向增长,从内存的低地址向高地址方向生长
栈向着内存地址减小的方向增长,从内存的高地址向低地址方向生长
方式一:分别指定堆区和栈区
在scatter文件中定义两个地址区域:ARM_LIB_HEAP 和 ARM_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