概述
堆疊段(stack segment)通常是指採用堆疊方式工作的一段記憶體區域。
當程式被執行時,程式可能會將其執行的狀態加入棧的頂部;當程式結束時,它必須把棧頂的狀態數據彈出(pop)。
堆疊段是在程式運行時動態分配使用,只需要通過棧頂指針即可訪問。
目前大多數CPU中都有專用暫存器可以被用來存放棧頂地址。
堆疊段的作用
在採用段式記憶體管理方式進行程式記憶體分配的架構中,堆疊段用來存放局部變數和函式返回地址。堆疊段是在程式運行時動態分配使用,只需要通過棧頂指針即可訪問。目前大多數CPU中都有專用暫存器可以被用來存放棧頂地址 。
理論上,最小的棧可能是一個僅能保存函式調用(function call)地址的結構,以致被調用的函式能根據該地址返回(return)到原函數裡。除此功能以外,開發者也可以將棧另作他用。
記憶體分配
基於棧的記憶體分配法的另一特點就是,當程式結束時,棧所用的記憶體能夠自動快速地被回收,開發者不用干預,省心省力。如果棧頂的數據需要以某種格式被保存起來,那么在程式結束前,此數據必須被複製到其他位置,不然就會被彈出棧而丟失。因此,基於棧的記憶體分配法適用於那些只需暫時數據的保存情況。
作業系統給執行緒分配的棧可能僅為幾個KB的大小。如果分配的棧記憶體過大,超過了執行緒實際需要,這可能導致棧溢出(stack overflow),以致系統崩潰。
x86處理器系列對執行緒棧的管理有特殊的指令。其他處理器系列(包括PowerPC和MIP)則沒有這種支持。
堆疊段、數據段與代碼段
堆疊段通常是指採用堆疊方式工作的一段記憶體區域。
在採用段式記憶體管理的架構中, 數據段通常是指用來存放程式中已初始化且不為0的全局變數的一塊記憶體區域。數據段屬於靜態記憶體分配。
代碼段通常是指用來存放程式執行代碼的一塊記憶體區域。這部分區域的大小在程式運行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許代碼段為可寫,即允許程式自修改(self-modifying code)。 在代碼段中,也有可能包含一些唯讀的常數變數,例如字元串常量等。
作業系統在裝載一個程式時會進行進程地址空間的分段,而代碼段通常處於最底部,即最低地址部分,而堆和棧在高處,所以在允許代碼段可寫的架構上,當堆或棧記憶體溢出時,代碼段中的數據就會開始被覆蓋。