设置堆 0X6000
设置栈 0X3000
注意 根据启动代码.S 看出heap是8字节对齐的。
这个extern __value_in_regs struct __argc_argv
__rt_lib_init(unsigned , unsigned );进行heap分配
经测试看起来这个函数本身耗费了一些字节,如下:
char *initial_heap;
char *initial_heap1;
char *initial_heap2;
// Sanity check malloc
initial_heap = (char *) malloc(0x5000);
initial_heap1 = (char *) malloc(0X1000 - 0X10);
发现 initial_heap为0x20000018, initial_heap1为0
然后再试:

就是分成三段了。
[0X20000018-0X20005018)
[0X20005018-0X20005020) 这个用来对齐
[0X20005020-0X20005FF8)
猜测就是 用了__use_two_region_memory就是如上的heap分配,如果不用 __use_two_region_memory,那么heap的分配空间有可能就到了stack的空间里。堆的分配大概就是如此。
那么栈的分配的?我以前印象里用了__use_two_region_memory,栈的分配如果超出了0x3000,就会进入heap的地盘。
如果是我来设计这个,大概也会这么设计。因为heap的检测容易的很,而stack容易出问题,应该保留一定的容错性,这样无论对于什么层次的开发人员都是友好的。
经过测试,我的猜测是对的。
如下:
栈进入了堆的区域。
另外 为啥初始分配不从0X20007000开始?因为在调用test_stack_in_range之前还调用了一个函数,占用了一点栈区。