Linux程序映象的記憶體布局

2021-10-24 03:49:57 字數 1659 閱讀 8225

作業系統的程序記憶體分為5個區,**區、資料區、bss區、堆區、棧區,更高層就是命令列引數和環境變數表,程序的核心空間與使用者空間分別對應不同的記憶體區。

// 全域性常量 (**區)

static

const

int static_cons_global =3;

//全域性靜態常量 (**區)

int init_global =2;

//全域性變數 (資料區)

int not_init;

//未初始全域性變數 (bbs區)

intmain

(int argc,

char

*ar**,

char

*evms)

編譯執行後如下:

------------------命令列、環境變數表------------------

命令列環境變數表: 0x7ffeeb1f97a8

環境變數表: 0x7ffeeb1f97a8

------------------棧區------------------

區域性常量: 0x7ffeeb1f9754

區域性變數: 0x7ffeeb1f9750

------------------堆區------------------

動態分配記憶體: 0x7fbabf604100

------------------bbs區------------------

未初始全域性變數: 0x104a08024

未初始化靜態區域性變數: 0x104a08020

------------------資料區------------------

全域性變數: 0x104a08018

靜態區域性變數: 0x104a0801c

------------------**區------------------

全域性常量: 0x104a06cd8

全域性靜態常量: 0x104a06ce0

函式: 0x104a06ac0

字面量: 0x104a06ce4

從列印出來的位址可以看出從低到高的變化,**區的位址是最小的(最底部),命令列引數的位址是最大的(最高的)。從位址來看bbs區距離堆區,以及堆區到棧區的中間隔了好幾個數量級,是因為應用程式堆記憶體的資料動態分配的,資料儲存也是最多的,所以從位址上面跨度大能指向足夠多的資料。

如果要檢視某個執行檔案的分割槽大小可以使用size命令

darrius:tue sep 01 02:23:04:c_test$ size vmlayout

text data bss dec hex filename

2891 639 28 3558 de6 vmlayout

Linux程序的記憶體布局

這張圖很好,注意其中最上面是高位位址,雖然很多個0,但是c開頭的,不要看反了 更具體的可以看這裡 a.正文段。這是由cpu執行的機器指令部分。通常,正文段是可共享的,所以即使是經常執行的程式 如文字編輯程式 c編譯程式 shell等 在儲存器中也只需要有乙個副本,另外,正文段常常是唯讀的,以防止程式...

linux系統程序的記憶體布局

文章 記憶體管理模組是作業系統的心臟 它對應用程式和系統管理非常重要。今後的幾篇文章中,我將著眼於實際的記憶體問題,但也不避諱其中的技術內幕。由於不少概念是通用的,所以文中大部分例子取自32位x86平台的linux和windows系統。本系列第一篇文章講述應用程式的記憶體布局。在多工作業系統中的每乙...

linux 程序在記憶體中的布局

先從 linux平台下 虛擬記憶體管理說起,寫c程式時,我們經常會列印乙個指標位址,說這個指標指向某某記憶體位址.可這些位址是真實物理記憶體位址嗎?不是 這些只是虛擬記憶體位址.當乙個c程式調入記憶體開始執行後,在記憶體中就會產生乙個程序.而在多工作業系統中每個程序都擁有一片屬於自己的記憶體空間 記...