__use_two_region_memory大概是怎么回事 ?

设置堆 0X6000

设置栈 0X3000

注意 根据启动代码.S  看出heap是8字节对齐的。

这个extern __value_in_regs struct __argc_argv
__rt_lib_init(unsigned /*heapbase*/, unsigned /*heaptop*/);进行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之前还调用了一个函数,占用了一点栈区。

猜你喜欢

转载自blog.csdn.net/unsv29/article/details/107076746
今日推荐