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