程序的記憶體空間布局

2021-08-19 19:45:52 字數 731 閱讀 1620

程序的記憶體布局在結構上是有規律的,對於 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位下):

程序的儲存空間布局

詳情參見我的另一篇博文 linux原始碼解析 記憶體描述符 mm struct 以下摘自 一條程序的棧區 堆區 資料區和 區在記憶體中的對映 1 棧區 主要用來存放區域性變數,傳遞引數,存放函式的返回位址。esp 始終指向棧頂,棧中的資料越多,esp的值越小。2 堆區 用於存放動態分配的物件,當你使...

Linux程序位址空間布局

bss段屬於靜態記憶體分配。通常是指用來存放程式中未初始化的全域性變數和未初始化的區域性靜態變數。未初始化的全域性變數和未初始化的區域性靜態變數預設值是0,本來這些變數也可以放到data段的,但是因為他們都是0,所以為他們在data段分配空間並且存放資料0是沒有必要的。程式在執行時,才會給bss段裡...

c 程序記憶體空間分布

c 程序記憶體空間分布 注意各部分的記憶體位址誰高誰低,注意棧從高到低分配,堆從低到高分配 記憶體分布分為5個部分,從高位址到低位址一次為 棧區 stack 堆區 heap 未初始化資料段 uninitialized data 初始化資料段 initialize data 段 text 1.文字段也...