Xen VMM(virtual machine monitor)是由劍橋大學(xué)計算機實(shí)驗室開(kāi)發(fā)的一個(gè)開(kāi)源項目,它能夠讓我們創(chuàng )建更多的虛擬機,每一個(gè)虛擬機都是運行在同一個(gè)操作系統上的實(shí)例。
這些客戶(hù)OS可以是修補過(guò)的Linux內核2.4或2.6,也可以是修補過(guò)的NetBSD/FreeBSD內核。用戶(hù)應用程序就運行在這些客戶(hù)OS上,并不需要修改任何代碼。
我曾經(jīng)緊密跟蹤Xen項目一年多。對Xen產(chǎn)生興趣是在讀了2004年的OLS(Ottawa Linux Symposium)論文集之后。
完全虛擬化已經(jīng)被一些硬件仿真程序實(shí)現了。硬件仿真器的不利因素是它們的性能。
Xen項目(半虛擬化)的思想已經(jīng)不是很新鮮了。性能度量和它達到的高效性,能夠被看作是一個(gè)突破,運行Xen的系統開(kāi)銷(xiāo)確實(shí)非常小,大約占3%。
就像剛才所說(shuō)的那樣,現在的Xen要為內核打補丁,但是,將來(lái)的處理器能支持虛擬化,內核也就不需要打補丁了。比如說(shuō),Intel的VT和AMD的Pacifica處理器都將包括這種支持。
XenSource公司2005年8月在Intel開(kāi)發(fā)者論壇(IDF)上發(fā)表聲明說(shuō),它已經(jīng)利用Intel的VT-Enabled平臺和Xen技術(shù)虛擬化了Linux和Windows XP SP 2。
如果沒(méi)有其它虛擬化方法的話(huà),Intel的VT和AMD的Pacifica將會(huì )在對Xen的支持上展開(kāi)競爭。
同時(shí)參與競爭的還有VMWare公司的ESX Server,它不是基于Xen的虛擬化解決方案。VMWare公司2005年8月初聲明,他將通過(guò)一個(gè)叫VMware Community Source的計劃允許他的合作伙伴使用VMware ESX Server的源代碼和接口。
VMware的一個(gè)顯著(zhù)優(yōu)勢就是它不需要在客戶(hù)OS上打補丁。VMware可能比Xen運行地慢一些,因為它使用影子頁(yè)表(shadow page tables),而Xen同時(shí)使用直接和影子頁(yè)表。
Xen已經(jīng)在像Fedora Core 4、Debian和SuSE Professional 9.3這些產(chǎn)品中捆綁發(fā)行了,它也將被包含在RHEL 5中。
針對其它處理器的支持正在有條不紊地進(jìn)行著(zhù)。Xen小組致力于x86_64 port,同時(shí)IBM著(zhù)手于提供Power 5芯片的支持。
保護環(huán)
在Xen中,一個(gè)“系統管理程序”運行在0環(huán),客戶(hù)OS運行在1環(huán),應用程序運行在3環(huán)。這種關(guān)系對于x64/64有一點(diǎn)不同,就是客戶(hù)內核和應用程序都運行在3環(huán)上。
Xen自身被稱(chēng)為“系統管理程序”,是因為它比客戶(hù)OS的系統管理代碼運行所需的特權級還高。
當系統引導的時(shí)候,Xen被裝載到0環(huán)的內存中。它在1環(huán)上啟動(dòng)修補過(guò)的內核,這被稱(chēng)作是domain 0(譯者注:domain是指一個(gè)運行中的虛擬機,在其上有一個(gè)guest OS在執行)。從這個(gè)domain開(kāi)始,你可以創(chuàng )建更多的domain,也可以銷(xiāo)毀它們,可以進(jìn)行domain的遷移、設置參數等等。你創(chuàng )建的那些domain也運行在1環(huán)它們的內核中。用戶(hù)應用程序運行在3環(huán)。
目前,修補過(guò)的Linux內核2.4和2.6可以作為domain 0。據Xen開(kāi)發(fā)者所說(shuō),將來(lái)domain 0僅支持2.6的內核補丁。構造domain 0的大部分工作是在xen/arch/x86/domain_build.c中的construct_dom0()方法中實(shí)現的。
物理設備驅動(dòng)程序只能運行在特權級,也就是domain 0上。Xen依靠Linux或其它修補過(guò)的OS內核對它所有的設備提供虛擬化支持。這樣的好處就是Xen的開(kāi)發(fā)者不必再去開(kāi)發(fā)設備驅動(dòng)程序。
在一個(gè)有標簽TLB的處理器上使用Xen能夠大大提高性能。標簽TLB能夠把ASID(address space identifier)放在TLB入口處。有了這個(gè)特性,當處理器在系統管理程序和客戶(hù)OS之間切換時(shí)就不需要刷新TLB了,這大大減少了系統開(kāi)銷(xiāo)。
Xend Deamon
首先,我們介紹一下Xend,它是Xen控制器daemon,意思是說(shuō)它負責處理創(chuàng )建、銷(xiāo)毀、遷移以及其它許多domain管理的任務(wù)。它很大一部分動(dòng)作是基于一個(gè)HTTP服務(wù)器的。大量對domain的控制請求都是通過(guò)發(fā)送HTTP請求來(lái)實(shí)現的。
我們在引導進(jìn)入Xen后通過(guò)命令行命令xend start來(lái)啟動(dòng)Xend daemon。它需要Python2.3的支持。
Xend daemon的工作是建立在與XCS server(the control Switch)的交互上。所以,當我們啟動(dòng)Xend daemon時(shí),需要檢查一下XCS是否已經(jīng)啟動(dòng)和運行了。如果沒(méi)有,我們將試著(zhù)去啟動(dòng)它。
Srv Daemon是Xend的主要程序,啟動(dòng)Xend daemon就會(huì )創(chuàng )建一個(gè)Srv Daemon類(lèi)的實(shí)例。
接下來(lái)在createFactories()方法中創(chuàng )建一個(gè)Channel Factory。Channel Factory有一個(gè)隱含的notifier對象。Xend daemon的大量工作都是基于這個(gè)notifier接收的消息的。這個(gè)factory創(chuàng )建一個(gè)線(xiàn)程,在一個(gè)無(wú)限循環(huán)中讀取這個(gè)notifier。
創(chuàng )建domain
創(chuàng )建一個(gè)domain是通過(guò)使用一個(gè)hypercall(DOM0_CREATEDOMAIN)來(lái)完成的。Hypercall是Linux內核中的一個(gè)系統調用,通過(guò)它,用戶(hù)空間可以調用內核中的方法,它通過(guò)一個(gè)中斷(Int 0x80)來(lái)完成。在Xen中,類(lèi)似的系統調用就是hypervisor,通過(guò)它,domain 0 調用hypervisor中的方法,它也是通過(guò)中斷(Int 0x82)來(lái)完成的。hypervisor通過(guò)它的虛擬CPU訪(fǎng)問(wèn)每一個(gè)domain。
XendDomain類(lèi)和XendDomainInfo類(lèi)在創(chuàng )建和銷(xiāo)毀domain中扮演著(zhù)非常重要的角色。我們通過(guò)調用XendDomain中的domain_create()方法創(chuàng )建一個(gè)新的domain。
XendDomainInfo類(lèi)和它的方法主要用于一個(gè)domain的實(shí)際構造。
XCS Server
XCS server有兩個(gè)TCP套接字,分別是控制連接和數據連接,它們不同的地方在于前者是同步的,后者是異步的。前面提到的notifier對象,就是XCS服務(wù)器的一個(gè)客戶(hù)端。
創(chuàng )建虛擬設備
XendDomainInfo中的create()方法啟動(dòng)一個(gè)創(chuàng )建domain的動(dòng)作鏈。首先被創(chuàng )建的是這個(gè)domain的虛擬設備。這個(gè)create()方法調用create_blkif()創(chuàng )建一個(gè)塊設備接口(blkif),即使VM不需要磁盤(pán)它也是必須被創(chuàng )建的。另一個(gè)虛擬設備通過(guò)create_configured_devices()創(chuàng )建。
所有的設備類(lèi)都從Dev繼承,Dev是一個(gè)聯(lián)系設備控制器的抽象類(lèi)。它的attach()抽象方法在每一個(gè)Dev類(lèi)的子類(lèi)中實(shí)現,這個(gè)方法把前端和后端聯(lián)系了起來(lái)。
Domain 0運行后端驅動(dòng),同時(shí)最新創(chuàng )建domain運行前端驅動(dòng)。許多消息在后端和前端驅動(dòng)之間傳送。前端驅動(dòng)感覺(jué)上是虛擬的,它不需要使用特定硬件的詳細信息。
聯(lián)系虛擬設備的中斷是虛擬中斷。
結論
Xen項目是一個(gè)很有趣同時(shí)充滿(mǎn)了希望的項目。它的代碼很復雜,特別是虛擬內存管理、活動(dòng)域合并工具和授權表機制。本文僅僅是介紹性的,并不涉及這些話(huà)題。然而,我希望它能夠成為想要了解和深入研究代碼的一個(gè)出發(fā)點(diǎn)。
聯(lián)系客服