linux應用程式中,記憶體布局

2021-08-19 14:42:24 字數 1786 閱讀 6036

方法:通過檢視應用程式程序中的程序位址對映檔案實現。

例如檢視2053號程序的記憶體布局 

命令如下:cat / proc / 2053 / maps 

結果如下: 

通過我們的下面來程式分析各種

變數在程式中的記憶體位置。

檔名:addr.c

#include 

#include

int a; //全域性未初始化變數

int b = 2; //全域性初始化變數

intstatic c; //全域性靜態未初始化變數

intstatic d = 4; //全域性靜態初始化變數

intconst e = 5; //全域性常量

**段ë資料段

a,b,c,d,c,d

堆m_addr

棧a,b,e

總結:各個段存放的資料型別

棧:區域性變數(初始化或者未初始化)或者區域性常量(常數)

堆:動態分配空間(malloc的)

資料段:全域性變數(初始化或者未初始化),靜態變數(靜態)

**段:全域性常量(常數)

第25號,就是bss段的記憶體位址範圍0x080498c0〜0x080498d4(其空間大小為14b)

bss段:a,c,c 總結

:bss段存放的是未初始化的資料(變數),只要是存放在資料段(大概念)又沒有初始化的就存在這裡。

bss段:bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。

資料段:資料段(data segment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。

**段:**段(code segment/text segment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。**段是存放了程式**的資料,假如機器中有數個程序執行相同的乙個程式,那麼它們就可以使用同乙個**段。

堆(heap):堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)

棧(stack):棧又稱堆疊, 是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。

linux應用程式記憶體布局

對向高記憶體位址生長,棧想低記憶體位址生長 linux中所有的應用程式都是這個布局,每個應用程式都是從0x80480000這個位址開始的,這樣衝突嗎?不衝突,因為這個位址是乙個虛擬位址,linux中每個應用程式都有自己的虛擬位址空間。第二行是資料段的記憶體位址範圍。第三行是堆的記憶體位址範圍。最後一...

linux應用程式中的記憶體布局講解

對向高記憶體位址生長,棧想低記憶體位址生長 linux的中所有的應用程式都是這個布局,每個應用程式都是從0x80480000這個位址開始的,這樣衝突嗎?不衝突,因為這個位址是乙個虛擬位址,linux中每個應用程式都有自己的虛擬位址空間。方法 通過檢視應用程式程序中的程序位址對映檔案實現。例如檢視20...

linux應用程式記憶體檢測 pmap

命令格式 pmap root localhost security pmap d 4993 4993 bash 08047000 596 r x 0000000000000000 003 00006 bash bash的 段 080dc000 28 rwx 0000000000094000 003 ...