對向高記憶體位址生長,棧想低記憶體位址生長
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...