OS / Linux / 进程的虚拟地址空间布局
生活随笔
收集整理的這篇文章主要介紹了
OS / Linux / 进程的虚拟地址空间布局
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、布局圖?
二、說明?
| 名稱 | 存儲內(nèi)容 |
| stack | 局部變量、函數(shù)參數(shù)、返回地址等。 |
| heap | 動態(tài)分配的內(nèi)存。 |
| bss | 未初始化 或 初值為0 的全局變量和靜態(tài)局部變量。 |
| data | 已初始化 且 初值非0 的全局變量和靜態(tài)局部變量。 |
| text | 可執(zhí)行代碼、字符串字面值、只讀變量。 |
| reserved | 不可訪問,用于捕捉使用空指針和小整型值指針引用內(nèi)存的異常情況。 |
| Random stack offset Random mmap offset Random brk offset | 意在防止惡意程序。 Linux通過對棧、內(nèi)存映射段、堆的起始地址加上隨機偏移量來打亂布局,以免惡意程序通過計算訪問棧、庫函數(shù)等地址。 |
| mmap | 磁盤上的文件映射到虛擬地址空間中,用于裝載動態(tài)共享庫。 |
三、拓展
1、分段的好處。
- 進程運行過程中,代碼指令根據(jù)流程依次執(zhí)行,只需訪問一次(當然跳轉(zhuǎn)和遞歸可能使代碼執(zhí)行多次);而數(shù)據(jù)(數(shù)據(jù)段和BSS段)通常需要訪問多次,因此單獨開辟空間以方便訪問和節(jié)約空間。
- 當程序被裝載后,數(shù)據(jù)和指令分別映射到兩個虛存區(qū)域。數(shù)據(jù)區(qū)對于進程而言可讀寫,而指令區(qū)對于進程只讀。兩區(qū)的權(quán)限可分別設(shè)置為可讀寫和只讀。以防止程序指令被有意或無意地改寫。
- 現(xiàn)代CPU具有極為強大的緩存(Cache)體系,程序必須盡量提高緩存命中率。指令區(qū)和數(shù)據(jù)區(qū)的分離有利于提高程序的局部性。現(xiàn)代CPU一般數(shù)據(jù)緩存和指令緩存分離,故程序的指令和數(shù)據(jù)分開存放有利于提高CPU緩存命中率。
- 當系統(tǒng)中運行多個該程序的副本時,其指令相同,故內(nèi)存中只須保存一份該程序的指令部分。若系統(tǒng)中運行數(shù)百進程,通過共享指令將節(jié)省大量空間(尤其對于有動態(tài)鏈接的系統(tǒng))。其他只讀數(shù)據(jù)如程序里的圖標、圖片、文本等資源也可共享。而每個副本進程的數(shù)據(jù)區(qū)域不同,它們是進程私有的。
- 臨時數(shù)據(jù)及需要再次使用的代碼在運行時放入棧區(qū)中,生命周期短。全局數(shù)據(jù)和靜態(tài)數(shù)據(jù)可能在整個程序執(zhí)行過程中都需要訪問,因此單獨存儲管理。堆區(qū)由用戶自由分配,以便管理。
?
參考鏈接:https://www.cnblogs.com/beixiaobei/p/10507462.html
?
(SAW:Game Over!)
總結(jié)
以上是生活随笔為你收集整理的OS / Linux / 进程的虚拟地址空间布局的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java / 常见名词含义
- 下一篇: malloc 两种实现方式:brk 和