可執行程式的記憶體分布總結

2021-04-21 21:36:33 字數 1263 閱讀 1427

原來一直對於可執行程式的記憶體分布很迷惑,最近查了好多資料以及請教了諸多高手,方有一些領悟,現將自己領悟的寫下來,以供大家批評指正。

在作業系統中,乙個

程序就是處於執行期的程式(當然包括系統資源),

實際上正在

執行的程

序**的活標本。那麼程序的邏輯位址空間是如何劃分的呢?

圖1做了簡單的說明(linux系統下的):

圖1

左邊的是

unix/linux

系統的執行檔案,右邊是對應程序邏輯位址空間的劃分情況。

首先是堆疊區(stack)

,堆疊是由編譯器自動分配釋放

,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。棧的申請是由

系統自動分配,如在函式內部申請乙個區域性變數

int h

,同時判別

所申請空間是否小於棧的剩餘空間,如若小於的話,

在堆疊中為其開闢空間,

為程式提供記憶體,否則將報異常提示棧溢位。

其次是堆

(heap)

,堆一般由程式設計師分配釋放,

若程式設計師不釋放,程式結束時可能由

os**

。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。堆的申請是由程式設計師自己來操作的,在

c中使用

malloc

函式,而

c++中使用

new運算子,但是堆的申請過程比較複雜:當系統收到程式的申請時,會遍歷記錄空閒記憶體位址的鍊錶,以求尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式,此處應該注意的是有些情況下,新申請的記憶體塊的首位址記錄本次分配的記憶體塊大小,這樣在

delete

尤其是delete

時就能正確的釋放記憶體空間。

接著是全域性資料區

(靜態區

)(static)

,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,

未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。

另外文字常量區

,常量字串就是放在這裡,

程式結束後有系統釋放。

最後是程式**區

,放著函式體的二進位制**。

舉例說明一下

://main.cpp 

...........

int a = 0; 

//全域性初始化區

char *p1; 

//全域性未初始化區

int main() 

python 執行可執行程式

python do exe.pyw coding utf 8 import os exe dir c program files q dir exe file q dir.exe def do cmd dir,file if os.access dir,os.f ok os.chdir dir if...

Android可執行程式

最近應用了android kernel下高通的乙個security patch,各種方式出log,也沒有走到patch處。通過網上查詢,看到有人寫了個main函式,呼叫此patch所在的module。但是建立出執行檔案,push到某家手機的 system bin下,告訴是唯讀檔案系統,不能push進...

可執行程式的組成

上一節分析了c語言應用程式中各段的情況,實際的c語言可執行程式,將由各個檔案經過連線生成。目標檔案是由每乙個c語言源程式 c 經過編譯器生成,目標檔案 o 的主要組成部分即 段 唯讀資料段和讀寫資料段三個段。未初始化資料段 堆和棧不會占用目標檔案的空間。可執行程式是由各個目標檔案經過連線而成。其主體...