應用程式是從0x8048000開始,那是由linker定的,具體數值在一linker指令碼定的,具 體在哪忘了,只在linux上是這樣,到其它的平台上,可能就是另外乙個值了,這只是個約定。0x804a008到0x8048000之間是程式 的.text,.data,.bss等內容。
而mmap分配的記憶體位址從0x40000000開始是由linux核心定的(見《深入理解linux核心》第三版最後一章),2.6.9以前的預設開始位址。
當要分配的記憶體小於128k時malloc使用brk()向核心申請記憶體,所以開始位址離 0x8048000很近,
而當要分配的記憶體大於了128k時,glibc的malloc就用mmap()向核心要記憶體,所以開始位址離
0x40000000很近。
-------------------
在glibc的malloc的實現中, 分配虛存有兩種系統呼叫可用: brk()和mmap(), 如果要分配大塊記憶體, glibc會使用mmap()去分配記憶體,這種記憶體靠近棧. 你可以通過:
#include
mallopt(m_mmap_threshold, 記憶體塊大小), 這樣只有超過這個"記憶體塊大小"的malloc才會使用mmap(), 其他使用brk, 使用brk()從貼近heap的地方開始分配.
-------------------------------
在glibc的malloc的實現有乙個優化,
1. 當你malloc()一塊很小的記憶體是, glibc呼叫brk(), 只需要在heap中移動一下指標, 即可獲得可用虛存, 這樣分配得到的位址較小.
2. 當你malloc()一塊較大記憶體時, glibc呼叫mmap(), 需要在核心中重新分配vma結構等, 他會在靠近棧的地方分配虛存, 這樣返回的位址大.
3. 這個較小和較小的臨界值是乙個通過mallopt()調整的.
4. 當然, 除了上面的規則, malloc()還有自己的演算法, 來判斷到底採用mmap()還是brk(), 一般和虛存碎片有關.
---------------------------------
new和malloc的區別詳細總結
malloc是c中的函式,需要宣告特定的標頭檔案。而new是c 中的關鍵字 操作符 它本身不是函式,所以不依賴於標頭檔案,c 譯器就可以把new編譯成目標 1 申請記憶體所在位置不同 new操作符從自由儲存區分配記憶體空間,而malloc函式從堆上分配記憶體,自由儲存區不同於堆,但是都需要手動釋放,...
malloc 之後free報錯的原因 詳細解析
今天閒著沒事去敲一些簡單的程式設計題來複習複習,結果在用free 函式的時候報錯了。由此引發了我的思考。題目如下 輸入一串字元,以 結束。統計其中字母個數,數字個數,其它符號個數。例 輸入 ab123 輸出 letters 2 digits 3 others 1 解題思路 按照我平常思路的話用乙個c...
Glibc中的字元測試函式
函式名稱 函式原型 功能說明 isalnum int isalnum int c 檢查引數c是否為英文本元或阿拉伯數字 isalpha int isalpha int c 檢查引數c是否為英文本元 isascii int isascii int c 檢查引數c是否為ascii字元,也就是判斷c是否在...