經典VMM
系統虛擬機對云計算是非常重要的。
任何計算機都有三個主要子系統,CPU,內存,I/O,經典虛擬機上VMM管理三個重要的子系統。
經典的虛擬機監視器,接口就是ISA,處理器的接口,內存接口,I/O接口。虛擬化的ISA必須包括三個接口的虛擬化,
處理器的虛擬化:
VMM所作的工作和操作系統所作的工作有很多工作是相通的。回顧操作系統·的知識,操作系統再沒有虛擬化的系統里,大部分的應用指令都是用戶指令,不需要經過操作系統,保證了應用程序·的執行性能。但是當訪問共享資源的時候,應用必須通過系統調用,來請求操作系統做這項工作。
應用用用戶指令,操作系統用系統指令。
再有虛擬機的環境下,沒有主機系統,VMM是唯一可以使用系統指令的軟件。對比模擬器,模擬器的性能比較差,系統虛擬機提供的ISA跟物理硬件的ISA是一樣的,這樣虛擬機的指令跟系統指令是一樣的。
在沒有虛擬機上的OS是一樣的,大部分虛擬機是不需要經過VMM的,虛擬機的操作系統的指令怎么辦呢?虛擬機的操作系統是不知道自己被虛擬化的,需要運行需要有特權的指令,在虛擬機里面的應用想要去訪問共享的資源的時候,任然是通過虛擬機里面的軟件,虛擬機里面的應用需要系統ISA去執行I/O操作,但是虛擬機的操作系統是沒有這個特權的。只有VMM有這個特權,托管操作系統如何訪問硬件資源呢?在沒有虛擬化的環境下,操作系統可以提供一個接口,在虛擬機的環境下,VMM不能提供這樣一個接口。VMM提供一個虛擬機的操作系統可以訪問一個接口,來訪問共享資源,那就意味著虛擬機的操作系統需要被改動。對操作系統不能改變,即使我們不能提供一個可以使用的操作系統接口,這個操作系統也不會去使用。因為操作系統不知道自己被虛擬化,在不知道自己被虛擬化的時候,是不會去條用自己不應該去調用的接口。
沒辦法虛擬機的操作系統向VMM發請求,為了支持發請求,利用一個叫捕獲和模擬的方法,
利用了機制:首先知道,虛擬機的操作系統不知道自己在虛擬機中,當虛擬機的操作系統取指令的時候,它會做它應該做的事情,用這個系統化ISA來訪問共享資源。但是虛擬機操作系統是沒有特權模式的,當它試圖去執行一個指令的時候,硬件會發生的一個動作叫trap捕獲。這是硬件自動做的,硬件它有特權模式和非特權模式,在沒特權的情況下,硬件會發出一個指令,CPU每執行一個指令的時候,CPU都會把這個指令所需要的特權和當前所在特權模式進行比較,如果指令所需要的特權,高于CPU特權所在的特權模式,那么CPU就會自動激發捕獲機制。捕獲機制會把當前所需要執行的指令中斷,中斷之后會把CPU切換到有特權的模式。去執行有特權的軟件去執行有特權的指令。
當需要執行的特權高于所在環境的時候,CPU就會條用有特權的軟件。有特權的軟件就是VMM,OS調用系統指令,硬件自動激發捕獲機制,捕獲機制就是中斷只能怪,然后調用系統軟件去處理這個捕獲。給了VMM的機會去模擬虛擬化執行的指令。
操作系統和虛擬機的相同,大部分用指令去執行。
不同:訪問共享硬件資源的時候,用操作系統的接口去請求操作,虛擬機軟件是沒有特權的,當試圖執行有特權的指令,就會用VMM可以用的指令去模擬。VMM可以應用系統指令。
內存虛擬化:
操作系統是虛擬化內存,虛擬機做內存虛擬化。操作系統的內存虛擬化是給線程用的,虛擬機內存虛擬化是給虛擬機用的。在一個虛擬化的環境里,有兩層虛擬化。操作系統線程虛擬化,虛擬機虛擬化是對虛擬機的內存進行虛擬化,內存虛擬化的學習就是兩層虛擬化的構成。
操作系統的虛擬化:應用程序時加載和存儲虛擬地址,然后虛擬地址被映射到物理機的物理地址。如果沒有虛擬機,操作系統時唯一管理的硬件的情況下,在CPU上線程用的時虛擬化虛擬機不能托文件出來,內存管理器它從虛擬地址到物理地址,MMU用頁面提供的映像,把虛擬地址翻譯為物理地址。把物理地址送到物理內存上去,實現對內存的訪問。OS時操作系統做的事情,應用程序的虛擬內存,應用的虛擬內存需要映射到虛擬機的虛擬內存,虛擬機的操作系統負責管理映像。
虛擬機得到的內存是從物理內存上來的,物理上的虛擬機需要共享物理內存,需要第二層的虛擬化,VMM虛擬機負責建立從虛擬機的虛擬內存到物理機的物理內存。通過映像,物理機把物理內存對不同的虛擬機進行共享。也負責保證每個虛擬機只能訪問自己的虛擬內存,共享和隔離。
每一層的虛擬化,都是用同樣的頁表機制來實現的。意味著虛擬機的操作系統會管理一層頁表,要實現從線程的處理到虛擬機的映像,都是通過頁表實現。
第一層的頁表時虛擬機的頁表,另一層頁表是虛擬機的頁表,假設系統上面有兩個虛擬機,系統內存是被兩個虛擬機來共享的。每個虛擬機都有分配有自己虛擬內存,在每個虛擬機上有若干個線程,程序1和程序2都有自己的內存,程序的虛擬內存,程序3用的VM2的內存。
虛擬機1上虛擬內存地址1000,被映像到虛擬機1的內存地址5000,1000->5000;程序1的頁表的時候,程序1的虛擬內存2000被映像到虛擬機的1500,程序映像列表2000->1500.
虛擬機1的1500映射到物理內存500,虛擬機1的頁表會把1500映射到物理500,5000映射到物理內存的1000.虛擬機的兩個程序的映射。
虛擬機2的程序3,虛擬機的程序2的4000映射到內存的3000,映像的3000映像到程序2的列表,虛擬機1的程序3000,沒有被映射到物理的任何位置。
虛擬機2的內存虛擬化是一樣的,程序3的1000映射到虛擬機2的內存,程序3列表的時候1000映射到500,虛擬機2的500被映像到虛擬機內存的3000。
內存會有地址沒有被映像物理內存上去,虛擬內存衍生的工作,操作系統是把應用的·虛擬內存映射到物理內存。內存虛擬化,考慮很多線程,所有虛擬機的內存總和大于物理內存的容量。每一個程序的虛擬內存都是很大的內存空間,上千個程序在同時運行。但我們只有非常有限的物理內存空間,我們可以用輔助存儲,硬盤空間提供更多的虛擬內存。硬盤容量來彌補物理內存的不足,意味著所有運行的線程并不是都運行在物理內存上的,有些是被映像到硬盤上的,輔助存儲的空間上。只有當前所需要的內存,都是以也來管理單位來做映像,映像提供的是頁表。
只有當一個線程需要去訪問一個頁的時候,線程才會從硬盤上調到內存上去。按需調用。只有當需要到頁的時候,我們才會把物理內存進行調用,當內存已經滿的時候,我們才會把不需要的頁踢回到硬盤上去。按需調頁。
有些地址是沒有映像的,存在輔助存儲上的。虛擬機1上程序2,不存在映射,因為虛擬機上操作系統把它踢出去了。
虛擬機有自己的硬盤,虛擬機會做按需調頁的工作。如果一個虛擬機不存在映像,其原因等于把這個虛擬機等著操作系統把頁踢出了內存。
物理機:VMM也做內存虛擬化,會用物理硬盤來實現按需調頁,會把物理內存的一些頁踢出去,VMM做第二層的按需調頁。
程序2的4000存在虛擬機1的映射3000,但是3000沒有到物理內存射,因為VMM把他踢出去了。第一層映射存在,第二層映射不存在,原因是VMM把它踢出去了。
內存虛擬化的難點之一:
頁表的存儲映射虛擬機不能托文件出來,CPU用的應用程序的虛擬地址,物理內存需要的是物理地址。MMU用頁表來做應用的虛擬地址到實際地址的翻譯,用兩層的頁表來做翻譯,應用的虛擬地址需要應用頁表翻譯成虛擬機的虛擬地址。虛擬機的虛擬地址需要虛擬頁表翻譯為物理地址。傳統MMU沒有對虛擬化提供支持。VMM需要建影子頁表,提供直接從應用程序的地址到物理地址的直接映射,程序1的虛擬內存里到物理內存1000。MMU訪問1000,影子頁表1000直接翻譯為1000,提供一層頁表直接把應用的虛擬地址到物理內存的物理地址。程序2的10000,程序2的虛擬內存4000映射到3000,虛擬機的3000沒有映射物理內存。影子頁表不會映射。虛擬化傳統x86的難點。
I/O虛擬化:
經典的虛擬機和托管虛擬機的虛擬化不一樣,有沒有主機操作系統的區別在于誰來驅動I/O的設備。I/O要復雜很多,因為很多的I/O的設備,鼠標、硬盤。
I/O對操作系統和虛擬機都需要很多的支持。VMM是唯一能夠管理虛擬化的重要軟件。在一個托管的虛擬機環境里,主機操作系統知道怎么驅動I/O設備,在托管的虛擬機環境里,可以把I/O工作托給主機操作系統,主機OS知道怎么去做。
云計算的虛擬機時經典虛擬機,應用程序想往虛擬硬盤上做一個寫的操作,應用程序會發一個寫的請求,是通過系統調用的接口實現,指定哪一塊數據指定或者緩沖,指定要寫的文件,指定相要寫的內容。執行產出,存儲的I/O,除了內存以外都是以塊為顆粒進行管理。指定哪一個block去執行寫的操作。驅動是指令,用的是系統指令。直接與硬件打交道是指令.一個寫的操作會有一系列I/O指令,特權不同,當硬件試圖執行指令就會觸發捕獲機制。就會把沒有特權的模式轉化為有特權的模式,去執行有特權的軟件。VMM。VMM去模擬執行觸發捕獲機制的指令。虛擬機的虛擬硬盤是普寧在物理機的物理硬盤上的,虛擬機會用一些列I/O內存·,VMM會用一系列的自己的I/O指令去模擬捕獲的I/O指令,其中也包括out指令。虛擬機執行Out是針對虛擬機的虛擬硬盤out指令,vmm執行out指令是針對物理機的物理硬盤。所以兩個I/O所執行的對象是不一樣。I/O虛擬化是虛擬機提供虛擬化的I/O設備,虛擬機的虛擬硬盤是不同形式存在物理機的物理硬盤上的。虛擬機的虛擬硬盤是作為一個文件在物理硬盤存在的。
提供虛擬化的I/O設備,虛擬機試圖執行虛擬I/O指令的時候,去捕獲。大部分的時間是可以直接在硬盤上直接操作的。