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