读懂操作系统之虚拟内存(一)
由于個(gè)人對虛擬內(nèi)存這塊特別感興趣,所以就直接暫且跳過其他,接下來將通過幾篇文章進(jìn)行詳細(xì)講解,當(dāng)然其他基礎(chǔ)內(nèi)容后續(xù)在我進(jìn)行相應(yīng)整體學(xué)習(xí)后也會同步輸出文章,比如操作系統(tǒng)概念、程序鏈接、進(jìn)程管理、頁面置換算法、流水線、浮點(diǎn)指令、內(nèi)存管理、磁盤管理等內(nèi)容。不管周遭的環(huán)境如何,畢竟還很菜,堅(jiān)持每天讓自己進(jìn)步一點(diǎn)點(diǎn),放下暫時(shí)的焦慮,不如專注于眼前的學(xué)習(xí),跟著我一起學(xué)習(xí)操作系統(tǒng)吧。
虛擬存儲器設(shè)計(jì)初衷
緩存從高到低,主存可作為磁盤的緩存,我們將這項(xiàng)技術(shù)稱作為虛擬存儲器,基于歷史觀點(diǎn),構(gòu)造虛擬存儲器的主要出于兩個(gè)目的,其一是允許云計(jì)算在多個(gè)虛擬機(jī)之間有效而安全的共享存儲器,其二則是受限的主存容量對程序設(shè)計(jì)所造成的極大影響。
有了虛擬存儲器這樣可確保每個(gè)程序只能對劃分給它的那部分主存進(jìn)行讀寫操作,而主存只需存放程序中的活躍區(qū)域。虛擬存儲器實(shí)現(xiàn)程序地址空間到物理地址的轉(zhuǎn)換,通過這種轉(zhuǎn)換處理加強(qiáng)了各個(gè)程序地址之間的保護(hù)。若用戶加載多個(gè)程序直接到主存,很顯然最終可能會超過主存的容量,如此一來,將程序進(jìn)行卸載或轉(zhuǎn)入成為程序員不可推卸的責(zé)任,加重了程序員的負(fù)擔(dān),那么怎樣才能將程序員從這種情況中解放出來呢?現(xiàn)代操作系統(tǒng)將主存提供了一種對主存的抽象概念,叫作虛擬內(nèi)存,虛擬內(nèi)存是硬件異常,硬件地址翻譯、主存、磁盤文件和內(nèi)核軟件的完美交互,虛擬內(nèi)存主要提供了三種能力:
(1)將主存看成是一個(gè)存儲在磁盤上的地址空間的高速緩存(作為緩存)
(2)為每個(gè)進(jìn)程提供一致的地址空間,從而簡化內(nèi)存管理(作為內(nèi)存管理)
(3)防止每個(gè)進(jìn)程的地址空間被其他進(jìn)程所破壞(作為內(nèi)存保護(hù))。
映射原理:CPU生成一個(gè)虛擬地址(Virtual Address簡稱VA)來訪問主存,但是在此之前需要將虛擬地址轉(zhuǎn)換為物理地址,這個(gè)過程稱作為地址轉(zhuǎn)換或地址映射或地址翻譯,為進(jìn)行此操作需要CPU硬件和操作系統(tǒng)合作,通過內(nèi)存管理單元(Memory Management Unit)上的地址翻譯硬件,利用存儲在主存上的查詢表來翻譯虛擬地址,該表的內(nèi)容由操作系統(tǒng)管理。
地址翻譯
虛擬內(nèi)存系統(tǒng)將虛擬內(nèi)存劃分為固定大小的塊,這個(gè)塊我們稱作為虛擬頁(Virtual Page簡稱VP),同理將物理內(nèi)存劃分為物理頁(Physical Page簡稱PP),也叫頁幀(Page Frame)。這里我們需要明白虛擬地址、虛擬頁、物理地址、物理頁這四者之間的聯(lián)系。如下圖,通過CPU產(chǎn)生虛擬地址訪問主存的物理地址,而虛擬存儲器和物理存儲器分別被劃分成虛擬頁和物理頁,所以結(jié)果變成將虛擬頁映射到物理頁。
在虛擬存儲器中,地址被劃分為虛頁號(Virtual Page Number簡稱VPN)和虛擬頁頁偏移(Virtual Page Offset簡稱VPO),如下為從虛擬頁到物理頁號(Physical Page Number簡稱PPN)的轉(zhuǎn)換。物理頁構(gòu)成物理地址的高位部分,而頁偏移保持不變,構(gòu)成物理地址的低位部分。頁偏移的位數(shù)決定了頁的大小,當(dāng)然,虛擬頁地址可尋址的頁數(shù)與物理地址可尋址的頁數(shù)可以不同。
例如具有32位邏輯地址的操作系統(tǒng),如果每個(gè)頁面的大小為4KB,由于上述物理頁號有18位,那么存儲器物理頁數(shù)為2^18,因此,邏輯上最多可以支持1GB的主存,但是實(shí)際上虛擬地址空間可支持4GB,如此為解決主存的受限控制。
和緩存機(jī)制一樣,我們必須有某種機(jī)制來判斷一個(gè)虛擬頁是否緩存在DRAM中某一個(gè)地方,如果是,那么系統(tǒng)必須確定這個(gè)虛擬頁存放在哪個(gè)物理頁中,如果未命中,系統(tǒng)必須確定這個(gè)虛擬頁存儲在磁盤的哪個(gè)位置,然后在物理內(nèi)存中選擇一個(gè)犧牲頁,并將虛擬頁從磁盤復(fù)制到DRAM中,然后替換這個(gè)犧牲頁。
此功能由軟硬件共同提供,包括操作系統(tǒng)軟件、MMU中的地址翻譯硬件、存放在物理內(nèi)存中的頁表(Page Table簡稱PT)所決定,上述將虛擬頁映射到物理頁就是通過查詢頁表實(shí)現(xiàn),一個(gè)頁表是由頁表?xiàng)l目(Page Table Entry簡稱PTE)的數(shù)組組成。如下為頁表簡要信息版本:
我們看到上述每個(gè)PTE是由一個(gè)有效位和一個(gè)包含物理頁號或磁盤地址組成,有效位標(biāo)識虛擬頁是否被緩存在主存中, 若為1則說明該虛擬頁已被緩存在主存中,若為0分為兩種情況,可能是虛擬內(nèi)存未創(chuàng)建虛擬頁,也有可能是已創(chuàng)建虛擬頁但還未緩存到主存,所以虛擬頁集合由3個(gè)子集組成:
(1)虛擬內(nèi)存系統(tǒng)還未分配或未創(chuàng)建
(2)已緩存在物理內(nèi)存中的已分配頁
(3)未緩存在物理內(nèi)存中的已分配頁
頁表在主存中的位置由硬件決定,硬件包含一個(gè)指向頁表首地址的頁表基址寄存器(Page Table Base Register簡稱PTBR)。簡要翻譯過程如下圖所示
我們進(jìn)一步得出MMU將虛擬地址映射為物理地址的詳細(xì)過程:CPU產(chǎn)生虛擬地址,然后從虛擬地址中得到虛擬頁號,接下來通過將虛擬頁號作為索引去查找頁表,通過得到對應(yīng)PTE上的有效位來判斷當(dāng)前虛擬頁是否在主存中,若命中則將對應(yīng)PTE上的物理頁號和虛擬地址中的虛擬頁偏移進(jìn)行串聯(lián)從而構(gòu)造出主存中的物理地址,否則未命中(專業(yè)名詞稱為“缺頁”),此時(shí)MMU將引發(fā)缺頁異常,從CPU傳遞到操作系統(tǒng)內(nèi)核處理缺頁異常處理程序,此時(shí)將選擇一個(gè)犧牲頁并將對應(yīng)所缺虛擬頁調(diào)入并更新頁表上的PTE,缺頁處理程序再次返回到原來的進(jìn)程,再次執(zhí)行缺頁指令,CPU重新將虛擬地址發(fā)給MMU,此時(shí)虛擬頁已存在物理內(nèi)存中,所以命中,最終將請求的字返回給處理器。詳細(xì)過程如下:
進(jìn)程的地址空間以及它在主存中可以訪問的所有數(shù)據(jù),都由駐存在主存中的頁表所定義,操作系統(tǒng)只是簡單的加載頁表寄存器用來指向它所想激活的進(jìn)程頁表,而不是保存整個(gè)頁表。
由于不同進(jìn)程使用相同的虛擬地址,因此每個(gè)進(jìn)程有各自的頁表,操作系統(tǒng)負(fù)責(zé)分配物理主存和更新頁表,因?yàn)槲覀兺ㄟ^將頁表分離來保護(hù)進(jìn)程,進(jìn)而保證不同進(jìn)程的虛擬地址空間不會發(fā)生任何沖突。上述我們已經(jīng)得知,一個(gè)32位邏輯地址空間的系統(tǒng),每個(gè)頁面的大小為4KB(2^12),那么頁表將包含(2^32/2^12)= 大約100萬個(gè)頁表?xiàng)l目即PTE,假設(shè)每個(gè)條目占4個(gè)字節(jié),那么每個(gè)進(jìn)程的頁表將占用(4*(2^32/2^12))= 4MB的內(nèi)存。
TLB加快地址翻譯
我們知道每次CPU產(chǎn)生一個(gè)虛擬地址就必須通過MMU去查詢頁表從而得到PTE,但是頁表存儲在主存中,因此程序訪存至少需要兩次:第一次訪存獲取物理地址、第二次訪存獲得數(shù)據(jù)。
提高訪問性能的關(guān)鍵在于依靠頁表的訪問局部性,當(dāng)一個(gè)轉(zhuǎn)換的虛擬頁號被使用時(shí),它可能在不久的將來會被再次用到,因?yàn)閷υ擁撝凶值囊猛瑫r(shí)具有時(shí)間局部性和空間局部性。
為了消除這樣的開銷,在MMU中包括一個(gè)關(guān)于PTE的小的緩存,稱為翻譯后備緩沖器(Translation-Lookasice Buffer簡稱TLB),有些書中被稱為快表,所以TLB存在的目的是:用于記錄最近使用地址的映射信息的高速緩存,從而可以避免每次都訪問頁表。TLB是一個(gè)小的、虛擬尋址的緩存,其中每一行都保存著一個(gè)由單個(gè)PTE組成的塊,TLB大概包含64-1024個(gè)PTE。如下圖所示
從虛擬頁號中提取出用于組選擇和行匹配的索引和標(biāo)記字段,如果TLB有 T= 2^t個(gè)組,那么TLB索引(TLBI)是由VPN的t個(gè)最低位組成,而TLB標(biāo)記(TLBT)是由VPN中剩余的位組成。上述我們了解到虛擬地址由虛擬頁號和虛擬頁偏移量組成,在這里再進(jìn)行補(bǔ)充:虛擬地址由虛擬頁號(VPN)、虛擬頁偏移量(VPO)、TLBI(TLB索引)、TLBT(TLB標(biāo)記)組成,對于物理地址由物理頁號(PPN)、物理頁偏移量(PPO)、緩沖塊內(nèi)的字節(jié)偏移量(CO)、高速緩存索引(CI)、高速緩存標(biāo)記(CT)組成。
那么利用TLB加快地址翻譯的整個(gè)大概過程是怎樣的呢?CPU產(chǎn)生一個(gè)虛擬地址,MMU從虛擬地址中提取出虛擬頁號,然后從TLB中根據(jù)虛擬頁號取出相應(yīng)的PTE,進(jìn)而通過物理頁號和虛擬頁偏移構(gòu)造出物理地址,將其發(fā)送到高速緩存/主存,高速緩存/主存將返回的數(shù)據(jù)返回給CPU
現(xiàn)代操作系統(tǒng)都已有SRAM的高速緩存(一級緩存、二級緩存、三級緩存)
因?yàn)榈刂贩g硬件發(fā)生在訪問高速緩存之前,所以我們到底是通過虛擬地址還是物理地址訪問高速緩存呢?大多數(shù)都是選擇物理地址訪問高速緩存。整個(gè)過程如下圖:
本節(jié)屬于小試牛刀,只是從整體上去分析虛擬內(nèi)存地址翻譯原理,里面仍涉及太多細(xì)節(jié),比如頁面交換策略、頁表和TLB所包含詳細(xì)內(nèi)容,多級頁表、TLB查找PTE、TLB缺失等,下一節(jié)我們分析TLB缺失和頁面交換具體原理。?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的读懂操作系统之虚拟内存(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Angular SPA基于Ocelot
- 下一篇: 使用 Windows Terminal