作業系統的程序記憶體分為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程式調入記憶體開始執行後,在記憶體中就會產生乙個程序.而在多工作業系統中每個程序都擁有一片屬於自己的記憶體空間 記...