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

2021-12-30 05:46:57 字數 1533 閱讀 6848

對向高記憶體位址生長,棧想低記憶體位址生長

linux的中所有的應用程式都是這個布局,每個應用程式都是從0x80480000這個位址開始的,這樣衝突嗎?不衝突,因為這個位址是乙個虛擬位址,linux中每個應用程式都有自己的虛擬位址空間。

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

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

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

結果如下:

上圖中第一行是**段,因為**段可讀可執行但不可寫,從中也可以看出該程式的起始位址是0x80480000。

第二行是資料段的記憶體位址範圍。

第三行是堆的記憶體位址範圍。

最後一行是棧的記憶體位址範圍。

通過我們的下面來程式分析各種變數在程式中的記憶體位置。

檔名:addr.c

#include

#include

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

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

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

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

int const e = 5; //全域性常量

int main()

程式執行後的結果:

檢視該程式程序的地圖得到該應用程式的記憶體分布如下

通過以上兩幅的比對得出:

**段資料段

a,b,c,d,c,d

堆 m_addr

棧 a,b,e

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

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

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

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

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

使用readelf工具檢視該段位址空間。

readelf -s(可執行程式名)

例如該應用程式:readelf -s addr

檢視結果:

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

bss段:a,c,c

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

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

方法 通過檢視應用程式程序中的程序位址對映檔案實現。例如檢視2053號程序的記憶體布局 命令如下 cat proc 2053 maps 結果如下 通過我們的下面來程式分析各種 變數在程式中的記憶體位置。檔名 addr.c include include int a 全域性未初始化變數 int b 2...

linux應用程式記憶體布局

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

ESP32應用程式的記憶體布局

esp32晶元具有靈活的記憶體對映功能。本節介紹esp idf在預設情況下如何使用這些功能。esp idf中的應用程式 可以放置在以下記憶體區域之一中。esp idf 為指令ram 分配內部sram0 區域的一部分 在技術參考手冊中定義 0x40080000到0x400a0000 用於儲存需要從ra...