程序的記憶體空間佈局
阿新 • • 發佈:2019-02-20
1、核心態記憶體空間,其大小一般比較固定(可以編譯時調整),但 32 位系統和 64 位系統的值不一樣。
2、使用者態的棧,大小不固定,可以用ulimit -s 進行調整,預設一般為 8M,從高地址向低地址增長。
3、mmap區域(記憶體對映段),既可以從高地址到低地址延伸(所謂 flexible layout),也可以從低到高延伸(所謂 legacy layout),看程序具體情況。
4、brk 區域(堆),緊鄰資料段(甚至貼著),從低位向高位伸展,但它的大小主要取決於 mmap 如何增長,一般來說,即使是 32 位的程序以傳統方式延伸,也有差不多 1 GB 的空間。
5、資料段,主要是程序裡初始化和未初始化(BSS)的全域性資料總和,當然還有編譯器生成一些輔助資料結構等等),大小取決於具體程序,其位置緊貼著程式碼段。
6、程式碼段,主要是程序的指令,包括使用者程式碼和編譯器生成的輔助程式碼,其大小取決於具體程式,但起始位置根據 32 位還是 64 位一般固定(-fPIC, -fPIE等除外)。
以上各段(除了程式碼段資料段)其起始位置根據系統是否起用 randomize_va_space 一般稍有變化,各段之間因此可能有隨機大小的間隔,千言萬語不如一幅圖(x86-32位下):