目前通用系統(Linux或者Window)多采用段頁式內存管理方式,即段式管理與頁式管理的組合。每一個程序的內存空間分爲若干段,進行內存的分配與釋放管理;每一個段又分爲若干頁,進行虛擬頁與實際頁面的映射。段式管理程序以段爲單位分配內存,依賴地址映射機制完成段式虛擬地址與實際內存地址的轉換。段式管理(程序分段思想)在無OS的嵌入式開發和微系統開發中具備普遍的應用。
程序內存通常分爲代碼段、數據段和堆棧段。
代碼段(code/text segment):用來存放執行代碼的一塊內存區域。該區域的大小在程序運行前就已經肯定,而且內存區域屬於只讀。其中可能包含一些只讀的常數變量(如字符串常量)。
數據段(data segment):用來存放數據的一塊內存區域,分紅初始化爲非零的數據區、BSS和堆(Heap)三個區域。初始化非零數據區域通常存放靜態非零數據和全局的非零數據,屬於靜態內存分配;BSS(Block Started by Symbol)區域通常存放未初始化的全局數據和靜態數據,屬於靜態內存分配;堆區域通常存放運行時動態分配的內存空間,其大小不固定,可動態擴張或縮減。當調用malloc等函數分配內存時,新分配的內存被動態添加到堆上;當調用free等函數釋放內存時,被釋放內存從堆中被剔除。
堆棧段(stack segment):亦稱棧,用於存放程序臨時建立的局部變量和函數參數,屬於動態內存分配。
代碼段和數據段之間有明確的分隔,可是數據段和堆棧段之間沒有,並且棧是向下增加,堆是向上增加的,所以理論上堆和棧會「增加到一塊兒」,操做系統的內存管理功能須要防止這樣的錯誤發生。