方法:通過檢視應用程式程序中的程序位址對映檔案實現。
例如檢視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 ...