Linux 應用程式的位址空間分布

2021-07-06 04:29:08 字數 1570 閱讀 2415

linux 應用程式在被核心調入記憶體中執行後就成為乙個程序,因此分析應用程式的位址空間實際上就是分析程序的位址空間分布。

應用程式的位址空間實際上由以下幾個部分組成:**段、初始化資料段、未初始化資料段(bss段)、堆、棧。其在記憶體中的分布如下:

apue給出了各個段所包含內容的詳細介紹,這裡筆者用乙個比較直觀的方法驗證各個段所包含的內容。

方法的思路是:編寫乙個含有各種資料的c程式,程式中列印出各個變數的位址,編譯好以後讓其在linux中執行起來,接著通過檢視程序的各個段的資訊,進而得到,把列印出來的變數位址與程序各個段的位址區間比較,可以得出變數處在哪個段中。

下面是測試程式:

#include #include int global_init_a = 1; //全域性、初始化

int global_uninit_a; //全域性、未初始化

static int global_static_init_a = 2; //全域性、靜態、初始化

static int global_static_uninit_a; //全域性、靜態、未初始化

const global_const_a = 3; //全域性、唯讀變數

int main(int argc, char *argv)

將**執行起來,得到如下資訊:

圖 1

另開乙個終端,輸入命令: ps aux  、cat  /proc/17709/maps  檢視程序資訊如下:

圖  2

從圖 2 中可以看出各個段的區間為:

**段:0x08048000 -- 0x08049000

資料段:0x08049000 -- 0x0804a000

堆(heap):0x094f3000 -- 0x09514000

棧(stack):0xbfd8f000 --  0xbfda4000

1.**段:**,全域性常量(const)、字串常量

2.資料段:全域性變數(初始化以及未初始化的)、靜態

變數(全域性的和區域性的、初始化的以及未初始化的)

3.堆:動態分配的區域

4.棧:區域性變數(初始化以及未初始化的,但不包含靜

態變數)、區域性唯讀變數(const

找到 .bss段,再將變數的位址帶入,就可以看出哪種變數是存放在bss段的。

Linux應用程式位址分布

1 記憶體組成 2 記憶體布局 linux所有應用程式都是從0x80480000開始,其中0x80480000是乙個虛擬位址 1 下面來測試一下應用程式的位址分布 include include int global init a 1 全域性的,初始化的變數 資料段 int global unini...

Linux 1 4 應用程式位址布局

1 記憶體組成 2 記憶體布局 linux所有應用程式都是從0x80480000開始,其中0x80480000是乙個虛擬位址 1 下面來測試一下應用程式的位址分布 include include int global init a 1 全域性的,初始化的變數 資料段 int global unini...

5 Linux應用程式位址布局

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