一、佈局圖
二、說明
名稱 |
存儲內容 |
stack |
局部變量、函數參數、返回地址等。 |
heap |
動態分配的內存。 |
bss |
未初始化 或 初值爲0 的全局變量和靜態局部變量。 |
data |
已初始化 且 初值非0 的全局變量和靜態局部變量。 |
text |
可執行代碼、字符串字面值、只讀變量。 |
reserved | 不可訪問,用於捕捉使用空指針和小整型值指針引用內存的異常情況。 |
Random stack offset Random mmap offset Random brk offset |
意在防止惡意程序。 Linux通過對棧、內存映射段、堆的起始地址加上隨機偏移量來打亂佈局,以免惡意程序通過計算訪問棧、庫函數等地址。 |
mmap | 磁盤上的文件映射到虛擬地址空間中,用於裝載動態共享庫。 |
三、拓展
1、分段的好處。
- 進程運行過程中,代碼指令根據流程依次執行,只需訪問一次(當然跳轉和遞歸可能使代碼執行多次);而數據(數據段和BSS段)通常需要訪問多次,因此單獨開闢空間以方便訪問和節約空間。
- 當程序被裝載後,數據和指令分別映射到兩個虛存區域。數據區對於進程而言可讀寫,而指令區對於進程只讀。兩區的權限可分別設置爲可讀寫和只讀。以防止程序指令被有意或無意地改寫。
- 現代CPU具有極爲強大的緩存(Cache)體系,程序必須儘量提高緩存命中率。指令區和數據區的分離有利於提高程序的局部性。現代CPU一般數據緩存和指令緩存分離,故程序的指令和數據分開存放有利於提高CPU緩存命中率。
- 當系統中運行多個該程序的副本時,其指令相同,故內存中只須保存一份該程序的指令部分。若系統中運行數百進程,通過共享指令將節省大量空間(尤其對於有動態鏈接的系統)。其他只讀數據如程序裏的圖標、圖片、文本等資源也可共享。而每個副本進程的數據區域不同,它們是進程私有的。
- 臨時數據及需要再次使用的代碼在運行時放入棧區中,生命週期短。全局數據和靜態數據可能在整個程序執行過程中都需要訪問,因此單獨存儲管理。堆區由用戶自由分配,以便管理。
(SAW:Game Over!)