OS / Linux / 進程的虛擬地址空間佈局

一、佈局圖 

二、說明 

名稱

存儲內容

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!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章