這張圖很好,注意其中最上面是高位位址,雖然很多個0,但是c開頭的,不要看反了:
更具體的可以看這裡:
a.正文段。這是由cpu執行的機器指令部分。通常,正文段是可共享的,所以即使是經常執行的程式(如文字編輯程式、c編譯程式、shell等)在儲存器中也只需要有乙個副本,另外,正文段常常是唯讀的,以防止程式由於意外事故而修改器自身的指令。
b.初始化資料段。通常將此段稱為資料段,它包含了程式中需賦初值的變數。例如,c程式中任何函式之外的說明:
int maxcount = 99;(全域性變數)
c.非初始化資料段。通常將此段稱為bss段,這一名稱**於早期匯程式設計序的乙個操作,意思是"block started by symbol",在程式開始執行之前,核心將此段初始化為0。函式外的說明:
long sum[1000];
使此變數存放在非初始化資料段中。
d.堆。通常在堆中進行動態儲存分配。由於歷史上形成的慣例,堆位於非初始化資料段頂和棧底之間。
e.棧。自動變數以及每次函式呼叫時所需儲存的資訊都存放在此段中。每次函式呼叫時,其返回位址、以及呼叫者的環境資訊(例如某些機器暫存器)都存放在棧中。然後,新被呼叫的函式在棧上為其自動和臨時變數分配儲存空間。通過以這種方式使用棧,c函式可以遞迴呼叫。
實際上,函式是一層層往下走的:
(1)esp:棧指標暫存器(extended stack pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的棧頂。
(2)ebp:基址指標暫存器(extended base pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的底部。
【本次重點內容:了解幾個常見的暫存器名字,記住eax一般用來儲存函式的返回值,記住esp是棧頂指標暫存器,ebp是棧底指標暫存器。】
esp 中的指標將一直指向這個新位置, 所以 esp 中的位址資料是動態的.
有了異常處理 seh structured error handler之後的棧布局變成這樣:
linux系統程序的記憶體布局
文章 記憶體管理模組是作業系統的心臟 它對應用程式和系統管理非常重要。今後的幾篇文章中,我將著眼於實際的記憶體問題,但也不避諱其中的技術內幕。由於不少概念是通用的,所以文中大部分例子取自32位x86平台的linux和windows系統。本系列第一篇文章講述應用程式的記憶體布局。在多工作業系統中的每乙...
Linux程序映象的記憶體布局
作業系統的程序記憶體分為5個區,區 資料區 bss區 堆區 棧區,更高層就是命令列引數和環境變數表,程序的核心空間與使用者空間分別對應不同的記憶體區。全域性常量 區 static const int static cons global 3 全域性靜態常量 區 int init global 2 全...
linux 程序在記憶體中的布局
先從 linux平台下 虛擬記憶體管理說起,寫c程式時,我們經常會列印乙個指標位址,說這個指標指向某某記憶體位址.可這些位址是真實物理記憶體位址嗎?不是 這些只是虛擬記憶體位址.當乙個c程式調入記憶體開始執行後,在記憶體中就會產生乙個程序.而在多工作業系統中每個程序都擁有一片屬於自己的記憶體空間 記...