Linux 1 4 應用程式位址布局

2021-07-03 07:45:13 字數 2481 閱讀 1202

(1)記憶體組成

(2)記憶體布局

linux所有應用程式都是從0x80480000開始,

其中0x80480000是乙個虛擬位址

1)下面來測試一下應用程式的位址分布

#include

#include

int global_init_a=1;//全域性的,初始化的變數 : 資料段

int global_uninit_a;//全域性的,沒有初始化的變數 : 資料段

static int static_global_init_a = 1; //全域性的,靜態的,初始化的變數 : 資料段

static int static_global_uninit_a; //全域性的,靜態的,未初始化的變數 : 資料段

const int const_global_a = 1; //全域性的,常量: **段

int global_init_b=1;//全域性的,初始化的變數 : 資料段

int global_uninit_b;//全域性的,沒有初始化的變數 : 資料段

static int static_global_init_b = 1; //全域性的,靜態的,初始化的變數 : 資料段

static int static_global_uninit_b; //全域性的,靜態的,未初始化的變數 : 資料段

const int const_global_b = 1; //全域性的,常量 : **段

int main(void)

2) 編譯並執行程式,這裡不過多介紹

3) 另開起乙個終端

ps -axu 檢視系統所有程序,找到我們剛才執行的程式./addr

cat /proc/程序pid/maps 檢視記憶體分布情況

結果如下:

兩張圖的位址段對比就可以知道程式中的變數在記憶體中如何存放的!

已經將對比的結果寫到程式的注釋中了.

4)

bss段去**了?

1>首先檢視程式的格式 

由此可知應用程式addr是elf屬性的檔案

2> 使用readelf -s addr 來檢視bss的位址段

由此可知bss(未初始化的資料段):

全域性未初始化的變數(靜態的,非靜態的)

區域性未初始化的變數(靜態的)

另一種方法:(就是麻煩點

先判斷出所有變數的分布,再找出未初始化的資料段的變數,即屬於bss段

5)總結:

5. bss段:

全域性未初始化的變數(靜態的,非靜態的)

區域性未初始化的變數(靜態的)

5 Linux應用程式位址布局

5.linux應用程式位址布局 程式構成 在學習linux應用程式開發時,經常會遇到如下概念 段 資料段 bss段 block started by symbol,又名 未初始化資料段 堆 heap 和棧 stack 而這些部分也是構成linux應用程式的重要組成部分。記憶體布局 當linux應用程...

linux應用程式位址布局,王明學learn

linux應用程式位址布局 在學習linux應用程式開發時,經常會遇到如下概念 段 資料段 bss段 block started by symbol,又名 未初始化資料段 堆 heap 和棧 stack 而這些部分也是構成linux應用程式的重要組成部分。一 記憶體布局 2.堆向高記憶體位址生長 3...

第4課 Linux應用程式位址布局

1.應用程式都是由 段,資料段,bss段以及堆空間,棧空間組成。2.布局方式 1 段在最低位址處,一般都是從0x8048000開始,這是虛擬位址,每乙個應用程式都是這樣的 2 資料段緊貼著 段 3 在往上是bss段其實也是一種資料段 4 在往上是堆空間,堆空間是往上增長的 5 定不一般是棧空間,棧空...