虛擬機是怎麼實現的?

1997年,斯坦福的Mendel Rosenblum帶着Edouard Bugnion, Scott Devine在SOSP上發了篇論文,叫作Disco: running commodity operating systems on scalable multiprocessors (http://www.stanford.edu/class/cs240/readings/disco.pdf)。發了以後,我想他們應該是以爲這個主意太好了,就開了家公司,名叫VMWare。

這 篇論文起名叫Disco(迪士高)是由於虛擬機自己不是一個新的東西,大概在上世紀70年代就有了。做者們爲了表示敬意,或者是顯示這是一個復古的東西, 就把這個項目取名爲disco。這篇論文介紹了虛擬機關鍵技術,用來回答這個問題再合適不過了。(多年以後,OSDI上的另外一篇論文(Memory Resource Management in VMware ESX Server)介紹了一些VMWare的改進。近年來論文愈來愈多。)

當 初他們爲何要作虛擬機?簡單說就是,新硬件層出不窮,可是OS趕不上。當初,他們想在Stanford的ccNUMA機器上跑IRIX(一個操做系 統)。但是IRIX跑不起來。他們以爲修改OS或者寫一個新的OS太難了(由於一個操做系統從出生到成熟要很長的時間,無數BUG要FIX,無數的新功能 要增長。。。那樣人家博士要怎麼畢業。。)。因此,他們決定用虛擬機。

對於他們的項目,虛擬機大體有下面這些好處: 緩存

  1. 只要對商業OS作簡單地修改,就能讓他們在多個VM(Virtual Machine)間共享內存。
  2. Flexible。除了論文裏的IRIX,實際上其餘的OS也能跑。
  3. 擴展性好。系統能夠以虛擬機爲單位擴展。
  4. fault-containment。每個VM都是一個幾乎獨立的個體,一個壞了,不影響另外一個。
  5. 新老軟件可共存。好比,新的軟件只能在Linux-3.15跑。你能夠用兩個VM,一個是Linux2.6,一個是Linux-3.15。

這篇文章回答下面這幾個實現虛擬技術的關鍵問題: 網絡

  1. VMM(Virtual Machine Monitor, 或者叫hypervisor)是怎麼管住Guest OS的?或者說,皇上(VMM)是怎麼防止大臣(OS)奪權的?
  2. 有那麼多個操做系統一塊兒運行,內存是怎麼管理的?
  3. 多個VM之間是怎麼分享資源的?或者說,1GB內存怎麼當2GB用?

 

VMM(Virtual Machine Monitor, 或者叫hypervisor)是怎麼管住Guest OS的?或者說,皇上(VMM)是怎麼防止大臣(OS)奪權的?

new1


要理解VMM是怎麼工做 的,咱們得先了解沒有VMM的時候,系統是怎麼工做的。在沒有VMM的時候,計算機系統中的」應用」可分爲用戶進程(好比VIM)和操做系統。他們分別運 行在不一樣的模式中(mode)。咱們用一個類比來解釋系統中的模式(mode)。模式這個機制是用來限制一段指令所在的環境的權限的,它是須要處理器的支 持的。MIPS結構當時有三個模式:用戶模式(user mode),長官模式(supervisor mode,原諒個人翻譯…)和內核模式(kernel mode)。這三種模式分別對應於人類社會裏的民宅、官衙和金鑾殿。顯而易見,在金鑾殿裏的人擁有的權限最高,民宅裏的最低。咱們能夠說,在沒有VMM 時,用戶進程住在民宅裏,縣衙空着,OS住在金鑾殿裏(如圖)。用戶能夠直接作一些不用什麼特權的事情(unprivileged instructions),好比計算1+1。作這些事情不通過OS。可是,有些要特權才能作的事情,必定要通過OS。好比保存正在編輯的文檔到硬盤。訪 問硬盤是特權操做是由於硬盤是共享的資源,要有人管着,不能讓人亂來。試想,要是人人都能讀寫檔案館的檔案,那不就亂套了。

new2
VIM(用 戶進程)不能直接寫磁盤上的文件。VIM必須請求在金鑾殿裏的操做系統來作。怎麼請求呢?經過系統調用(system call)。系統調用的過程是這樣的:好比要調用的是write(fd, buf, len, off),首先把fd, buf, len, off放到stack裏,而後再把一個write()函數對應的號碼(system call number)放到stack裏,最後調用一個特殊的指令使CPU進入內核模式(圖中的圈1)。在x86結構中,這個指令是int(中斷)。在MIPS結 構中,這個指令是trap。這個指令會引導CPU執行一段代碼(trap handler),依照stack裏的system call number 找到對應的函數(在這裏是write()的實現),而後調用這個函數(函數的參數在剛纔的stack裏)。在這裏函數裏,操做系統調用文件所在的文件系統 裏的write()實現,文件系統使用磁盤的驅動來最終實現。因此文件的操做完成後,操做系統調用與trap功能相反的一個指令,回到VIM程序的指令裏 (圖中的圈2)。

new3
操 做系統維護本身的特權的過程大概就是這樣。可是這個特權等級究竟是怎麼實現的呢?咱們能夠想像CPU裏有一個特權狀態(privileged state bit)。狀態爲開(On)的時候,CPU的特權等級高,你能夠作任何事,包括轉到低特權狀態。關(Off)的時候,你所能作的事情就所限了。那怎麼從 off狀態轉到on狀態呢?你必須到執行CPU的特殊指令,這個指令會把你帶到一個特定的地方執行操做系統的指令,檢查你是否是有進入高特權狀態的權限。 這就像是在機場,你能夠很容易地從登機口到售票大廳,但是你要從售票大廳到登機口,你就得過安檢。另外,爲何操做系統就能有高特權呢?Hmm…由於操做 系統一開始就把那佔了,以後運行的應用程序就只能聽它使喚了。

如今,終於要說VMM(virtual machine monitor, 或者叫hypervisor)是怎麼實現的了。以下圖:
new4
現 在VMM進了金鑾殿,有了最高的特權。操做系統被放到了官衙裏(可是它本身並不知道)。用戶進程仍是在民宅裏住着。好比,如今用戶進程VIM調用 write(),會發生什麼?用戶進程會trap到VMM(擁有kernel mode)裏去。可是,VMM並不知道如何處理write()。因此,VMM接下來會調用OS的裏對應的trap handler,這個handler會執行文件系統的write(),而後用驅動來寫磁盤。這一切的操做都在VMM的監視下進行。怎麼監視?操做系統實際 上是在虛擬CPU(Virtual CPU)上運行的。VCPU有一套本身的(假的)寄存器。VMM盯着這些寄存器。在操做系統的trap handler完成以後,它會調用trap的反操做(想返回user mode)。可是,這個操做實際上回使CPU回到VMM,由VMM最後返回到用戶進程。

爲 什麼VMM可以知道操做系統的trap handler在哪?系統中先有VMM。當你在VMM上安裝操做系統的時候,操做系統會嘗試調用特權指令安裝trap handler。由於有最高特權的VMM其實是監視着這一切的,因此它能夠記錄下trap handler的位置就好了。

總的說來,虛擬機佔據了CPU的最高特權,使得在更低特權等級的操做系統沒法進行有害操做。 ide

有那麼多個操做系統一塊兒運行,內存是怎麼管理的?

在沒有VMM的時候,系統中有兩種內存地址:虛擬地址(virtual address)和物理地址(physical address)。從虛擬地址到物理地址的轉換有兩種方式。方式一:在TLB(translate lookside buffer,硬件實現)查找。方式二:在頁表(page table)中查找,找到以後把結果放到TLB中去。系統會先嚐試方式一,要是找不到(TLB miss),就用方式二。 函數


new6
在有了VMM以後,系統中有三種內存地址:虛擬地址(virtual address),物理地址(physical address)和機器地址(machine address)。機器地址纔是真正與內存條上的地址一一對應的。物理地址只是操做系統認爲的物理地址。
new5
當 操做系統試着要使用特權指令來完成一個虛擬地址到物理地址的轉換時(TLB miss),VMM就介入了(VMM監視着全部對特權寄存器的操做)。VMM會先使用操做系統內的代碼來先完成虛擬地址到物理地址的轉化(由於VMM並不 知道這個映射關係)。而後,操做系統認爲本身已經完成了轉化,嘗試去更新TLB(特權操做)。這個時候,VMM會介入,用一個叫個pmap的映射表找到物 理地址對應的機器地址,用機器地址替換掉物理地址,而後把TLB更新爲虛擬地址到機器地址的映射。以後,全部對這個虛擬地址的訪問都會被轉換爲對相應機器 地址的訪問。 spa

 

多個VM之間是怎麼分享資源的?或者說,1GB內存怎麼當2GB用?

咱們知道,每個虛擬機都要佔用大量的內存空間。在內存有限的狀況下,怎麼在一臺機 器運行更多的虛擬機?幸運的是,不用的虛擬機之間在內存中數據可能會徹底一致(好比,系統文件在內存中的緩存)。如要咱們能夠只在內存中保留一份數據,我 們就行節省不少空間。Disco使用虛擬IO設備和虛擬網絡設備來節省內存空間。 操作系統


new7

虛擬IO設備:當兩個虛擬機從同一個磁盤上讀同一個文件時,VMM會 intercept DMA,而後就會發現這兩個VM在使用一樣的數據。這份數據只須要在機器內存裏保存一份,而後修改pmap,使得兩個VM的物理地址指向同一個機器地址就 能夠了。當任何一個VM更新這份數據,VMM會給它一份新的拷貝,原來的那份不作更改(copy on write機制)。 

虛擬網絡設備:當使用NFS從VM1向VM2複製文件時,文件並無被真正地複製。虛擬網絡設備會更新VM2上的pmap,使之指向在內存中的文件,使得VM2上的操做系統認爲本身已經有了這個文件。

後來,VMWare還有用hash來找相同的內存頁而後再共享的技術。

(完) scala

相關文章
相關標籤/搜索