在1個操作系統(tǒng)中,不同的進(jìn)程之間都是同享cpu和主存資源的,但是,同享主存會產(chǎn)生1些意想不到的結(jié)果,例如當(dāng)前進(jìn)程有可能不謹(jǐn)慎寫了其它進(jìn)程的內(nèi)存。
為了更加有效管理內(nèi)存并且少出錯,便引入了1種對主存抽象的概念,稱為虛擬內(nèi)存(VM)。它將主存看成是1個存儲在磁盤上的地址空間的高速緩存;并且為每一個進(jìn)程提供了1致的進(jìn)程地址空間,從而簡化了進(jìn)程的內(nèi)存管理,保護(hù)了每一個進(jìn)程的地址空間不被其他進(jìn)程的地址空間所破壞。
物理地址就是cpu履行加在指令時(shí)會生成1個有效的物理地址,通過內(nèi)存總線,將其傳遞到主存,并從主存中取出數(shù)據(jù),返回給cpu的進(jìn)程。
虛擬尋址相對物理尋址,首先cpu產(chǎn)生的是1個虛擬地址,虛擬地址會經(jīng)過MMU地址翻譯后產(chǎn)生相應(yīng)的物理地址,從而再通過物理尋址來取出數(shù)據(jù),返回給cpu。
虛擬尋址相對物理尋址的好處是可以免訪問到主存中不存在的內(nèi)存,由于它可以在地址翻譯時(shí)就對虛擬地址進(jìn)行檢查,檢查其是不是有效,并且物理尋址必須依照順序來訪問,而且在虛擬尋址中,當(dāng)物理內(nèi)存不夠用時(shí)系統(tǒng)自動從硬盤空間劃分1些容量出來當(dāng)作虛擬內(nèi)存使用。
前面我們知道了虛擬內(nèi)存是1個自由寄存的磁盤上的單元,當(dāng)虛擬內(nèi)存作為物理內(nèi)存的緩沖工具時(shí),系統(tǒng)通過將虛擬內(nèi)存分割為虛擬頁,物理內(nèi)存分割為物理頁,通過將虛擬頁緩存到物理內(nèi)存中可以彌補(bǔ)物理內(nèi)存大小的不足;1定程度的提高反應(yīng)速度;減少對物理內(nèi)存的讀取從而保護(hù)內(nèi)存延長內(nèi)存使用壽命。
緩存需要引入1個具有某種方法來判定1個虛擬頁是不是緩存在DRAM中的某個地方。如果是,還必須肯定這個虛擬頁寄存在哪一個物理頁中,還需要能處理缺頁等現(xiàn)象。因而引入了頁表,它寄存在物理內(nèi)存中,和MMU中的地址翻譯硬件1起來管理內(nèi)存單元;頁表需要將虛擬頁映照到物理頁,每次翻譯硬件將1個虛擬地址轉(zhuǎn)換為物理地址時(shí),都會讀取頁表。
頁表的基本結(jié)構(gòu)以下:
頁命中表示的是1個進(jìn)程,當(dāng)通過虛擬地址查找到頁表中的相干頁面時(shí),設(shè)置了有效位,此時(shí)就會產(chǎn)生頁命中,地址翻譯硬件將虛擬地址作為1個索引在頁表中定位,通過拿到頁表的物理頁號中的內(nèi)容,從而在內(nèi)存中讀取它。
缺頁就是DRAM緩存不命中這個進(jìn)程,下圖展現(xiàn)了頁表如何處理缺頁。
地址翻譯是將虛擬地址空間轉(zhuǎn)換成物理地址空間的映照關(guān)系,首先我們來介紹1下地址翻譯中的虛擬地址的結(jié)構(gòu):
由上圖可知,虛擬n為的虛擬地址中包括了p位的虛擬頁偏移量vpo,和n-p位的虛擬頁號vpn,地址翻譯進(jìn)程中,通過將虛擬地址中的獲得虛擬頁號vpn,從而在頁表中定義到相干頁面,取出來的物理頁號ppn和虛擬頁偏移量進(jìn)行合并便構(gòu)成了物理地址。
全部進(jìn)程以下,下圖介紹了TLB加速地址翻譯,它對普通的地址翻譯進(jìn)行了優(yōu)化,可以看看圖中的虛擬地址的構(gòu)成:
得到了物理地址后便會根據(jù)物理地址正在高速緩存中讀取相應(yīng)的塊如果命中便會將相應(yīng)的數(shù)據(jù)返回給cpu,如果沒有命中就會產(chǎn)生缺頁,內(nèi)核會調(diào)用缺頁異常處理程序并調(diào)入適合的頁面重新加載有關(guān)引發(fā)缺頁的指令。
虛擬內(nèi)存是真實(shí)的存在在硬盤當(dāng)中的,它使每一個進(jìn)程都能有自己獨(dú)立的地址空間,避免正在履行的進(jìn)程對其他進(jìn)程的地址空間進(jìn)行寫入操作,同時(shí)虛擬內(nèi)存經(jīng)常使用來作為主存的緩存,作為內(nèi)存管理和內(nèi)存保護(hù)工具,另外,有時(shí)候需要某種方法來檢測虛擬地址的合法性,便引入了頁表,它通過相干機(jī)制優(yōu)化了虛擬內(nèi)存,使虛擬內(nèi)存更加高效。后面還會介紹虛擬內(nèi)存的有關(guān)知識,希望能夠延續(xù)關(guān)注。