1. 程式人生 > >程序的記憶體空間佈局

程序的記憶體空間佈局

程序的記憶體佈局在結構上是有規律的,對於 linux 系統上的程序,其記憶體空間一般可以粗略地分為以下幾大段,從高記憶體到低記憶體排列:

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位下):