天天看點

__use_two_region_memory大概是怎麼回事 ?

設定堆 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

然後再試:

__use_two_region_memory大概是怎麼回事 ?

就是分成三段了。

[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容易出問題,應該保留一定的容錯性,這樣無論對于什麼層次的開發人員都是友好的。

經過測試,我的猜測是對的。

如下:

__use_two_region_memory大概是怎麼回事 ?

棧進入了堆的區域。

另外 為啥初始配置設定不從0X20007000開始?因為在調用test_stack_in_range之前還調用了一個函數,占用了一點棧區。

繼續閱讀