Linux虚拟内存和进程虚拟地址空间简述
后臺開發(fā)經(jīng)常會問此類問題,雖說難度不大,但是知道和不知道還是有區(qū)別的。以下的內(nèi)容總結(jié)自《深入理解Linux內(nèi)核》第一章,僅僅是簡述,沒有深入研究,畢竟內(nèi)存管理這一塊內(nèi)容超級多,感興趣的同學(xué)可以去啃啃這本書。
所有新近的Unix系統(tǒng)都提供了一種有用的抽象,叫虛擬內(nèi)存(virtual memory)。虛擬內(nèi)存作為一種邏輯層,處于應(yīng)用程序的內(nèi)存請求與硬件內(nèi)存管理單元(Memory Management Unit, MMU)之間。虛擬內(nèi)存有很多用途和優(yōu)點:
- 若干個進程可以并發(fā)地執(zhí)行。
- 應(yīng)用程序所需內(nèi)存大小大于可用物理內(nèi)存時也可以運行。
- 程序只有部分代碼裝入內(nèi)存時進程也可以執(zhí)行它。
- 允許每個進程訪問可用物理內(nèi)存的子集。
- 進程可以共享庫函數(shù)或程序的一個單獨內(nèi)存映像。
- 程序是可重定位的,也就是說,可以把程序放在物理內(nèi)存的任何地方。
- 程序員可以編寫與機器無關(guān)的代碼,因為他們不必關(guān)心物理內(nèi)存的組織結(jié)構(gòu)。
虛擬內(nèi)存子系統(tǒng)的主要成分是虛擬地址空間(virutal address space)的概念。進程所用的一組內(nèi)存地址不同于物理內(nèi)存地址。當(dāng)進程使用一個虛擬地址時,內(nèi)核和MMU協(xié)同定位其在內(nèi)存中的實際物理位置。
現(xiàn)在的CPU包含了能自動把虛擬地址轉(zhuǎn)換成物理地址的硬件電路。為了達(dá)到這個目標(biāo),把可用RAM劃分成4KB或8KB的頁框(page frame),并且引入一組頁表來指定虛擬地址和物理地址之間的對應(yīng)關(guān)系。這些電路使得內(nèi)存分配變得簡單,因為一塊連續(xù)的虛擬地址請求可以通過分配一組非連續(xù)的物理地址頁框而得到滿足。
2.? ? ? ? 進程虛擬地址空間處理
進程的虛擬地址空間包括了進程可以引用的所有虛擬內(nèi)存地址。內(nèi)核通常用一組內(nèi)存區(qū)描述符(mm_struct)描述進程虛擬地址空間。例如,當(dāng)進程通過exec()類系統(tǒng)調(diào)用開始某個程序的執(zhí)行時,內(nèi)核分配給進程的虛擬地址空間由以下幾個內(nèi)存區(qū)組成:
- 程序的可執(zhí)行代碼。
- 程序的初始化數(shù)據(jù)。
- 程序的未初始化數(shù)據(jù)。
- 初始程序棧(即用戶態(tài)棧)
- 所需共享庫的可執(zhí)行代碼和數(shù)據(jù)(此部分并不實際拷貝,僅僅時映射)
- 堆(由程序動態(tài)請求的內(nèi)存)
所有現(xiàn)代Unix操作系統(tǒng)都采用了所謂請求調(diào)頁(demand paging)的內(nèi)存分配策略。有了請求調(diào)頁,進程可以在它的頁還沒有在內(nèi)存時就開始執(zhí)行。當(dāng)進程訪問一個不存在的頁時,MMU產(chǎn)生一個異常:異常處理程序找到受影響的內(nèi)存區(qū),分配一個空閑的頁,并用適當(dāng)?shù)臄?shù)據(jù)把它初始化。同理,當(dāng)進程通過malloc或者brk系統(tǒng)調(diào)用動態(tài)的請求內(nèi)存時,內(nèi)核僅僅修改進程的堆內(nèi)存區(qū)的大小。只有試圖引用進程的虛擬內(nèi)存地址而產(chǎn)生異常時,才給進程分配頁框。
參考目錄:
1. 《深入理解Linux內(nèi)核》
2. 《Linux設(shè)備驅(qū)動程序》???????
=============================================================================================
Linux應(yīng)用程序、內(nèi)核、驅(qū)動、后臺開發(fā)交流討論群(745510310),感興趣的同學(xué)可以加群討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。
?
?
總結(jié)
以上是生活随笔為你收集整理的Linux虚拟内存和进程虚拟地址空间简述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发生保险事故谁不能索赔
- 下一篇: Linux面试相关 c程序的运行流程