設定堆 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之前還調用了一個函數,占用了一點棧區。