虛擬內(nèi)存(Virtual Memory),是計算機系統(tǒng)內(nèi)存管理的一種技術(shù),它使得應(yīng)用程序認(rèn)為它擁有連續(xù)可用的內(nèi)存(一個連續(xù)完整的地址空間),而實際上,它通常被分隔成多個物理內(nèi)存碎片,還有部分暫時存儲在外部磁盤存儲器上,當(dāng)計算機缺少運行某些程序所需的物理內(nèi)存時,操作系統(tǒng)會使用HDD上的虛擬內(nèi)存進行替代。
在虛擬內(nèi)存概念提出前,計算機內(nèi)存管理依靠隨機存取存儲器(RAM)和輔助存儲,面臨程序規(guī)模增長與內(nèi)存成本高昂的挑戰(zhàn)。雖然關(guān)于虛擬內(nèi)存概念的首次提出存在一些爭議,但普遍認(rèn)為是由德國物理學(xué)家弗里茨·魯?shù)婪颉‵ritz-Rudolf Güntsch)于1956年率先提出,曼徹斯特大學(xué)于1959年開發(fā)的Atlas計算機實現(xiàn)了分頁技術(shù),成為早期采用虛擬內(nèi)存技術(shù)的系統(tǒng)之一,而伯勒公司(Burroughs Corp.)隨后于1961年推出了首款商用的虛擬內(nèi)存計算機系統(tǒng)。1982年,英特爾在80286處理器中引入虛擬內(nèi)存技術(shù),并在1985年的80386處理器中提供分頁支持,推動了個人電腦技術(shù)的快速發(fā)展。
虛擬內(nèi)存器的調(diào)度方式包括分頁式、段式和段頁式。影響虛擬內(nèi)存的因素包括設(shè)置虛擬內(nèi)存的大小、存儲位置、內(nèi)存管理單元等,涉及到地址變換、替換算法等重要技術(shù),其具有擴大地址空間、對特定的內(nèi)存地址提供寫保護和公平分配內(nèi)存等優(yōu)點,但同時也存在浪費內(nèi)存、增加指令的執(zhí)行時間等局限性。此外,虛擬內(nèi)存廣泛應(yīng)用在多任務(wù)操作系統(tǒng)、大型應(yīng)用程序等場景中。
發(fā)展歷程
背景
在虛擬內(nèi)存的概念被提出之前,計算機的內(nèi)存管理主要依賴于隨機存取存儲器(RAM)和輔助存儲器。在早期的計算機系統(tǒng)中,磁芯存儲器被用作主存儲器,而磁鼓則作為輔助存儲器使用。然而,在20世紀(jì)40年代和50年代,由于存儲器的價格昂貴且供應(yīng)不足,程序的大小和復(fù)雜性不斷增加使得內(nèi)存管理成為了一個迫切需要解決的問題。
為了解決這個問題,早期程序員通過覆蓋的過程來運行大于可用內(nèi)存的程序,這種技術(shù)將程序中不常使用的部分設(shè)置為可覆蓋狀態(tài),當(dāng)需要運用內(nèi)存時,這些部分可以覆蓋內(nèi)存中已有的內(nèi)容。實施覆蓋需要精細(xì)的編程工作,為了提升效率和簡化操作,開發(fā)自動化虛擬內(nèi)存技術(shù)已成為當(dāng)時主要的內(nèi)存發(fā)展方向。
早期
雖然關(guān)于虛擬內(nèi)存概念的首次提出存在一些爭議,但普遍認(rèn)為是由德國物理學(xué)家弗里茨·魯?shù)婪颉‵ritz-Rudolf Güntsch)于1956年率先提出,盡管他描述的只是一種高速緩存存儲器的形式,但他的研究為虛擬內(nèi)存的發(fā)展奠定了基礎(chǔ)。
曼徹斯特大學(xué)的Atlas計算機是早期實現(xiàn)虛擬內(nèi)存的系統(tǒng)之一,于1959年開發(fā),并于1962年開始使用,其采用了分頁技術(shù),將虛擬地址映射到物理內(nèi)存。
1961年,伯勒公司(Burroughs Corp.)推出了首款商用的虛擬內(nèi)存計算機系統(tǒng),這款計算機采用了分段的方式來管理虛擬內(nèi)存,而非傳統(tǒng)的分頁管理。
1960年代中期,IBM在托馬斯·J·沃森研究中心(Thomas J. Watson Research Center)進行M44/44X計算機研究項目。M44/44X項目基于IBM 7044(M44)實現(xiàn)了多個具有突破性的虛擬化概念,包括部分硬件共享(partial hardware sharing)、時間共享(時間 sharing)、內(nèi)存分頁(memory paging)等,并實現(xiàn)了虛擬內(nèi)存管理的虛擬機監(jiān)視器。通過這些虛擬化技術(shù),應(yīng)用程序可以運行在這些虛擬的內(nèi)存之中,實現(xiàn)了在同一臺主機上模擬出多個7044系統(tǒng)(44X)。M44/44X項目首次使用了虛擬機(Virtual Machine,VM)和虛擬機監(jiān)視器(Virtual Machine 監(jiān)聽,VMM)一詞,被認(rèn)為是世界上第一個支持虛擬機的系統(tǒng)。
1969年,隨著IBM相關(guān)人員的研究,證明了虛擬內(nèi)存覆蓋系統(tǒng)相較于早期手動系統(tǒng)具有更高的效率,虛擬內(nèi)存技術(shù)開始逐漸得到廣泛的認(rèn)可和應(yīng)用。隨著時間的推移,虛擬內(nèi)存技術(shù)逐漸成為了大型計算機和小型計算機的標(biāo)配。
發(fā)展
1982年,英特爾在80286處理器保護模式下引入了虛擬內(nèi)存技術(shù),并在1985年為80386的推出提供了分頁支持,帶動了個人電腦技術(shù)的快速發(fā)展。
2000年,作為真正意義上的第一個功能完整的操作系統(tǒng)虛擬化技術(shù),FreeBSD jail得到迅速發(fā)展。利用這個技術(shù),FreeBSD的系統(tǒng)管理者可以創(chuàng)造出幾個小型的軟件系統(tǒng),這些軟件系統(tǒng)被稱為監(jiān)獄(jails)。
2004年,微軟發(fā)布Virtual Server 2005計劃,象征著虛擬化技術(shù)正式進入主流市場。
2010年10月21日,美國航空航天局發(fā)布了云操作系統(tǒng)OpenStack,推動了云計算在中國的全面爆發(fā)。2011年5月,IBM和Red Hat,聯(lián)合惠普和英特爾一起,成立了開放虛擬化聯(lián)盟(Open Virtualization Alliance)。
工作原理
在啟用虛擬內(nèi)存時,每個程序都有不同的虛擬內(nèi)存空間,可以自由訪問預(yù)先定好的內(nèi)存地址,而實際保存在物理內(nèi)存的地址則交給內(nèi)存管理單元管理。虛擬內(nèi)存中的內(nèi)容不僅可以保存在物理內(nèi)存中,而且可以保存在HDD中,也就是所謂的分頁文件(Swap)。當(dāng)物理內(nèi)存不足時,操作系統(tǒng)可以把一部分內(nèi)容轉(zhuǎn)移到硬盤上的虛擬內(nèi)存文件,下次使用到該部分內(nèi)容時再從虛擬內(nèi)存文件轉(zhuǎn)移回物理內(nèi)存。
程序A發(fā)出了“寫入4字節(jié)到內(nèi)存地址0x1020”的指令,CPU實際上可能在物理內(nèi)存地址0x2020處進行寫入操作;而當(dāng)程序B執(zhí)行相同的“寫入4字節(jié)到內(nèi)存地址0x1020”的指令時,CPU可能選擇在物理內(nèi)存地址0x4020處進行寫入。這樣,雖然程序A和程序B使用的是相同的虛擬內(nèi)存地址,但實際的物理內(nèi)存地址不同,因此它們的操作不會互相影響。
關(guān)鍵技術(shù)
地址變換
地址變換是邏輯地址到物理地址的變換。一般情況下,一個作業(yè)在裝入內(nèi)存時分配到的存儲空間和它的地址空間是不一致的。因此,作業(yè)在CPU上運行時,其所要訪問的指令和數(shù)據(jù)的物理地址與地址空間中的邏輯地址是不同的。如果在作業(yè)裝入內(nèi)存或者在它運行時不對相關(guān)地址加以修改就會導(dǎo)致錯誤的結(jié)果。這種由于一個作業(yè)裝入與其地址空間不一致的存儲空間所引起的對有關(guān)地址部分的調(diào)整,就是地址變換,又稱為地址重定位。這種地址變換的過程也稱為地址映射。地址變換的目的,是消除在高級尋址方式中程序地址與物理地址的語義差距,使程序能夠在任意位置的物理內(nèi)存中運行,而不必關(guān)心其物理位置。
替換算法
替換策略在任何一個調(diào)頁系統(tǒng)中都很重要。在為調(diào)頁系統(tǒng)設(shè)計替換策略時,可以選擇很多種算法。頁面替換算法通常從實際程序執(zhí)行過程中收集引用串,評估算法對引用串產(chǎn)生的效果來衡量,同時也可以對算法采用形式化分析,但是除非對執(zhí)行環(huán)境增加很多限制條件,否則這種分析很困難。衡量頁面替換算法效率最常用的指標(biāo)是缺頁率。常用的替換算法包括以下四種:
隨機算法
隨機(Random)算法是指通過算法從服務(wù)器列表中隨機選取一臺服務(wù)器進行訪問。結(jié)合概率論的相關(guān)知識可知隨著客戶端調(diào)用服務(wù)器端的次數(shù)增多,其實際效果趨近于平均分配請求到服務(wù)器端的每一臺服務(wù)器,即達(dá)到輪詢的效果。算法描述如下:
假設(shè)有N臺服務(wù)器S=|S0,S1,S2.…,Sn|,算法可以描述為通過隨機函數(shù)生成0~N之間的任意整數(shù),將該數(shù)字作為索引,從S中獲取對應(yīng)的服務(wù)器。假定現(xiàn)在有4臺服務(wù)器初始化服務(wù)列表后,每臺服務(wù)器對應(yīng)一個地址,地址分別有相應(yīng)的權(quán)重,見下表。
隨機算法與服務(wù)器權(quán)重沒有關(guān)系,每個服務(wù)器會被隨機地訪問到。由概率論可以得知,當(dāng)樣本量足夠大時,每臺服務(wù)器被訪問到的概率近似相等,隨機算法的效果就越趨近于輪詢調(diào)度算法,將請求隨機分配到各節(jié)點。隨著客戶端調(diào)用服務(wù)端的次數(shù)增多,其實際效果越來越接近于平均分配,也就是輪詢的結(jié)果。
先進先出算法
先進先出(FIFO)算法根據(jù)塊在內(nèi)存(緩存)中的時間長短作為替換依據(jù)。FIFO算法認(rèn)為是最早調(diào)入Cache中的塊,其以后不再被使用的可能性比剛調(diào)入的可能性大,故總是選擇在Cache中停留時間最長的塊替換。在算法實現(xiàn)上,將進入Cache的塊按照時間先后順序排隊,隊首是最早進入Cache的塊,隊尾是最晚進入Cache的塊,需要替換時,隊首的塊首先被替換掉。
近期最少使用算法
近期最少使用算法(LRU)的基本思想是挑選近期最久沒有使用過的塊作為被替換塊,這種算法能較好地反映程序的局部性特點。LRU算法可用堆棧來實現(xiàn),所以又稱為堆棧型算法。當(dāng)所設(shè)堆棧已滿,又有一塊要求調(diào)入緩存時,首先檢查堆棧中是否已經(jīng)有這一塊。如果有,則將這一塊從堆棧中取出壓入堆棧的棧頂;如果沒有,則將該塊直接壓入棧頂,于是在原棧底上的塊被壓出了堆棧,保證任何時候棧頂上的塊總是剛被訪問過的塊,而棧底上的塊總是最久沒有被訪問過的塊。
最佳置換算法
OPT置換算法是由貝萊迪(Belady)于1966年提出的一種理論上的算法。其所選擇的被淘汰頁面,將是以后永不使用的,或者是在未來的最長時間內(nèi)不再被訪問的頁面。采用最佳置換算法,通常可保證獲得最低的缺頁率。但由于人們還無法預(yù)知一個進程在內(nèi)存的若干個頁面中,哪一個頁面是未來最長時間內(nèi)不再被訪問的,但可以利用該算法去評價其他算法。
工作過程
虛擬存儲器是由硬件和操作系統(tǒng)自動實現(xiàn)存儲信息調(diào)度和管理的。它的工作過程包括6個步驟:
調(diào)度方式
調(diào)度方式有段式、分頁式、段頁式3種。
段式
在段式虛擬存儲系統(tǒng)中,虛擬地址由段號和段內(nèi)地址組成,虛擬地址到實存地址的變換通過段表來實現(xiàn)。程序通常具有模塊性,一個復(fù)雜的大程序總可以分解成多個在邏輯上相對獨立的模塊,這些模塊可以是主程序、子程序或過程,也可以是數(shù)據(jù)塊。模塊的大小各不相同,有的甚至事先無法確定,每個模塊都是一個單獨的段,都以該段的起點為0相對編址。當(dāng)某個段由輔存調(diào)入主存時,只要賦予該段一個基地址(即該段存放在主存中的起始地址),就可以由此基地址和單元在段內(nèi)的相對位移形成單元在主存中的實際地址。將主存儲器按段分配的存儲管理方式稱為段式管理。
假設(shè)系統(tǒng)在主存儲器中最多可同時有N道程序,可設(shè)N個段表基址寄存器,對應(yīng)于每道程序,由基號(程序號)指明使用哪個段表基址寄存器,段表基址寄存器中的段表基地址字段指向該道程序的段表在主存中的起始地址,段表長度字段指明該道程序所用段表的行數(shù)即程序的段數(shù)。由系統(tǒng)賦予某道程序(用戶、進程)一個基號,并在調(diào)入/調(diào)出過程中對有關(guān)段表基址寄存器和段表的內(nèi)容進行記錄和修改。
分頁式
段式存儲中各段裝入主存儲器的起點和各段長度是隨意的,段表中的地址字段和段長字段很長,增加了輔助硬件開銷,降低了查表速度,導(dǎo)致主存管理繁瑣。例如,主存中已有A、B、C三個程序,其大小和位置如圖所示,現(xiàn)有一長度為12KB的D道程序想要調(diào)入。段式管理時盡管D道程序長度小于主存所有可用區(qū)零頭總和16KB,但是沒有零頭能裝得下,所以無法裝入,頁式存儲由此開始發(fā)展。
頁式存儲是把主存儲器空間和程序空間都機械等分成固定大小的頁(頁面大小隨機器而異,一般在512B到幾KB之間),按頁順序編號,任一主存單元的地址np就由實頁號nv和頁內(nèi)位移nt兩個字段組成。虛擬地址分為兩個字段:高位字段為虛頁號,低位字段為頁內(nèi)地址。每個獨立的程序也有自己的虛頁號順序,如此例中,若頁面大小取4KB,則獨立編址的D程序就有3頁長,頁號為0-2。如果虛擬內(nèi)存中的每一頁均可裝入主存儲器中任意的實頁位置,如下圖所示,D程序中各頁就可分別裝入主存的第2、6、7三個實頁位置,只要系統(tǒng)設(shè)置相應(yīng)的頁(映像)表,保存好虛頁裝入實頁時的頁面對應(yīng)關(guān)系,就可由給定的程序(虛)地址查頁表,變換成相應(yīng)的實(主)存地址訪存。頁式調(diào)度的優(yōu)點是頁內(nèi)零頭小,頁表對程序員來說是透明的,地址變換快,調(diào)入操作簡單;缺點是各頁不是程序的獨立模塊,不便于實現(xiàn)程序和數(shù)據(jù)的保護。
頁面調(diào)度策略
虛擬內(nèi)存系統(tǒng)定義了三種分頁調(diào)度策略:取頁策略、置頁策略和替換策略。
取頁策略:決定什么時候頁面調(diào)度程序把一個頁從磁盤調(diào)入內(nèi)存中,取頁策略有兩種做法,一種是盡量把一個進程需要的頁面在使用之前就裝入內(nèi)存,另一種是按需頁面調(diào)度策略,即僅當(dāng)發(fā)生頁面錯時才將所需頁裝入。
置頁策略:是指當(dāng)一線程收到一個頁面錯時,內(nèi)存管理系統(tǒng)必須確定把頁面放入物理內(nèi)存中什么地方。在段式內(nèi)存體系結(jié)構(gòu)中,置頁策略較復(fù)雜,但在線性結(jié)構(gòu)中較簡單,它只要求找到一個未分配的頁幀。
替換策略:是指當(dāng)產(chǎn)生頁面錯誤且物理內(nèi)存已滿時,使用什么算法來確定哪一個虛擬頁要從內(nèi)存中移去,以便為新的頁留出空間,常用的替換算法有近期最少使用算法和先進先出算法。
段頁式
段頁式存儲是把實(主)存機械等分成固定大小的頁,程序按模塊分段,每個段又分成與實(主)存頁面大小相同的頁。每道程序通過一個段表和相應(yīng)的一組頁表進行定位。段表中的每一行對應(yīng)一個段,其中“裝入位”表示該段是否已裝入主存儲器,若未裝入主存,則訪問該段時將引起段失效故障,請求從輔存中調(diào)入頁表;若已裝入主存,則地址字段指出該段的頁表在主存中的起始地址。
對于多道程序而言,每道程序(用戶或進程)都需要有一個用戶標(biāo)志號u(轉(zhuǎn)換成基號b)以指明該道程序的段表起點存放在哪個基址寄存器中,從而使多用戶虛地址就由用戶標(biāo)志u、段號s、頁號p、頁內(nèi)位移d四個字段組成。設(shè)系統(tǒng)中主存最多可容納N道程序,下圖表示采用段頁式管理的定位映像機構(gòu)及由多用戶虛地址變換成主存實地址的過程。
在虛擬存儲器中每訪問一次主存儲器都要進行一次程序地址向?qū)崳ㄖ鳎┐娴刂返霓D(zhuǎn)換。段頁式的主要問題是地址變換過程至少需要查表兩次,即查段表和頁表。因此,要想使虛擬存儲器的速度接近于主存,必須在結(jié)構(gòu)上采取措施加快地址轉(zhuǎn)換中查表的速度。
影響因素
內(nèi)存大小
為虛擬內(nèi)存分配合適的HDD空間的大小非常重要,如果虛擬內(nèi)存設(shè)置不當(dāng),就可能導(dǎo)致出現(xiàn)內(nèi)存不足問題,如果分配太小,會出現(xiàn)“存儲器用完”錯誤。因此可以把虛擬內(nèi)存文件的最小值和最大值設(shè)為相同值,就會迫使操作系統(tǒng)在開機時就分配整個頁文件,防止程序在運行過程中增大頁文件,從而改進性能。許多圖像應(yīng)用程序可因此避免在硬盤和盒式錄音磁帶之間讀寫圖像信息時停頓,通過減少操作系統(tǒng)調(diào)整頁文件大小的需要,從而減少了對磁盤的寫操作。
存儲位置
影響虛擬內(nèi)存性能的另一個因素是頁文件在磁盤上的存儲位置。系統(tǒng)盤空余的容量并不小,但因為經(jīng)常安裝、下載軟件,并反復(fù)刪除造成磁盤碎片太多,也會造成虛擬內(nèi)存不足。虛擬內(nèi)存需要一片連續(xù)的空間,盡管磁盤空余容量大,但沒有連續(xù)的空間,也無法建立虛擬內(nèi)存區(qū)。如果系統(tǒng)有多個物理HDD,可以把每個驅(qū)動器上的頁文件減小,而把工作分配到各個驅(qū)動器,從而使頻繁使用虛擬內(nèi)存的系統(tǒng)大大加速。
文件碎塊
磁道和扇區(qū)上產(chǎn)生大量屬于同一個程序但又非連續(xù)存放的數(shù)據(jù)簇,即所謂的文件碎塊。當(dāng)這些碎塊積累到一定程度,有可能導(dǎo)致文件丟失數(shù)據(jù),更重要的是導(dǎo)致硬盤讀寫數(shù)據(jù)的速度嚴(yán)重下降,并且會使得系統(tǒng)的高速緩存程序如SmartDrive的性能也大打折扣,影響到虛擬內(nèi)存的工作效率。
內(nèi)存管理單元
在內(nèi)存管理單元中,處理器的虛擬地址空間被劃分為頁面大小的分配單元。內(nèi)存管理單元能夠?qū)⑻摂M內(nèi)存分為內(nèi)核空間和用戶空間,內(nèi)核空間保留給操作系統(tǒng)和相關(guān)組件(如設(shè)備驅(qū)動程序)使用;用戶空間可供應(yīng)用程序使用,也可以用于用戶啟動的其他操作,例如處理輸入到命令提示符窗口中的命令。用戶級代碼無法直接訪問系統(tǒng)內(nèi)存,必須調(diào)用系統(tǒng)函數(shù)來請求內(nèi)存分配等服務(wù)。
系統(tǒng)負(fù)載
處理器的速度影響各個任務(wù)的執(zhí)行速度,同時它能夠?qū)?a href="/hebeideji/4768757336211358686.html">HDD空間用作虛擬內(nèi)存,當(dāng)系統(tǒng)的全部RAM都被用完時,就可以通過將內(nèi)存塊換進或換出硬盤而繼續(xù)執(zhí)行其他的運算。但一旦系統(tǒng)負(fù)載過大而需要使用虛擬內(nèi)存時,會因為機械硬盤的速度比RAM芯片慢而使系統(tǒng)的性能明顯下降。
優(yōu)缺點
優(yōu)點
允許程序分段加載到內(nèi)存:虛擬內(nèi)存可以使得大程序在主存儲器配置比程序本身還小的機器上運行。對于內(nèi)存大小中等的機器,由于程序運行時不必全部駐留內(nèi)存,虛擬內(nèi)存允許更多的程序駐留在主存中競爭CPU時間,當(dāng)程序一段時間內(nèi)只使用部分代碼段或數(shù)據(jù)段,而不用其他部分的時候,那些沒有用到的部分就不用放在內(nèi)存中。另外,使用虛擬內(nèi)存可以加速程序啟動,通常程序在處理命令行參數(shù)和決定采取何種操作之前,只需要把一小段代碼載入內(nèi)存,在程序的一次執(zhí)行過程中,可能不需要程序的其他部分。隨著程序不斷運行,其代碼段和數(shù)據(jù)段的其余部分在需要時才被調(diào)入內(nèi)存(請求調(diào)頁機制)。
為算法技術(shù)提供支持:相比仔細(xì)地將數(shù)據(jù)結(jié)構(gòu)放到較小的內(nèi)存區(qū)域,有許多算法更容易通過稀疏使用大地址空間進行編程實現(xiàn)。如果不用虛擬內(nèi)存,這些技術(shù)實現(xiàn)起來代價太大。但是一旦有了虛擬內(nèi)存,在沒有太多物理內(nèi)存的情況下,它們依然會運行得更快。
擴大了地址空間:無論段式虛擬內(nèi)存,還是頁式虛擬內(nèi)存,或是段頁式虛擬內(nèi)存,尋址空間都比實存大。
公平分配內(nèi)存:采用了虛擬內(nèi)存之后,每個進程都相當(dāng)于有同樣大小的虛擬內(nèi)存空間。
實現(xiàn)進程間通信:當(dāng)進程需要通信時,可采用虛擬內(nèi)存共享的方式實現(xiàn)。內(nèi)存頁可以標(biāo)記為可在應(yīng)用程序間共享,這意味著一個頁面被明確授權(quán)為可以從多個進程進行訪問。這實現(xiàn)了有效的進程間通信。
確保操作系統(tǒng)正常運行:由于每個內(nèi)存頁都有一組屬性,這些屬性限制了該頁面所支持的操作類型,通過合理設(shè)置這些屬性,可以提高操作系統(tǒng)穩(wěn)定性。虛擬內(nèi)存管理硬件負(fù)責(zé)確保每個應(yīng)用程序只能訪問分配給它的內(nèi)存頁。試圖訪問另一個進程的內(nèi)存或其分配的內(nèi)存空間之外的任何其他地址,都會導(dǎo)致訪問沖突異常。此外,虛擬內(nèi)存能夠特定的內(nèi)存地址提供寫保護,以防止代碼或數(shù)據(jù)被惡意篡改。虛擬內(nèi)存還可以將內(nèi)存頁標(biāo)記為所需的最低權(quán)限級別,從而僅允許內(nèi)核級代碼訪問該內(nèi)存頁,此限制可確保即使在應(yīng)用程序運行異常的情況下,操作系統(tǒng)也可以正常運行。
局限性
降低性能:使用虛擬內(nèi)存會降低性能。把程序一次性載入內(nèi)存,要比根據(jù)需要一塊塊地將整個程序載入內(nèi)存的效率高得多。因為每次操作都需要一定的開銷:保存和恢復(fù)狀態(tài)決定必須載入哪個頁面。所以,有些系統(tǒng)只對大小超過某一最小值的程序才使用請求調(diào)頁機制。
地址映射問題:在訪問主存儲器時把虛地址變?yōu)橹鞔嫖锢淼刂罚ㄟ@一過程稱為內(nèi)地址變換):在訪問輔存時把虛地址變成輔存的物理地址(這一過程稱為外地址變換),以便換頁。此外還要解決主存分配、存儲保護與程序再定位等問題。
占用內(nèi)存:虛擬內(nèi)存的管理需要建立很多數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)要占用額外的內(nèi)存。此外,如果一頁中只有一部分?jǐn)?shù)據(jù),會浪費內(nèi)存。
耗費時間:虛擬地址到物理地址的轉(zhuǎn)換,增加了指令的執(zhí)行時間。此外,頁面的換入換出需要磁盤I/O,也需要耗費時間。
安全與隔離
隨著虛擬化技術(shù)的發(fā)展,越來越多的單位將業(yè)務(wù)應(yīng)用遷移至虛擬計算平臺,相應(yīng)地,針對虛擬計算環(huán)境的惡意代碼也日益猖。2016年發(fā)布的《2015年中國互聯(lián)網(wǎng)服務(wù)器安全報告》顯示,虛擬主機及云平臺已成為黑客攻擊的主要目標(biāo)之一。虛擬環(huán)境惡意行為的一個最大特點是內(nèi)存化、隱蔽化以及多態(tài),使得部分關(guān)鍵數(shù)字證據(jù)只存于易失性內(nèi)存中或暫存于頁面交換文件中。虛擬環(huán)境惡意行為分析技術(shù)主要分為虛擬隔離環(huán)境分析、虛擬機監(jiān)控器外部分析以及虛擬機內(nèi)部分析等。
虛擬隔離環(huán)境分析
虛擬隔離環(huán)境分析技術(shù)利用虛擬機隔離惡意軟件運行環(huán)境,在虛擬機內(nèi)部安裝分析軟件或使用APIHOOK等方式捕獲惡意軟件行為,可通過驅(qū)動方式加載內(nèi)部分析系統(tǒng),利用APIHOOK技術(shù)分析惡意軟件行為。
虛擬機監(jiān)控器外部分析
虛擬機監(jiān)控器外部分析技術(shù)利用虛擬機監(jiān)控器(virtual machine 監(jiān)聽,VMM)實現(xiàn)虛擬機代理或自省,捕獲虛擬機內(nèi)部惡意軟件的運行行為并加以分析。可利用虛擬機自省技術(shù)實現(xiàn)虛擬機內(nèi)部運行狀態(tài)的監(jiān)控與行為重構(gòu)。
虛擬機內(nèi)部分析
虛擬機內(nèi)部分析技術(shù)可利用虛擬機自身的某種功能特性實現(xiàn)惡意行為的分析,可通過虛擬機的軟件模擬特性完成了惡意軟件動態(tài)行為檢測并通過增量獲取內(nèi)存數(shù)據(jù),實現(xiàn)惡意行為的連續(xù)分析。
序列化重構(gòu)
為動態(tài)刻畫虛擬計算環(huán)境中的進程行為,須將虛擬內(nèi)存中獲取到的多個單一行為以證據(jù)鏈的方式進行序列化重構(gòu)。如圖所示,針對主流的虛擬計算環(huán)境(如威睿),通過VMware虛擬機安裝目錄下擴展名為.wmem的文件獲取內(nèi)存鏡像,通過對該文件的逆向分析破解其數(shù)據(jù)結(jié)構(gòu),遍歷搜索內(nèi)核對象,從而準(zhǔn)確定位并提取相應(yīng)的原始內(nèi)存證據(jù)信息。
權(quán)限控制和內(nèi)存資源隔離
從密碼軟件實現(xiàn)所需的運行環(huán)境來看,計算機通過軟硬件配合實現(xiàn)了權(quán)限控制和內(nèi)存資源隔離,具體包括:虛擬內(nèi)存管理是操作系統(tǒng)基于軟硬件機制實現(xiàn)的內(nèi)存管理功能,通過將用戶態(tài)進程使用的虛擬地址映射到內(nèi)存的物理地址,使得用戶態(tài)進程擁有連續(xù)的虛擬地址空間,同時也便于操作系統(tǒng)內(nèi)核更好地控制程序?qū)Y源的申請和使用,控制進程可訪問資源的范圍并且限定進程異常后影響的范圍,防止其他進程非法讀取和寫入進程資源保證用戶態(tài)進程訪問資源互不影響。
權(quán)限控制和進程隔離是主流密碼軟件實現(xiàn)所依賴的重要基礎(chǔ),密碼軟件實現(xiàn)所在進程中的密鑰等敏感信息被安全地邏輯隔離,使得其他惡意進程無法隨意訪問。內(nèi)核態(tài)和用戶態(tài)的隔離是最基本的基于硬件特權(quán)機制的內(nèi)存地址空間隔離,而且隨著技術(shù)的發(fā)展,出現(xiàn)了利用CPU硬件的虛擬機監(jiān)控器的內(nèi)存地址空間隔離、利用CPU硬件機制的可信執(zhí)行環(huán)境等新型隔離機制。
應(yīng)用場景
多任務(wù)操作系統(tǒng)
內(nèi)存在計算機中的作用很大,電腦中所運行的程序均需經(jīng)由內(nèi)存執(zhí)行,在支持多任務(wù)的操作系統(tǒng)中,如果所有任務(wù)的內(nèi)存需求加起來的總量超過了當(dāng)前系統(tǒng)的物理內(nèi)存總量,那系統(tǒng)要么停掉一些任務(wù),要么把一些任務(wù)轉(zhuǎn)移到外存(如磁盤)中,以后當(dāng)內(nèi)存空閑時再把這些任務(wù)轉(zhuǎn)換回來;或者系統(tǒng)有選擇地把部分不常用的內(nèi)存轉(zhuǎn)換到外存,并且根據(jù)適當(dāng)?shù)囊?guī)則將來再慢慢地轉(zhuǎn)換回來。
Windows多任務(wù)操作系統(tǒng)
Windows多任務(wù)操作系統(tǒng)采用虛擬內(nèi)存的管理方式,對虛擬內(nèi)存的管理完全靠操作系統(tǒng)控制,它讓每個在系統(tǒng)中運行的作業(yè)都認(rèn)為自己有足夠的內(nèi)存空間,而事實上虛擬內(nèi)存的空間是由內(nèi)存和外存共同構(gòu)成的,這種足夠的內(nèi)存空間的感覺是由程序頁面在內(nèi)存與外存之間交換實現(xiàn)的。程序運行初始,通常只裝入必要的頁面在內(nèi)存,其余的都放在輔存中,在需要的時候,將外存的相應(yīng)頁面交換到內(nèi)存中,保證程序的正常運行。
Linux多任務(wù)操作系統(tǒng)
Linux多任務(wù)操作系統(tǒng)采用的是請求頁式虛擬內(nèi)存管理技術(shù),它為應(yīng)用程序提供比實際內(nèi)存大得多的虛擬內(nèi)存。當(dāng)一個程序執(zhí)行時,Linux只為它分配虛擬空間,只有發(fā)生缺頁中斷時,才為它分配物理空間,將虛頁裝入內(nèi)存,即只將當(dāng)前運行最需要的代碼和數(shù)據(jù)裝入內(nèi)存。這樣,當(dāng)該程序運行結(jié)束時,會有一些頁面從未裝入內(nèi)存(比如錯誤處理代碼,幫助代碼),最大限度地利用了主存儲器空間,因而可使更多的程序同時運行。
大型應(yīng)用程序
20世紀(jì)70年代,由于當(dāng)時的存儲容量,特別是內(nèi)存容量成本非常高,容量也很小,對于大型應(yīng)用程序或多程序的應(yīng)用就受到了很大的限制。為了克服這樣的限制,人們就采用了虛擬存儲的技術(shù),最典型的應(yīng)用就是虛擬內(nèi)存技術(shù)。以Windows為例,Windows采用“請頁式”虛擬內(nèi)存管理技術(shù),運行于386以上的機器上,提供32位虛地址,每個進程都有多達(dá)4GB(232B)的虛地址空間。進程4GB的地址空間被分成兩部分:高地址的2GB保留給操作系統(tǒng)使用,低地址的2GB是用戶存儲區(qū),可被用戶態(tài)和核心態(tài)線程訪問,Windows提供一個引導(dǎo)選項,允許用戶擁有3GB地址空間,留給系統(tǒng)1GB以改善大型應(yīng)用程序運行的性能。
相關(guān)概念
物理內(nèi)存
物理內(nèi)存也稱為實際內(nèi)存,是指有硬件存儲介質(zhì)的內(nèi)存。在實際內(nèi)存管理中,必須為作業(yè)分配足夠的存儲空間,以裝入有關(guān)作業(yè)的全部信息,作業(yè)的大小不能超出主存儲器的可用空間,否則,這個作業(yè)無法運行。事實上,當(dāng)把有關(guān)作業(yè)的全部信息都裝入主存儲器后,作業(yè)執(zhí)行時不是同時使用全部信息的,有些部分只運行一遍,有些部分在作業(yè)執(zhí)行的整個過程中甚至都不會被使用(如錯誤處理部分)。
參考資料 >
Virtual Memory.denninginstitute.2024-03-12
What is virtual memory?.techtarget.2024-03-12
Timeline of Computer History.computerhistory.2024-04-02
虛擬化技術(shù)發(fā)展史.江西工程學(xué)院智慧產(chǎn)業(yè)學(xué)院.2024-04-02