虛擬地址空間,堆疊,堆,資料段,程式碼段

pengfoo發表於2011-12-17
 

程式的虛擬地址空間,堆疊、堆、資料段、程式碼段

上圖是程式的虛擬地址空間示意圖。

堆疊段:

  1. 為函式內部的區域性變數提供儲存空間。

  2. 進行函式呼叫時,儲存“過程活動記錄”。

  3. 用作暫時儲存區。如計算一個很長的算術表示式時,可以將部分計算結果壓入堆疊。

資料段(靜態儲存區):

  包括BSS段的資料段,BSS段儲存未初始化的全域性變數、靜態變數。資料段儲存經過初始化的全域性和靜態變數。

程式碼段:

  又稱為文字段。儲存可執行檔案的指令。

堆:

  就像堆疊段能夠根據需要自動增長一樣,資料段也有一個物件,用於完成這項工作,這就是堆(heap)。堆區域用來動態分配的儲存,也就是用 malloc 函式活的的記憶體。calloc和realloc和malloc類似。前者返回指標的之前把分配好的記憶體內容都清空為零。後者改變一個指標所指向的記憶體塊的大小,可以擴大和縮小,他經常把記憶體拷貝到別的地方然後將新地址返回。

 

1、棧區(stack):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 

2、堆區(heap):由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回收 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列。 

3、全域性區(靜態區):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 程式結束後由系統釋放。 

4、文字常量區:常量字串就是放在這裡的。 程式結束後由系統釋放。 

 

 

5、程式程式碼區:存放函式體的二進位制程式碼。


另外,可以參考:http://www.kerneltravel.net/kernel-book/%E7%AC%AC%E5%85%AD%E7%AB%A0%20Linux%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/6.4.2.htm

相關文章