Xen和虛擬化技術(shù)學(xué)習(xí)指南_第1頁(yè)
Xen和虛擬化技術(shù)學(xué)習(xí)指南_第2頁(yè)
Xen和虛擬化技術(shù)學(xué)習(xí)指南_第3頁(yè)
Xen和虛擬化技術(shù)學(xué)習(xí)指南_第4頁(yè)
Xen和虛擬化技術(shù)學(xué)習(xí)指南_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Xen和虛擬化技術(shù)學(xué)習(xí)指南1.引言現(xiàn)代計(jì)算機(jī)具有足夠強(qiáng)大的能力來(lái)利用虛擬化技術(shù)支持多個(gè)虛擬機(jī)(VM:virtualmachines),并且在每個(gè)虛擬機(jī)上各自運(yùn)行單獨(dú)的操作系統(tǒng)實(shí)例。這直接導(dǎo)致了虛擬機(jī)技術(shù)發(fā)展的又一個(gè)春天。在本文中,我們提出了Xen,個(gè)高性能的用于資源管理的虛擬機(jī)監(jiān)視器(VMM:VMmonitor)。Xen能夠支持的應(yīng)用比如:serverconsolidation,co-locatedhostingfacilities,distributedwebservices,securecomputingplatforms12,16和applicationmobility。成功地對(duì)一臺(tái)機(jī)器

2、進(jìn)行劃分,使它能夠支持多個(gè)操作系統(tǒng)的并發(fā)執(zhí)行,這個(gè)過(guò)程具有很多的挑戰(zhàn)。首先,虛擬機(jī)必須是彼此相隔離的:如果一個(gè)虛擬機(jī)的執(zhí)行會(huì)影響另一個(gè)的性能,這是不可以被接受的。這一點(diǎn)在操作各個(gè)虛擬機(jī)的用戶(hù)相互間并不信任的情況下顯得特別重要。其次,它必須支持多種多樣的不同操作系統(tǒng)以提供給各種異構(gòu)(heterogeneity)的流行應(yīng)用的支持(/這里的異構(gòu)指的是應(yīng)用開(kāi)發(fā)依托的操作系統(tǒng)不同,因此在實(shí)現(xiàn)上也就有很大差異,使得應(yīng)用并不能夠跨平臺(tái)移植,因?yàn)閄en不需要對(duì)應(yīng)用程序進(jìn)行修改,那么它就必須支持各種常用的操作系統(tǒng);所謂流行的應(yīng)用,就是那些大家常用的、必需的應(yīng)用)。第三,由虛擬化技術(shù)引入的性能開(kāi)銷(xiāo)必須要小。Xen

3、操控(/host:操作和控制)的是常用的操作系統(tǒng),但是需要對(duì)操作系統(tǒng)中的某些相關(guān)部分進(jìn)行一些修改。在本文中描述和評(píng)估的Xen原型系統(tǒng)能夠支持多個(gè)我們研發(fā)的XenoLinuxguestOS實(shí)例的并發(fā)執(zhí)行;每個(gè)實(shí)例都給出了和非虛擬化情況下的Linux2.4中相同的應(yīng)用二進(jìn)制接口。目前,我們對(duì)WindowsXP到Xen的移植還沒(méi)有完全完成,但是已經(jīng)能夠運(yùn)行簡(jiǎn)單的用戶(hù)空間進(jìn)程。移植NetBSD的工作也在進(jìn)行中。Xen使得用戶(hù)能夠動(dòng)態(tài)地實(shí)例化一個(gè)操作系統(tǒng)以執(zhí)行他們需要的應(yīng)用。在XenoServer項(xiàng)目15,35中,我們?cè)贗SP或者Internetexchange(布置在這些場(chǎng)合中經(jīng)濟(jì)劃算而且又具有戰(zhàn)略意

4、義的地方)的標(biāo)準(zhǔn)服務(wù)器硬件上配置了Xen。我們?cè)趩?dòng)一個(gè)新的虛擬機(jī)的時(shí)候需要執(zhí)行許可控制(admissioncontrol),希望每個(gè)虛擬機(jī)能夠以某種方式為它需要的資源付出代價(jià)。我們?cè)谄渌恼轮杏懻撨^(guò)我們?cè)谶@個(gè)方向上的思路和方法21;現(xiàn)在這篇文章則將焦點(diǎn)關(guān)注于虛擬機(jī)。現(xiàn)在有一些方法用于構(gòu)建能夠在共享的機(jī)器上操控多個(gè)應(yīng)用和服務(wù)器(/server:這里提到的server應(yīng)該是大規(guī)模應(yīng)用的意思,比如數(shù)據(jù)庫(kù)服務(wù)器)的系統(tǒng)。也許最簡(jiǎn)單的方法就是部署一個(gè)或多個(gè)運(yùn)行著標(biāo)準(zhǔn)操作系統(tǒng)(如Linux或者Windows)的主機(jī),然后允許用戶(hù)們安裝文件和啟動(dòng)進(jìn)程應(yīng)用間的保護(hù)是由傳統(tǒng)的操作系統(tǒng)技術(shù)提供的(/這里提到的做

5、法,就是類(lèi)似并行機(jī)性質(zhì)的,各個(gè)節(jié)點(diǎn)都是獨(dú)立的主機(jī),但是一個(gè)應(yīng)用可以在多個(gè)節(jié)點(diǎn)上面并行執(zhí)行)。實(shí)驗(yàn)顯示:由于要針對(duì)各個(gè)脫節(jié)(/supposedlydisjoint:邏輯上脫節(jié),指的是應(yīng)用不具有連貫性/兼容性,所以針對(duì)每個(gè)應(yīng)用都要單獨(dú)配置一次,如果能想辦法將前后有關(guān)聯(lián)的應(yīng)用放在一起執(zhí)行,可以大大減少相關(guān)的開(kāi)銷(xiāo),如配置開(kāi)銷(xiāo),通信開(kāi)銷(xiāo)等等)的應(yīng)用進(jìn)行復(fù)雜的配置,這些配置過(guò)程導(dǎo)致的交互行為會(huì)使系統(tǒng)管理任務(wù)迅速成為時(shí)間消耗巨大的任務(wù)。更重要的是,這樣的系統(tǒng)不能夠充分地支持性能隔離;某個(gè)進(jìn)程的調(diào)度優(yōu)先級(jí),存儲(chǔ)要求,網(wǎng)絡(luò)通信量和磁盤(pán)訪問(wèn)等等特征都會(huì)影響到其它進(jìn)程的性能。如果是在資源供應(yīng)充足而且用戶(hù)群體是限定(

6、比如計(jì)算網(wǎng)格或者PlanetLab平臺(tái)實(shí)驗(yàn))的情況下,這個(gè)系統(tǒng)還是可以接受的。但是當(dāng)資源是供不應(yīng)求的時(shí)候,或者用戶(hù)間不相協(xié)作(/uncooperative:不相協(xié)作,比如用戶(hù)間的需求有沖突,那么一定會(huì)互相影響的)的時(shí)候就不行了。一個(gè)解決這個(gè)問(wèn)題的方法是改進(jìn)對(duì)操作系統(tǒng)性能隔離的支持。這已經(jīng)在resourcecontainers,Linux/RK,QLinux和SILK中被或多或少地實(shí)現(xiàn)了。這些方法中存在著一個(gè)難點(diǎn)是難以確保所有的資源都能夠正確地分配給有相應(yīng)資源需求的進(jìn)程。例如,緩沖區(qū)cache或者存儲(chǔ)頁(yè)面的替換算法導(dǎo)致的在應(yīng)用間的復(fù)雜的交互行為(/比如存儲(chǔ)頁(yè)面替換的時(shí)候,某個(gè)進(jìn)程的頁(yè)面替換序列會(huì)

7、干擾到其它進(jìn)程的,要免除這個(gè)影響就需要有復(fù)雜的機(jī)制用于進(jìn)程間的協(xié)調(diào))。這就是存在于操作系統(tǒng)中的“QoS干擾問(wèn)題(QoScrosstalk)”。在低層采用多路執(zhí)行技術(shù)能夠緩解這個(gè)問(wèn)題帶來(lái)的影響,這已經(jīng)在Exokerne和Nemesis操作系統(tǒng)中得到證明。在這些操作系統(tǒng)中,任務(wù)間無(wú)意識(shí)的或者不受歡迎的交互行為被最小化了。我們使用了同樣的基本方法來(lái)構(gòu)建Xen。Xen就是以整個(gè)操作系統(tǒng)的粒度復(fù)用物理資源,它能夠提供在操作系統(tǒng)間的性能隔離。相對(duì)于進(jìn)程級(jí)的資源復(fù)用,Xen要允許一定范圍內(nèi)的guestOS“和平”共存,而并非去指定一個(gè)特殊的應(yīng)用二進(jìn)制接口(如果限定了應(yīng)用二進(jìn)制接口,就意味著只能支持某個(gè)特定的

8、操作系統(tǒng))。為了獲得這種靈活性就必須付出一些代價(jià)無(wú)論是在初始化過(guò)程(比如,boot和resume與fork和exec的比較)中,還是在資源消費(fèi)上,運(yùn)行一個(gè)完整的操作系統(tǒng)與運(yùn)行一個(gè)進(jìn)程相比分量都要重得多。為了達(dá)到我們的能夠支持多至100個(gè)被操控的操作系統(tǒng)實(shí)例的目標(biāo),我們認(rèn)為這些代價(jià)是值得付出的。付出這些代價(jià)后獲得的系統(tǒng)允許單個(gè)用戶(hù)在資源受控的形式下,直接運(yùn)行那些不需要修改的二進(jìn)制代碼或者二進(jìn)制代碼集合(例如,后端為PostgreSQL的Apache服務(wù)器)。更進(jìn)一步的,因?yàn)橛脩?hù)能夠動(dòng)態(tài)地精確創(chuàng)建他們的軟件所需要的執(zhí)行環(huán)境,所以這個(gè)系統(tǒng)也就提供了在非常高的層次上的靈活性。另外,在各種服務(wù)和應(yīng)用間的

9、配置交互也是可以避免的(例如,每個(gè)Windows實(shí)例都有它們自己的寄存器文件)。本文的余下部分是這樣組織的:第2部分解釋了我們的虛擬化方法和Xen的工作概況。第3部分描述了我們的設(shè)計(jì)和實(shí)現(xiàn)的關(guān)鍵特征。第4部分給出了使用業(yè)界標(biāo)準(zhǔn)的測(cè)試程序評(píng)估運(yùn)行在Xen上的XenoLinux與單獨(dú)的Linux,VMwareWorkstation和用戶(hù)模式Linu(UML)的性能比較結(jié)果。最后的第5部分討論了未來(lái)的工作并作了總結(jié)。2.Xen:方法和概述在傳統(tǒng)的VMM中,虛擬硬件的功能是與底層機(jī)器上的真實(shí)硬件完全相同的。這種“完全虛擬化”(fullvirtualization)的方法最顯而易見(jiàn)的好處在于操作系統(tǒng)可以

10、不經(jīng)任何修改就直接在虛擬硬件上運(yùn)行,但是它也有很多缺點(diǎn)。特別是針對(duì)那些當(dāng)前被廣泛應(yīng)用的IA32(或者稱(chēng)作x86)架構(gòu),這種方法帶來(lái)的缺陷更是不容忽視。x86架構(gòu)的設(shè)計(jì)從來(lái)就不支持完全的虛擬化。如果要正確實(shí)現(xiàn)x86架構(gòu)虛擬化,VMM就必須能夠?qū)δ硯讞l特定的“超級(jí)指令(supervisorinstruction)進(jìn)行操作。但是,如果在沒(méi)有足夠特權(quán)的情況下執(zhí)行這些超級(jí)指令會(huì)導(dǎo)致“沉默的失?。?failsilently:如果特權(quán)級(jí)不夠,那么會(huì)直接導(dǎo)致執(zhí)行失敗,不會(huì)產(chǎn)生其它響應(yīng))”,而并非產(chǎn)生一個(gè)便于我們使用的陷阱(trap)。另外,將x86架構(gòu)中的MMU進(jìn)行有效的虛擬化也是一件很困難的事情。這些問(wèn)題是

11、可以被解決的,但是在解決的同時(shí)必須要付出操作復(fù)雜度增加和系統(tǒng)性能降低的代價(jià)。VMwareESXServer10需要?jiǎng)討B(tài)地重寫(xiě)那些被VMM操控的機(jī)器碼部分,在其中有可能需要VMM干涉的地方插入陷阱操作(/在什么地方插入陷阱操作,是在程序運(yùn)行起來(lái)后才知道的,所以需要?jiǎng)討B(tài)地重寫(xiě)相關(guān)代碼)。因?yàn)閯?wù)必要對(duì)所有那些不能夠引起陷阱的特權(quán)指令進(jìn)行捕捉和操作,所以這種轉(zhuǎn)換(動(dòng)態(tài)重寫(xiě)代碼)要被應(yīng)用于整個(gè)guestOS的內(nèi)核(導(dǎo)致了相關(guān)的轉(zhuǎn)換,執(zhí)行和緩存等開(kāi)銷(xiāo))。ESXServer實(shí)現(xiàn)中采用的技術(shù)是建立系統(tǒng)結(jié)構(gòu)(systemstructure)(比如頁(yè)表)的影子版本,通過(guò)為每一次“更新”操作設(shè)立陷阱來(lái)解決虛擬頁(yè)表和

12、物理頁(yè)表的一致性問(wèn)題(具體細(xì)節(jié)還是要看ESXServer的說(shuō)明)。但是在處理“更新密集”型的操作(如創(chuàng)建新的應(yīng)用進(jìn)程)的時(shí)候,該方法會(huì)帶來(lái)高昂的開(kāi)銷(xiāo)。除了x86架構(gòu)非常復(fù)雜的原因,還有一些其它方面的爭(zhēng)論反對(duì)“完全虛擬化”。其中值得一提的是,被操控的操作系統(tǒng)在一些情況下需要接觸到真實(shí)的資源。例如,提供真實(shí)時(shí)間和虛擬時(shí)間以允許guestOS能夠更好地支持“時(shí)間敏感”型的任務(wù),還可以正確地操作TCP超時(shí)和RTT估算;給出真實(shí)的機(jī)器地址以允許guestOS能夠利用超級(jí)頁(yè)(superpage)或者頁(yè)染色(pagecoloring)等方法改進(jìn)性能。我們提出的虛擬機(jī)抽象能夠避免完全虛擬化帶來(lái)的種種缺陷。這種

13、虛擬機(jī)抽象和底層硬件相似卻并不完全相同,因此被稱(chēng)之為準(zhǔn)虛擬化(/paravirtualization:或者翻譯為半虛擬化后面譯文沿用準(zhǔn)虛擬化)方法。這種方法雖然需要對(duì)guestOS進(jìn)行一些改動(dòng),但是它能夠改善性能。還有特別重要的一點(diǎn)需要說(shuō)明:準(zhǔn)虛擬化方法不會(huì)對(duì)應(yīng)用二進(jìn)制接口(ABI)進(jìn)行修改,因此用戶(hù)也就不用修改那些在guestOS上執(zhí)行的應(yīng)用程序。我們進(jìn)行的關(guān)于準(zhǔn)虛擬化方法的討論要遵循以下一些規(guī)則:1.最基本的是要支持那些不經(jīng)改動(dòng)的應(yīng)用二進(jìn)制文件的執(zhí)行,即用戶(hù)不用對(duì)應(yīng)用程序做針對(duì)Xen的轉(zhuǎn)換。因此我們必須虛擬化現(xiàn)有的標(biāo)準(zhǔn)ABI所需的全部體系結(jié)構(gòu)特征。2很重要的一點(diǎn)是要支持完整的多應(yīng)用操作系統(tǒng)

14、。這就需要將在單個(gè)guestOS實(shí)例中的復(fù)雜的服務(wù)器配置虛擬化(例如,如果guestOS上配置了ftp服務(wù),那么虛擬硬件就要打開(kāi)相應(yīng)端口)。準(zhǔn)虛擬化務(wù)必要有很高的性能。另外針對(duì)那些不協(xié)作(uncooperative:這里的不協(xié)作是指硬件架構(gòu)不支持共享,所以才需要資源隔離)的機(jī)器架構(gòu),如x86架構(gòu),準(zhǔn)虛擬化還需要能夠提供很強(qiáng)的資源隔離能力。在協(xié)作(cooperative)的機(jī)器架構(gòu)上,準(zhǔn)虛擬化方法要能夠完全地隱藏資源虛擬化帶來(lái)的影響,減少guestOS在正確性和性能上面臨的風(fēng)險(xiǎn)。請(qǐng)注意,我們?cè)谶@里提出的準(zhǔn)虛擬化的x86抽象的方法是與最近在Denali項(xiàng)目中提出的方法有很大差異的。Denali是為

15、了支持?jǐn)?shù)以千計(jì)的運(yùn)行著網(wǎng)絡(luò)服務(wù)的虛擬機(jī)而設(shè)計(jì)的。這些網(wǎng)絡(luò)服務(wù)中絕大部分是小規(guī)模的,不流行(/應(yīng)用的不流行也就說(shuō)明了運(yùn)行該應(yīng)用的環(huán)境比較少,所以只要針對(duì)這些相應(yīng)的特定環(huán)境作專(zhuān)門(mén)的虛擬化即可)的應(yīng)用。與之相反的是,Xen的設(shè)計(jì)最終要支持近100個(gè)運(yùn)行著業(yè)界標(biāo)準(zhǔn)應(yīng)用和服務(wù)的虛擬機(jī)。由于設(shè)計(jì)目標(biāo)的極大差異,我們不妨將Denali的設(shè)計(jì)選擇和我們自己的設(shè)計(jì)規(guī)則做一個(gè)有益的討論。首先,Denali不需要關(guān)注現(xiàn)有的ABI,因此他們的VM接口忽略掉了相關(guān)的架構(gòu)特征。例如,Denali并不完全支持x86的分段機(jī)制,但是這一點(diǎn)卻是在NetBSD,Linux和WindowsXP等操作系統(tǒng)的ABI中都有提出并且被廣泛

16、使用。例如,線(xiàn)程庫(kù)中經(jīng)常會(huì)使用分段機(jī)制來(lái)尋址線(xiàn)程局部數(shù)據(jù)。其次,Denali的實(shí)現(xiàn)沒(méi)有解決在單個(gè)guestOS中支持多個(gè)應(yīng)用(applicationmultiplexing)的問(wèn)題,也沒(méi)有解決多地址空間的問(wèn)題。應(yīng)用被顯式地鏈接到IlwacoguestOS實(shí)例上,這么做在某種意義上類(lèi)似于之前在Exokernel中的libOS23。因此每個(gè)虛擬機(jī)只能操控一個(gè)單用戶(hù)單應(yīng)用的沒(méi)有保護(hù)措施的所謂的“操作系統(tǒng)”。在Xen中,與之相反,每個(gè)虛擬機(jī)上能夠操控一個(gè)真正的操作系統(tǒng)。這個(gè)操作系統(tǒng)上能夠安全地執(zhí)行數(shù)以千計(jì)個(gè)不經(jīng)改動(dòng)的用戶(hù)級(jí)進(jìn)程。雖然Denali號(hào)稱(chēng)開(kāi)發(fā)了一個(gè)虛擬MMU原型能夠?qū)ζ湓谠擃I(lǐng)域有所幫助,但是

17、我們沒(méi)有看到公開(kāi)的技術(shù)細(xì)節(jié)和評(píng)估報(bào)告。再次,在Denali體系結(jié)構(gòu)中,是由VMM執(zhí)行全部的內(nèi)存與磁盤(pán)間的頁(yè)面調(diào)度的。這可能是與虛擬層缺乏存儲(chǔ)管理支持有關(guān)。由VMM完成頁(yè)面調(diào)度是與我們的性能隔離目標(biāo)相違背的:那些“有惡意”的虛擬機(jī)可能會(huì)故意產(chǎn)生抖動(dòng)行為,導(dǎo)致其它虛擬機(jī)的CPU時(shí)間和磁盤(pán)帶寬被不公平地剝奪(/VMM監(jiān)控很多VM,各個(gè)VM上再跑操作系統(tǒng),所以如果很多事情都放在VMM中做必然會(huì)影響到各個(gè)VM;所以要把一些事情放在上面的操作系統(tǒng)做來(lái)達(dá)到隔離性)。在Xen中,我們希望每個(gè)guestOS在其自己分配到的內(nèi)存空間和磁盤(pán)區(qū)域內(nèi)執(zhí)行它自己的頁(yè)面調(diào)度(此前已經(jīng)有self-paging的方法被提出)。

18、最后,Denali為機(jī)器的全部資源虛擬了“名字空間”。這樣的話(huà),如果一個(gè)VM不能夠“叫出”另一個(gè)VM下轄的資源的名字,那么該VM就不能夠訪問(wèn)這些資源(例如,Denali中的VM并不知道硬件地址,它們只看得到Denali創(chuàng)建的虛擬地址)。與此相對(duì),我們認(rèn)為hypervisor中的安全訪問(wèn)控制已經(jīng)足以確保安全性;此外,就像之前討論過(guò)的,當(dāng)前在guestOS是否應(yīng)該能夠直接看到物理資源這一點(diǎn)上存在著很熱烈的關(guān)于正確性和性能的爭(zhēng)論。在后續(xù)的章節(jié)里,我們將描述Xen提出的虛擬機(jī)抽象,然后將討論如何將一個(gè)guestOS作必要的改動(dòng)以適應(yīng)Xen。在這篇文章里我們定義了一些術(shù)語(yǔ)要提醒大家注意。例如,術(shù)語(yǔ)gue

19、stOS是指Xen能夠操控的操作系統(tǒng)之一;術(shù)語(yǔ)domain是指一個(gè)運(yùn)行中的虛擬機(jī),在其上有一個(gè)guestOS在執(zhí)行。program和process之間的區(qū)別和傳統(tǒng)系統(tǒng)中的區(qū)別類(lèi)似。我們稱(chēng)Xen本身為hypervisor,因?yàn)樗\(yùn)行的特權(quán)級(jí)要比它所操控的guestOS中的supervisorcode運(yùn)行的特權(quán)級(jí)更高。2.1虛擬機(jī)接口一個(gè)準(zhǔn)虛擬化的x86接口主要包括了系統(tǒng)中的三個(gè)大的方面:存儲(chǔ)管理,CPU和設(shè)備I/O。在下面,我們將依次介紹各個(gè)機(jī)器子系統(tǒng)的情況,并討論在我們的準(zhǔn)虛擬化架構(gòu)中是如何體現(xiàn)的。雖然在我們的實(shí)現(xiàn)中,有相當(dāng)一部分,如存儲(chǔ)管理,是專(zhuān)門(mén)針對(duì)x86的,但是實(shí)際上還有很多方面(比如我

20、們虛擬的CPU和I/O設(shè)備)都是可以很容易地應(yīng)用于其它機(jī)器架構(gòu)上的。更進(jìn)一步地說(shuō),在與RISC架構(gòu)在實(shí)現(xiàn)上有差異的很多地方,x86往往表現(xiàn)出的是該方面最壞情況時(shí)的情形。例如,對(duì)硬件頁(yè)表進(jìn)行有效的虛擬化就比虛擬化一個(gè)軟件管理的TLB困難很多。存儲(chǔ)管理分段不能夠使用具有完全特權(quán)級(jí)的段描述符,不能夠與線(xiàn)性地址空間的最頂部交迭(/因?yàn)樽铐敳渴荴en)。分頁(yè)guestOS直接對(duì)硬件頁(yè)表做讀訪問(wèn),但是更新(就是寫(xiě))是分批進(jìn)行的而且要經(jīng)過(guò)hypervisor確認(rèn)。一個(gè)domain可以被分配在不連續(xù)的頁(yè)面上。CPU保護(hù)guestOS必須運(yùn)行在低于Xen的特權(quán)級(jí)上。異常guestOS必須將異常句柄的描述符表在X

21、en中記錄。除了頁(yè)面錯(cuò)誤外,其它句柄和真實(shí)的x86架構(gòu)相同。系統(tǒng)調(diào)用guestOS為系統(tǒng)調(diào)用提供一個(gè)“快速”的句柄。允許應(yīng)用直接調(diào)用它所在的guestOS,而不必間接地通過(guò)Xen完成每次調(diào)用。中斷硬件中斷被一個(gè)輕量級(jí)的事件系統(tǒng)替換。時(shí)間每個(gè)guestOS具有一個(gè)定時(shí)器接口,可以得到“真實(shí)的”和“虛擬的”時(shí)間。設(shè)備I/O網(wǎng)絡(luò),磁盤(pán),虛擬設(shè)備訪問(wèn)起來(lái)很簡(jiǎn)單。數(shù)據(jù)傳遞使用的是異步I/O環(huán)。由一個(gè)事件機(jī)制替換硬件中斷來(lái)發(fā)布通告。2.1.1存儲(chǔ)管理虛擬化存儲(chǔ)毫無(wú)疑問(wèn)是準(zhǔn)虛擬化一個(gè)體系結(jié)構(gòu)中最困難的部分,它包括hypervisor所需的機(jī)制和移植各個(gè)guestOS所需的改動(dòng)。如果在架構(gòu)中提供了由軟件管理的

22、TLB的話(huà),那么這個(gè)任務(wù)會(huì)變得輕松些,它們可以以比較簡(jiǎn)單的方式被有效地虛擬化13。帶標(biāo)記的TLB是另外一個(gè)在大部分RISC架構(gòu)(這些RISC架構(gòu)主要用于構(gòu)建服務(wù)器,比如Alpha,MIPS和SPARC)中支持的有用特征。其中,每個(gè)TLB項(xiàng)都有和地址空間標(biāo)識(shí)符相關(guān)的標(biāo)記,這使得hypervisor和各個(gè)guestOS能夠有效地在被隔離開(kāi)的地址空間內(nèi)共存。這時(shí)在執(zhí)行轉(zhuǎn)移(/transferringexecution:在進(jìn)程執(zhí)行間切換的時(shí)候,執(zhí)行的指令序列從一個(gè)進(jìn)程轉(zhuǎn)移到另一個(gè)進(jìn)程,稱(chēng)為執(zhí)行轉(zhuǎn)移)的時(shí)候,是不需要刷新(flush)整個(gè)TLB(只對(duì)具有和自己的地址空間標(biāo)識(shí)符相吻合的TLB項(xiàng)進(jìn)行操作)。

23、不幸的是,x86架構(gòu)并沒(méi)有由軟件管理的TLB;取而代之的是在發(fā)生TLB失效的時(shí)候,處理器會(huì)自動(dòng)通過(guò)遍歷硬件頁(yè)表結(jié)構(gòu)來(lái)處理。因此為了獲得最好的可能達(dá)到的性能,當(dāng)前地址空間內(nèi)所有的有效頁(yè)傳輸)都要在硬件可訪問(wèn)的頁(yè)表中給出(/最好情況理應(yīng)如此,但實(shí)際如何做得到呢?)。此外,因?yàn)門(mén)LB是沒(méi)有標(biāo)記的,所以地址空間的切換需要整個(gè)TLB的刷新。在這些限制下,我們作出了兩個(gè)決定:(i)由guestOS負(fù)責(zé)分配和管理硬件頁(yè)表,這么做最小化了Xen對(duì)頁(yè)表操作的影響,確保了安全性和隔離性;(ii)Xen處于每個(gè)地址空間的最頂部的64MB空間內(nèi),因此避免了在進(jìn)入和離開(kāi)hypervisor時(shí)進(jìn)行TLB刷新操作(/這個(gè)要

24、看源代碼才能最后搞清楚)。每當(dāng)guestOS需要一個(gè)新的頁(yè)表,例如創(chuàng)建了一個(gè)新進(jìn)程,它就在自己保留的內(nèi)存空間內(nèi)分配和初始化一個(gè)頁(yè)面,并且將其在Xen中記錄。此時(shí)操作系統(tǒng)必須放棄對(duì)頁(yè)表存儲(chǔ)空間直接寫(xiě)的權(quán)限:所有后續(xù)的更新操作都必須由Xen進(jìn)行確認(rèn)。這就在很多方面限制了更新操作,包括只允許操作系統(tǒng)它自己所屬的頁(yè)進(jìn)行映射操作,不允許對(duì)頁(yè)表進(jìn)行可寫(xiě)的映射操作。guestOS可以成批地進(jìn)行更新操作以減少每次更新都要進(jìn)入hypervisor帶來(lái)的代價(jià)(/因?yàn)槊看胃露家猦ypervisor確認(rèn))。每個(gè)地址空間頂部的64MB區(qū)域是保留給Xen的,是不能夠被guestOS訪問(wèn)或者重新進(jìn)行映射的。因?yàn)槿魏瓮ǔ5?/p>

25、x86架構(gòu)中的ABI都不會(huì)使用到這個(gè)區(qū)域中的地址,所以這個(gè)約束不會(huì)破壞到應(yīng)用程序的兼容性。分段機(jī)制也是以類(lèi)似的方式,通過(guò)對(duì)硬件段描述符表的更新確認(rèn)來(lái)進(jìn)行虛擬化(/這樣做就達(dá)到虛擬化的目的了么?哦,應(yīng)該是Xen在確認(rèn)后接著由Xen執(zhí)行,嗯)。對(duì)于x86架構(gòu)上段描述符的限制只有:(i)它們的特權(quán)級(jí)別必須比Xen要低;(ii)它們不能夠?qū)Φ刂房臻g中Xen的保留部分進(jìn)行訪問(wèn)。2.1.2CPU虛擬化CPU對(duì)guestOS提出了幾個(gè)要求。因?yàn)閔ypervisor插在操作系統(tǒng)的下層違背了慣常的關(guān)于操作系統(tǒng)在整個(gè)系統(tǒng)中特權(quán)最高的假設(shè)。為了保護(hù)hypervisor不會(huì)受到操作系統(tǒng)不正確行為的影響(即domain

26、不受另一個(gè)domain的影響),guestOS就必須被改造為能夠運(yùn)行在較低的特權(quán)級(jí)上。很多處理器體系結(jié)構(gòu)只是提供了兩個(gè)特權(quán)級(jí)。在這些情況下,guestOS和應(yīng)用程序共享較低的特權(quán)級(jí)。同時(shí),guestOS運(yùn)行在單獨(dú)的地址空間中以保護(hù)自己不會(huì)受到應(yīng)用程序執(zhí)行的影響。guestOS通過(guò)hypervisor設(shè)定虛擬的特權(quán)級(jí)和改變當(dāng)前的地址空間來(lái)間接地和應(yīng)用之間進(jìn)行控制傳遞。另外,如果處理器的TLB支持地址空間標(biāo)記,那么也就可以避免TLB刷新帶來(lái)的高昂代價(jià)。在x86架構(gòu)上有效地實(shí)現(xiàn)特權(quán)級(jí)的虛擬化是可能的,因?yàn)閤86架構(gòu)在硬件上支持四個(gè)不同的特權(quán)級(jí)。x86架構(gòu)的特權(quán)級(jí)往往用圈(ring)來(lái)表示,從ring

27、0(最高特權(quán))到ring3(最低特權(quán))。操作系統(tǒng)的代碼運(yùn)行在ring0這個(gè)特權(quán)級(jí)上,因?yàn)樵贈(zèng)]有其它的ring能夠執(zhí)行那些特權(quán)指令。ring3通常用于執(zhí)行應(yīng)用代碼。就我們所知,自O(shè)S/2起到現(xiàn)在的各個(gè)知名的x86架構(gòu)上的操作系統(tǒng)都還沒(méi)有利用ring1和ring2這兩個(gè)特權(quán)級(jí)的。那么,任何遵循這個(gè)通常的安排的操作系統(tǒng)(/沒(méi)有利用ring1和ring2)就都可以移植到Xen上來(lái)。這個(gè)移植過(guò)程只需要做一些改動(dòng)使操作系統(tǒng)改為運(yùn)行在ring1特權(quán)級(jí)上。這就防止了guestOS會(huì)直接執(zhí)行特權(quán)指令,也保證了操作系統(tǒng)與運(yùn)行在ring3上的應(yīng)用程序之間相隔離的安全性。特權(quán)指令需要被Xen確認(rèn)和執(zhí)行以達(dá)到準(zhǔn)虛擬化的

28、目的,這主要應(yīng)用于諸如安置新的頁(yè)表,或者在處理器idle時(shí)放棄之(而不是去hit它)等操作。因?yàn)橹挥蠿en有足夠高的特權(quán)級(jí)來(lái)執(zhí)行這些指令,所以任何guestOS試圖直接運(yùn)行特權(quán)指令都會(huì)失敗,后果要么是“沉默”要么是產(chǎn)生錯(cuò)誤。異常,包括內(nèi)存錯(cuò)誤和軟件陷阱,都可以在x86架構(gòu)的基礎(chǔ)上直接進(jìn)行虛擬化。有一個(gè)表,內(nèi)容為對(duì)每類(lèi)異常進(jìn)行描述的句柄。表中所列的異常都是在Xen中有記錄的,以用作確認(rèn)。表中給出的句柄都是與真正的x86硬件中相同的;之所以這一點(diǎn)是可能做到的,主要是因?yàn)樵谖覀兊臏?zhǔn)虛擬化架構(gòu)中,異常堆棧框架是沒(méi)有被修改的。唯一的一個(gè)改動(dòng)是在頁(yè)面錯(cuò)誤句柄上。因?yàn)樵摼浔牟僮餍枰獜奶貦?quán)處理器寄存器(CR

29、2)中讀出出錯(cuò)的地址;但是這是不可能的(因?yàn)樘貦?quán)級(jí)別不夠了),我們就將它(頁(yè)面錯(cuò)誤句柄?CR2的值?)寫(xiě)入擴(kuò)展的堆棧框架中(后來(lái)發(fā)現(xiàn),在移植XP的時(shí)候,將這個(gè)值寫(xiě)入一個(gè)預(yù)先商定的共享存儲(chǔ)位置上要比修改堆??蚣芎?jiǎn)單一些)。當(dāng)系統(tǒng)在ring0以外執(zhí)行時(shí)有異常發(fā)生,Xen的句柄就會(huì)在guestOS堆棧中創(chuàng)建一個(gè)異常堆棧框架的拷貝,并且會(huì)將控制交給相應(yīng)的已經(jīng)記錄過(guò)的異常句柄。典型的,只有兩類(lèi)異常會(huì)經(jīng)常發(fā)生而影響到系統(tǒng)的性能:系統(tǒng)調(diào)用(一般都是通過(guò)軟件異常實(shí)現(xiàn))和頁(yè)面錯(cuò)誤。我們讓每個(gè)guestOS都記錄一個(gè)“快速的”異常操作句柄來(lái)改進(jìn)系統(tǒng)調(diào)用的性能。這個(gè)異常操作句柄可以直接由處理器使用,而不必非要間接地

30、經(jīng)過(guò)ring0;這個(gè)句柄在放置進(jìn)硬件異常列表中之前就是經(jīng)過(guò)確認(rèn)的(所以不必經(jīng)過(guò)Xen)。不幸的是,我們不可能使用同樣的技術(shù)來(lái)處理頁(yè)面錯(cuò)誤句柄,因?yàn)橹挥心切┻\(yùn)行在ring0的代碼才能夠從寄存器CR2中讀出錯(cuò)誤的地址;因此,頁(yè)面錯(cuò)誤必須要經(jīng)過(guò)Xen才能提交,Xen保存該寄存器的值供來(lái)自ring1的訪問(wèn)使用。當(dāng)Xen發(fā)現(xiàn)異常產(chǎn)生時(shí),它會(huì)對(duì)異常句柄進(jìn)行確認(rèn)以確保安全性。這只需要檢查句柄的代碼段中是否含有指明要在ring0中執(zhí)行的操作。既然沒(méi)有g(shù)uestOS能夠創(chuàng)建這樣一個(gè)段,那么只需要將專(zhuān)門(mén)的段選擇符和少量的保留在Xen中的靜態(tài)值作比較即可。除了這點(diǎn)以外,任何其它的句柄問(wèn)題都會(huì)在異常傳播(except

31、ionpropagation)(/一個(gè)異常導(dǎo)致了另一個(gè)異常的產(chǎn)生)的過(guò)程中被修正。例如,如果句柄缺少相應(yīng)代碼段或者句柄沒(méi)有分配到內(nèi)存頁(yè),那么在Xen為將控制返回給句柄而執(zhí)行iret指令的時(shí)候就會(huì)有一個(gè)相應(yīng)的錯(cuò)誤產(chǎn)生。Xen通過(guò)檢查出錯(cuò)的程序計(jì)數(shù)器值來(lái)檢測(cè)這些雙錯(cuò)誤(/doublefaults:之前已經(jīng)出錯(cuò)了,現(xiàn)在到了iret已經(jīng)是第二個(gè)錯(cuò)誤了;第二個(gè)錯(cuò)誤是由第一個(gè)錯(cuò)誤傳播而來(lái))”:如果地址是處于異常虛擬化的代碼中(說(shuō)明異常處理沒(méi)有完成,iret沒(méi)成功),那么guestOS就要被終止。對(duì)于直接的系統(tǒng)調(diào)用句柄來(lái)說(shuō),這種“懶惰(/第一個(gè)錯(cuò)誤發(fā)生的時(shí)候,沒(méi)有被檢查到;直到Xen執(zhí)行了iret之后才報(bào)錯(cuò)

32、)”的檢查也是安全的:當(dāng)CPU試圖直接跳至guestOS句柄的時(shí)候,會(huì)發(fā)生訪問(wèn)錯(cuò)誤(之前的過(guò)程都一樣,只是直接的系統(tǒng)調(diào)用是不經(jīng)過(guò)Xen的)。在這種情況下,產(chǎn)生錯(cuò)誤的地址將處于Xen之外(因?yàn)閄en不會(huì)去執(zhí)行g(shù)uestOS系統(tǒng)調(diào)用),因此錯(cuò)誤就以上文講過(guò)的一般方式進(jìn)行虛擬化即可。如果由于錯(cuò)誤的傳播導(dǎo)致了進(jìn)一步的“雙錯(cuò)誤”,那么guestOS會(huì)像上文談及的一樣被終止。2.1.3設(shè)備I/O在完全虛擬化環(huán)境下需要仿真現(xiàn)有的硬件設(shè)備,而Xen不同于此。Xen給出了一套清楚、簡(jiǎn)單的設(shè)備抽象。這就使得我們能夠設(shè)計(jì)一個(gè)接口以有效地滿(mǎn)足我們對(duì)保護(hù)性和隔離性的需求。為了做到這一點(diǎn),I/O和各個(gè)domain之間的數(shù)

33、據(jù)傳遞都是要經(jīng)過(guò)Xen的,可以使用的方法有共享內(nèi)存,異步緩沖區(qū)描述符環(huán)等。這些方法能夠在Xen有效地執(zhí)行確認(rèn)檢查(例如,檢查緩沖區(qū)是否包括在了domain的存儲(chǔ)空間內(nèi))的同時(shí),為在系統(tǒng)中的豎直方向上傳遞緩沖區(qū)信息提供了一個(gè)高性能的通信機(jī)制。和硬件中斷類(lèi)似,Ken支持一個(gè)輕量級(jí)的事件遞交機(jī)制用于為一個(gè)domain傳送異步通告(notification)。這些通告是在對(duì)未決事件類(lèi)型的位圖進(jìn)行更新的時(shí)候產(chǎn)生的,也可以通過(guò)調(diào)用一個(gè)guestOS專(zhuān)有的事件句柄產(chǎn)生。這些調(diào)用的返回可以由guestOS來(lái)決定是否進(jìn)行“拖延”處理。例如,這么做(/拖延處理)可以避免在頻繁喚醒通告時(shí)帶來(lái)的額外開(kāi)銷(xiāo)。2.2移植O

34、S到Xen的代價(jià)當(dāng)前我們的NetBSD移植還處于非常初級(jí)的階段,因此我們就沒(méi)有將其結(jié)果在這里報(bào)告。雖然XP的移植要更進(jìn)一步,但也還處于移植過(guò)程中;當(dāng)前移植的XP能夠執(zhí)行RAM上的用戶(hù)空間的應(yīng)用,但是缺乏虛擬的I/O驅(qū)動(dòng)?;谶@個(gè)原因,表中就沒(méi)有給出和XP的虛擬設(shè)備驅(qū)動(dòng)相關(guān)的數(shù)據(jù)。無(wú)論怎樣,和Linux一樣,我們可以想見(jiàn)這些驅(qū)動(dòng)應(yīng)該是小的和簡(jiǎn)單的,因?yàn)檫@要得益于Xen提供的理想的硬件抽象。衡量代價(jià)的標(biāo)準(zhǔn)是與原先的x86代碼相比修改或增加的那些必要的注釋以及遵從一定格式的代碼的行數(shù)(不包括設(shè)備驅(qū)動(dòng))。對(duì)WindowsXP中體系結(jié)構(gòu)無(wú)關(guān)(architectureindependent)的代碼所作的改

35、動(dòng)達(dá)到了一個(gè)驚人的數(shù)字,這是因?yàn)閃indowsXP使用了多種多樣的結(jié)構(gòu)和聯(lián)合來(lái)訪問(wèn)頁(yè)表項(xiàng)(PTE)。每次對(duì)頁(yè)表的訪問(wèn)都不得不被單獨(dú)地進(jìn)行修改(/因?yàn)槊看卧L問(wèn)都可能用到不同的結(jié)構(gòu)),當(dāng)然這個(gè)過(guò)程是可以采用一些腳本來(lái)自動(dòng)完成的。與此相反的,Linux需要的改動(dòng)就少了很多,這是因?yàn)長(zhǎng)inux的存儲(chǔ)系統(tǒng)是使用預(yù)處理程序中的宏來(lái)訪問(wèn)PTE的一這些宏定義為增加準(zhǔn)虛擬化所需的轉(zhuǎn)換和hypervisor調(diào)用提供了便利的位置(/就在這些位置上加即可)。在這兩個(gè)操作系統(tǒng)中,體系結(jié)構(gòu)特有(architecturespecific)的部分用于將x86代碼向我們的準(zhǔn)虛擬架構(gòu)的移植。這包括重寫(xiě)那些使用了特權(quán)指令的程序,刪

36、除大量的低層的系統(tǒng)初始化代碼。另外,WindowXP需要有更多的改變,這主要是因?yàn)橹斑z留下來(lái)的16位仿真代碼的存在以及需要一個(gè)略有不同引導(dǎo)加載(boot-loading)機(jī)制。注意,XP中的x86特有的代碼要比Linux多很多,因此可以預(yù)見(jiàn)到在做移植的時(shí)候也就需要做更多的工作。2.3控制和管理貫穿于整個(gè)Xen的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程中,有一個(gè)目標(biāo)就是盡可能地將策略從機(jī)制當(dāng)中剝離出來(lái)。雖然hypervisor必須要被包含在數(shù)據(jù)通路(data-pathaspects)上。例如,在domain之間調(diào)度CPU,在發(fā)送之前過(guò)濾網(wǎng)絡(luò)數(shù)據(jù)包,或者在讀數(shù)據(jù)塊的時(shí)候進(jìn)行執(zhí)行訪問(wèn)控制(/必然的,因?yàn)閄en位于guest

37、OS和底層硬件之間,guestOS又是彼此隔離的,所以數(shù)據(jù)傳遞是一定都要經(jīng)由Xen的)。但是在更高層次的問(wèn)題上,例如CPU如何被共享或者各個(gè)domain能夠發(fā)送哪種數(shù)據(jù)包,這時(shí)就不需要將Xen包括在內(nèi)了,甚至都不用考慮它(/hypervisor是實(shí)現(xiàn)機(jī)制,而如何共享CPU和如何進(jìn)行任務(wù)分工都是策略問(wèn)題)。最終得到的架構(gòu)是hypervisor只是提供那些最基本的控制操作。這些操作經(jīng)由一個(gè)可訪問(wèn)的接口從經(jīng)過(guò)授權(quán)的domain傳來(lái);而那些復(fù)雜的策略決策,比如許可控制(/不知道這個(gè)許可控制是否和第1部分里提到的是一回事兒),都最好由運(yùn)行在guestOS上的管理軟件執(zhí)行,而并非在有特權(quán)的hypervis

38、or代碼中(/Xen只是提供機(jī)制,不負(fù)責(zé)策略)。整個(gè)系統(tǒng)架構(gòu)中有一個(gè)domain是在引導(dǎo)(boot)時(shí)創(chuàng)建的。這個(gè)domain被允許使用控制接口。這個(gè)初始的domain,術(shù)語(yǔ)稱(chēng)為Domain0,它負(fù)責(zé)操控應(yīng)用級(jí)的管理軟件。控制接口具有創(chuàng)建和終止其它domain的能力,還能控制它們相關(guān)的調(diào)度參數(shù)、物理存儲(chǔ)分配以及它們對(duì)給定的物理磁盤(pán)和網(wǎng)絡(luò)設(shè)備的訪問(wèn)。除了處理器和存儲(chǔ)資源,控制接口還支持虛擬網(wǎng)絡(luò)接口(VIF)和塊設(shè)備(VBD:虛擬塊設(shè)備)的創(chuàng)建和刪除。這些虛擬I/O設(shè)備具有一些和訪問(wèn)控制相關(guān)的信息。這些信息決定了哪個(gè)domain能夠訪問(wèn)它們,以及訪問(wèn)時(shí)有哪些約束(例如,一個(gè)只讀的VBD可以被創(chuàng)建,

39、一個(gè)VIF可以過(guò)濾IP包以防止源地址欺騙)。這個(gè)控制接口,結(jié)合對(duì)系統(tǒng)當(dāng)前狀態(tài)進(jìn)行的剖析統(tǒng)計(jì),其結(jié)果能夠被輸出到一套運(yùn)行在Domain0上的應(yīng)用級(jí)管理軟件上。該管理軟件作為管理工具的補(bǔ)充,能夠?qū)φ麄€(gè)服務(wù)器進(jìn)行方便地管理:例如,能夠創(chuàng)建和破壞domain,設(shè)定網(wǎng)絡(luò)過(guò)濾器和路由規(guī)則,在數(shù)據(jù)包和數(shù)據(jù)流兩個(gè)粒度上監(jiān)視每個(gè)domain的網(wǎng)絡(luò)活動(dòng),創(chuàng)建和刪除虛擬網(wǎng)絡(luò)接口和虛擬塊設(shè)備。我們期待開(kāi)發(fā)出高級(jí)的工具來(lái)進(jìn)一步將管理策略的應(yīng)用程序自動(dòng)化(/這里的管理策略和前面講的“機(jī)制與策略分開(kāi)”中的策略不是一回事兒吧?)。ccid_page/3.DETAILEDDESIGN細(xì)節(jié)設(shè)計(jì)在這一部分,我們介紹構(gòu)成基于Xen的

40、服務(wù)器的各個(gè)主要子部分的設(shè)計(jì)細(xì)節(jié)。在各個(gè)設(shè)計(jì)中,我們對(duì)Xen和guestOS的功能作了清楚的說(shuō)明。當(dāng)前的關(guān)于guestOS的討論主要集中于XenoLinux,這主要是因?yàn)檫@個(gè)guestOS是目前發(fā)展最成熟的;但是我們對(duì)于當(dāng)前正在進(jìn)行中的對(duì)WindowsXP和NetBSD的移植工作也是很有信心的。我們相信Xen可以支持多種多樣的guestOS。3.1控制傳遞:hypercalls和事件有兩種機(jī)制用于Xen和其上的domain之間進(jìn)行控制的交互:使用hypercall產(chǎn)生從domain到Xen的同步調(diào)用;使用異步事件機(jī)制完成從Xen到domain的通告遞交。hypercall接口允許domain通

41、過(guò)執(zhí)行一個(gè)同步軟陷阱陷入到hypervisor執(zhí)行一個(gè)特權(quán)操作,這類(lèi)似于在傳統(tǒng)的操作系統(tǒng)中對(duì)系統(tǒng)調(diào)用的使用。舉一個(gè)使用hypercall的例子:一組頁(yè)表更新的請(qǐng)求,要經(jīng)過(guò)Xen確認(rèn)并且完成相應(yīng)的更新操作(更新是要由Xen確認(rèn)并完成的,需要特權(quán)操作,所以這時(shí)要利用hypercall陷入到hypervisor中),在更新完成后再由Xen將控制返回給產(chǎn)生本次調(diào)用的domain。從Xen到domain的通信是由一個(gè)異步事件機(jī)制提供的。這個(gè)機(jī)制取代了常用的利用設(shè)備中斷的遞交機(jī)制,它允許那些重要事件(如domain-terminationrequest)采用輕量級(jí)的通告形式。和傳統(tǒng)的Unix信號(hào)類(lèi)似,這些

42、重要事件的個(gè)數(shù)比較少,但每一個(gè)都用作針對(duì)某一特定類(lèi)型事件的標(biāo)記。例如,用于在網(wǎng)絡(luò)上指出新的數(shù)據(jù)已經(jīng)被接收到的事件,或者表示一個(gè)虛擬磁盤(pán)請(qǐng)求已經(jīng)完成的事件。那些未決的事件存放在每個(gè)domain的bitmask(一個(gè)專(zhuān)門(mén)的數(shù)據(jù)結(jié)構(gòu))中。bitmask的更新要由Xen在調(diào)用一個(gè)和guestOS相應(yīng)的事件調(diào)用返回句柄之前完成(/Xen針對(duì)某類(lèi)事件要向上發(fā)通告,如果Xen調(diào)用了guestOS相應(yīng)的事件調(diào)用返回句柄,就說(shuō)明該事件完成了,下面要把控制交回給domain,所以必然要在調(diào)用事件調(diào)用返回句柄之前由Xen將bitmask更新)。調(diào)用返回句柄負(fù)責(zé)重新設(shè)置未決事件集合(調(diào)用返回句柄仍舊是由Xen操作,更

43、新bitmask),同時(shí)以相應(yīng)的行為和通告相呼應(yīng)。一個(gè)domain可以通過(guò)設(shè)置一個(gè)Xen可讀的軟件標(biāo)記來(lái)顯式地推遲對(duì)事件操作:這一點(diǎn)是與在真實(shí)的處理器中禁止中斷的過(guò)程類(lèi)似的。3.2數(shù)據(jù)傳遞:I/O環(huán)hypervisor的存在意味著在guestOS和I/O設(shè)備之間有一個(gè)額外的保護(hù)域,所以數(shù)據(jù)的傳遞機(jī)制就變得至關(guān)重要。數(shù)據(jù)傳遞機(jī)制使得數(shù)據(jù)能夠在系統(tǒng)中沿著豎直方向移動(dòng),同時(shí)具有盡量小的開(kāi)銷(xiāo)。有兩個(gè)主要方面構(gòu)成了我們對(duì)I/O傳遞機(jī)制的設(shè)計(jì):資源管理和事件通告。為了做到resourceaccountability,我們?cè)诮邮盏揭粋€(gè)來(lái)自設(shè)備的中斷后,要盡量減少在將多路數(shù)據(jù)分解(/demultiplexda

44、ta:分解多路數(shù)據(jù),數(shù)據(jù)自硬件設(shè)備傳來(lái),需要傳遞給各個(gè)指定的domain中的guestOS中執(zhí)行,這里就存在一個(gè)多路選擇的問(wèn)題來(lái)確定究竟把數(shù)據(jù)傳給哪個(gè)domain;一旦確定了數(shù)據(jù)是傳給哪個(gè)domain的,也就說(shuō)明了此時(shí)是哪個(gè)domain在使用相關(guān)設(shè)備,做到了resourceaccountability)到一個(gè)特定的domain中所做的工作管理緩沖區(qū)帶來(lái)的開(kāi)銷(xiāo)是在計(jì)算任務(wù)分配給相應(yīng)的domain后產(chǎn)生的(/任務(wù)分給domain后,domain才開(kāi)始對(duì)任務(wù)數(shù)據(jù)所處的那部分緩沖區(qū)進(jìn)行管理,而并非用其它的機(jī)制對(duì)整個(gè)緩沖區(qū)統(tǒng)一管理,那樣會(huì)增加復(fù)雜性,而且缺乏保障)。類(lèi)似的,設(shè)備I/O的訪存操作也是由相應(yīng)

45、的domain提供的,這么做可以防止由于共享緩沖池導(dǎo)致的相互間的干擾(如果I/O能夠直接訪存而不經(jīng)過(guò)domain管理的話(huà),就會(huì)產(chǎn)生混亂,比如不清楚I/O操作存取到的數(shù)據(jù)是屬于哪個(gè)domain的);I/O緩沖在數(shù)據(jù)傳遞過(guò)程中通過(guò)Xen內(nèi)部綁定(pin)至U底層頁(yè)框上面的方法來(lái)獲得保護(hù)。I/O描述符環(huán)是一個(gè)循環(huán)隊(duì)列,它由domain分派的描述符組成,可以從Xen內(nèi)部訪問(wèn)到。描述符中并不直接包含有I/O數(shù)據(jù);取而代之的是,I/O數(shù)據(jù)緩沖被guestOS在帶寬外分配再間接地由I/O描述符引用(/I/O描述符環(huán)的容量是有限的,所以I/O數(shù)據(jù)要先進(jìn)行分配,再做向I/O描述符環(huán)上的映射;所謂out-of-b

46、and:帶寬外,就是在分配數(shù)據(jù)時(shí)可以超出I/O描述符環(huán)的限制)。每次環(huán)訪問(wèn)都要基于兩對(duì)生產(chǎn)者-消費(fèi)者指針:domain通過(guò)推進(jìn)請(qǐng)求生產(chǎn)者指針將一個(gè)請(qǐng)求放置在環(huán)上;Xen處理這些請(qǐng)求,推進(jìn)一個(gè)相關(guān)的請(qǐng)求消費(fèi)者指針。響應(yīng)被放回在環(huán)上也是類(lèi)似的,只是由Xen作為生產(chǎn)者,guestOS作為消費(fèi)者。這里是不要求請(qǐng)求是被按順序被處理的:guestOS給每個(gè)請(qǐng)求都建立了一個(gè)唯一的相關(guān)標(biāo)識(shí)符,這個(gè)標(biāo)識(shí)符會(huì)在相關(guān)的響應(yīng)上被復(fù)制(/描述符環(huán)只是限定了能夠處理請(qǐng)求的規(guī)模,并不規(guī)定處理順序,誰(shuí)先被處理誰(shuí)后被處理是在將數(shù)據(jù)映射到描述符環(huán)上的時(shí)候決定的)。這就允許Xen出于調(diào)度和優(yōu)先級(jí)的考慮,重新排定I/O操作的順序。這

47、個(gè)結(jié)構(gòu)是通用的,足以支持很多不同的設(shè)備范例。例如,如果一組“請(qǐng)求”要為網(wǎng)絡(luò)數(shù)據(jù)包的接收提供緩沖,那么相應(yīng)的后續(xù)“響應(yīng)”就是數(shù)據(jù)包已經(jīng)到達(dá)緩沖區(qū)的信號(hào)。重新排序在處理磁盤(pán)請(qǐng)求時(shí)是很有用的(比如兩個(gè)domain請(qǐng)求都要讀同一塊數(shù)據(jù),那么就可以把這兩個(gè)請(qǐng)求的處理放到一起完成,提高效率),它允許它們?cè)赬en內(nèi)部被調(diào)度以提高效率;使用帶寬外緩沖的描述符使得能夠容易地實(shí)現(xiàn)零復(fù)制傳輸(/減少了數(shù)據(jù)拷貝,如果不用描述符的話(huà),那么就務(wù)必要將緩沖區(qū)的數(shù)據(jù)內(nèi)容在I/O環(huán)中進(jìn)行復(fù)制,而現(xiàn)在做的只是映射操作,即零復(fù)制)。我們將請(qǐng)求和響應(yīng)的產(chǎn)生和其它的通告分開(kāi):在請(qǐng)求的情況下,一個(gè)domain可以在調(diào)用一個(gè)hyperca

48、lI陷入Xen之前將多個(gè)項(xiàng)排入隊(duì)列;在響應(yīng)的情況下,一個(gè)domain能夠通過(guò)劃定一個(gè)相應(yīng)的閥值來(lái)推遲通告事件的遞交。這使得每個(gè)domain能夠權(quán)衡延遲和吞吐量的需求,類(lèi)似在ArseNIC吉比特以太網(wǎng)接口的flow-aware(流優(yōu)化?)的中斷分派34。3.3子系統(tǒng)虛擬化前文描述的控制和數(shù)據(jù)傳遞機(jī)制被使用在我們對(duì)各個(gè)子系統(tǒng)的虛擬化實(shí)現(xiàn)中。在下面,我們討論如何獲得對(duì)CPU,定時(shí)器,內(nèi)存,網(wǎng)絡(luò)和磁盤(pán)的虛擬化3.3.1CPU調(diào)度Xen當(dāng)前對(duì)domain的調(diào)度采用的是BorrowedVirtualTime(BVT)調(diào)度算法11。我們之所以選擇這個(gè)特別的算法是因?yàn)樗枪ぷ鞅pB(yǎng)型的,同時(shí)還具有特殊的機(jī)制使得

49、它能夠在接收到一個(gè)事件時(shí)可以低延遲地喚醒(或者說(shuō)分派)一個(gè)domain??焖俚姆峙桑?dispatch,就是類(lèi)似前面說(shuō)的demultiplexdata)對(duì)于減少虛擬化對(duì)那些對(duì)時(shí)間敏感的操作系統(tǒng)子系統(tǒng)造成的影響是尤其重要的(/分派越快速,事件就越能及時(shí)到達(dá)操作系統(tǒng));例如,TCP要依賴(lài)于確認(rèn)信息的及時(shí)遞交以正確地估測(cè)在網(wǎng)絡(luò)上往返所用的時(shí)間(/如果確認(rèn)信息沒(méi)有及時(shí)到達(dá),那么時(shí)間估測(cè)就有問(wèn)題了)。BVTprovideslow-latencydispatchbyusingvirtual-timewarping,amechanismwhichtemporarilyviolatesideaIfairsha

50、ringtofavorrecently-wokendomains(不很明白BVT算法的實(shí)現(xiàn))。當(dāng)然,其它調(diào)度算法也能夠在我們的通用調(diào)度器抽象上實(shí)現(xiàn)。每個(gè)domain的調(diào)度參數(shù)可以由運(yùn)行在Domain0的管理軟件進(jìn)行調(diào)整。時(shí)間和定時(shí)器Xen為每個(gè)guestOS提供了真實(shí)時(shí)間,虛擬時(shí)間和掛鐘時(shí)間(wall-clocktime)等三個(gè)概念。真實(shí)時(shí)間是以納秒為單位給出的,是從機(jī)器引導(dǎo)起來(lái)開(kāi)始計(jì)算的時(shí)間,它記錄的是精確的處理器執(zhí)行的時(shí)鐘周期數(shù),時(shí)鐘周期能夠被外部時(shí)鐘源鎖頻(例如,通過(guò)NTP時(shí)間服務(wù))。domain的虛擬時(shí)間只是在它運(yùn)行的時(shí)候才會(huì)被記入:這主要供guestOS的調(diào)度器使用來(lái)確保guestO

51、S上的應(yīng)用進(jìn)程能夠正確地共享時(shí)間片。最后,掛鐘時(shí)間是一個(gè)偏移,用于加到當(dāng)前的真實(shí)時(shí)間上。掛鐘時(shí)間能夠被調(diào)整(/比如在各個(gè)guestOS中的時(shí)間可以不同,有的是上午九點(diǎn),有的是下午三點(diǎn),改的就是這個(gè)值),同時(shí)不會(huì)影響真實(shí)時(shí)間的流逝。每一個(gè)guestOS能夠?qū)σ粚?duì)警鐘定時(shí)器進(jìn)行編程,一個(gè)用于真實(shí)時(shí)間,另一個(gè)用于虛擬時(shí)間。guestOS能夠維護(hù)內(nèi)部的定時(shí)器隊(duì)列(/很多應(yīng)用程序都有定時(shí)需求,真實(shí)的或者虛擬的,特別是網(wǎng)絡(luò)應(yīng)用;guestOS要對(duì)這些定時(shí)需求排隊(duì)以確定誰(shuí)的時(shí)間要求最緊迫,然后就盡量依次滿(mǎn)足它們;只要有一個(gè)定時(shí)需求沒(méi)被滿(mǎn)足,即超時(shí)了,那么系統(tǒng)就產(chǎn)生異常)并使用Xen提供的警鐘定時(shí)器來(lái)觸發(fā)最早

52、的超時(shí)。超時(shí)事件將會(huì)使用Xen事件機(jī)制來(lái)遞交。虛擬地址轉(zhuǎn)換和其它子系統(tǒng)一樣,Xen也努力以盡可能小的開(kāi)銷(xiāo)實(shí)現(xiàn)存儲(chǔ)訪問(wèn)的虛擬化。正如2.1.1中討論的,由于x86架構(gòu)使用的是硬件頁(yè)表,因此達(dá)到這個(gè)目標(biāo)有些難度。VMware中使用的方法是為每個(gè)guestOS提供虛擬的頁(yè)表,這個(gè)頁(yè)表對(duì)于存儲(chǔ)管理單元(MMU)是不可見(jiàn)的10。然后由hypervisor負(fù)責(zé)陷入對(duì)虛擬頁(yè)表的訪問(wèn),確認(rèn)更新,再將這些改變傳播到虛擬頁(yè)表和MMU可見(jiàn)的“影子”頁(yè)表(“影子”頁(yè)表在第2部分提到過(guò))。這大大增加了這個(gè)guestOS操作的代價(jià),比如創(chuàng)建一個(gè)新的虛擬地址空間,需要對(duì)“訪問(wèn)過(guò)的”和“臟的”比特位上的硬件更新進(jìn)行顯式地傳播

53、。之所以完全虛擬化要強(qiáng)迫使用影子頁(yè)表,是因?yàn)樗o出連續(xù)的物理內(nèi)存的假象,而Xen就不拘泥于此。實(shí)際上,Xen只需要考慮對(duì)頁(yè)表的更新,來(lái)防止guestOS導(dǎo)致不可接受的改變。因此我們避免了和使用影子頁(yè)表相關(guān)的開(kāi)銷(xiāo)和額外的復(fù)雜度Xen中的方法是直接地由MMU記錄guestOS的頁(yè)表,并且限制住guestOS只能做讀訪問(wèn)。頁(yè)表更新通過(guò)hypercall傳遞給Xen;更新請(qǐng)求在被采納以前經(jīng)過(guò)確認(rèn),這么做就確保了安全性。為了有助于確認(rèn),我們給機(jī)器的每個(gè)頁(yè)框都建立了一個(gè)相關(guān)的類(lèi)型和引用數(shù)。一個(gè)頁(yè)框在任何時(shí)候都會(huì)排它地具有下述的某一個(gè)類(lèi)型:頁(yè)目錄(PD),頁(yè)表(PT),局部描述符表(LDT),全局描述符表

54、(GDT)。同時(shí),這個(gè)頁(yè)框還可能是可寫(xiě)(RW)的類(lèi)型。一個(gè)guestOS可以為它自己所屬的頁(yè)框創(chuàng)建可讀的映射,而不必理會(huì)頁(yè)框的當(dāng)前類(lèi)型。一個(gè)頁(yè)框只有在它的引用數(shù)為0的時(shí)候,才能被安全地重新分配給其它任務(wù)使用。這個(gè)機(jī)制被用于滿(mǎn)足系統(tǒng)對(duì)安全性一貫的需求;例如,一個(gè)domain不能夠任意地對(duì)頁(yè)表的某個(gè)部分建立可寫(xiě)的映射,如果要這么做的話(huà)就必須要求頁(yè)框同時(shí)具有PT和RW類(lèi)型(什么情況下是可讀的映射?什么情況下又是可寫(xiě)的映射呢?)。類(lèi)型系統(tǒng)還要被用于跟蹤那些用于頁(yè)表的頁(yè)框中哪些是已經(jīng)被確認(rèn)過(guò)的(/頁(yè)框用于頁(yè)表,即頁(yè)內(nèi)容填入頁(yè)框)。這時(shí),guestOS要指出頁(yè)框是否被分配用作頁(yè)表這就需要在頁(yè)框的類(lèi)型被定為

55、PD或者PT后(說(shuō)明頁(yè)框是用于頁(yè)表的),由Xen對(duì)頁(yè)框中的每一項(xiàng)做一次性地確認(rèn),直至后來(lái)由guestOS發(fā)出釋放(unpin)的請(qǐng)求(由guestOS釋放頁(yè)框)。這在改變頁(yè)表基指針的時(shí)候是很有用的,因?yàn)樗恍枰诿恳淮紊舷挛那袚Q時(shí)都對(duì)新頁(yè)表進(jìn)行確認(rèn)(/因?yàn)楝F(xiàn)在只確認(rèn)頁(yè)框了)。注意,一個(gè)頁(yè)框在被釋放并且引用數(shù)為0之前是不能夠被重新分配給其它任務(wù)的,這樣就避免了guestOS可能會(huì)繞開(kāi)引用數(shù)機(jī)制而直接利用釋放請(qǐng)求導(dǎo)致的危險(xiǎn)。為了減少所需的hypercall調(diào)用的次數(shù),guestOS能夠在利用一個(gè)hypercall進(jìn)行整批處理之前在局部將更新排入一個(gè)隊(duì)列。特別是在創(chuàng)建新的地址空間的時(shí)候,這一點(diǎn)是尤其

56、有好處的。但是無(wú)論怎樣,我們必須確保更新被提交得足夠早以保證準(zhǔn)確性。幸運(yùn)的是,一個(gè)guestOS在第一次使用一個(gè)新的映射前要執(zhí)行一次TLB刷新:這確保了任何被緩存的改變(/這些改變目前僅存于TLB中,還沒(méi)有被寫(xiě)入內(nèi)存頁(yè)表項(xiàng))都是沒(méi)有經(jīng)過(guò)確認(rèn)的。因此,在TLB刷新之前立即提交那些待處理的更新就可以滿(mǎn)足正確性(/更新的時(shí)間,解決了什么時(shí)候進(jìn)行成批更新操作以保證正確性的問(wèn)題)。可是,有一些guestOS會(huì)在TLB中沒(méi)有陳舊表項(xiàng)存在(/沒(méi)有陳舊表項(xiàng)意味著更新都已經(jīng)送達(dá)內(nèi)存中?)的時(shí)候省略掉這個(gè)刷新的步驟。在這種情況下,就有可能發(fā)生第一次試圖使用新的映射時(shí)會(huì)發(fā)生缺頁(yè)錯(cuò)誤(/因?yàn)闆](méi)有刷新TLB)。這時(shí),g

57、uestOS錯(cuò)誤句柄就必須要核查是否需要更新;如果需要的話(huà),TLB就要被刷新(/加入所缺的內(nèi)容),并且將導(dǎo)致剛才缺頁(yè)錯(cuò)誤的指令重新執(zhí)行。3.3.4物理內(nèi)存為各個(gè)domain進(jìn)行的初始的內(nèi)存分配,或者說(shuō)內(nèi)存保留,都是在domain被創(chuàng)建的時(shí)候進(jìn)行的;因此,內(nèi)存在domain之間是靜態(tài)劃分的,這就提供了強(qiáng)大的隔離性。最大允許的內(nèi)存保留量是被規(guī)定了的:如果某個(gè)domain中的內(nèi)存壓力增加了,那么它就可以從Xen爭(zhēng)取額外的內(nèi)存頁(yè),直到達(dá)到規(guī)定保留量的上限。反過(guò)來(lái),如果一個(gè)domain希望節(jié)省些資源,避免不必要的開(kāi)銷(xiāo),它也能夠通過(guò)釋放內(nèi)存頁(yè)給Xen來(lái)減少它的內(nèi)存保留量。XenoLinux實(shí)現(xiàn)了一個(gè)氣球驅(qū)

58、動(dòng)42(沒(méi)看相關(guān)文獻(xiàn)),它能夠通過(guò)在Xen和XenoLinux的頁(yè)面分配器之間傳遞內(nèi)存頁(yè)來(lái)調(diào)整domain的內(nèi)存使用。雖然我們能夠直接修改Linux的內(nèi)存管理例程,但是氣球驅(qū)動(dòng)能夠利用現(xiàn)有的操作系統(tǒng)功能來(lái)進(jìn)行調(diào)整,因此簡(jiǎn)化了Linux的移植工作。無(wú)論怎樣,準(zhǔn)虛擬化能夠被用于擴(kuò)展氣球驅(qū)動(dòng)的能力。例如,guestOS中的內(nèi)存越界處理機(jī)制能夠被修改為通過(guò)向Xen請(qǐng)求更多的內(nèi)存頁(yè)來(lái)自動(dòng)地減輕內(nèi)存壓力。大部分操作系統(tǒng)都假定內(nèi)存空間是由大量的較大規(guī)模的連續(xù)區(qū)域組成的。由于Xen并不保證它為guestOS分配的內(nèi)存區(qū)域是連續(xù)的,所以guestOS需要為它們自己創(chuàng)建連續(xù)的物理內(nèi)存的假象,即使它們實(shí)際在底層分配

59、到的硬件內(nèi)存是稀疏的。guestOS通過(guò)簡(jiǎn)單地維護(hù)一個(gè)以實(shí)際分得的頁(yè)框號(hào)為索引的數(shù)組,來(lái)完全負(fù)責(zé)從實(shí)際分得的地址(physical)到硬件地址的映射。Xen提供了一個(gè)共享的地址轉(zhuǎn)換數(shù)組,這個(gè)數(shù)組用于支持從硬件地址到各個(gè)domain實(shí)際分得地址的映射,它是所有的domain都可讀的更新這個(gè)數(shù)組是經(jīng)過(guò)Xen確認(rèn)的,以確保guestOS能夠擁有相應(yīng)的硬件頁(yè)框。即使一個(gè)guestOS在大多數(shù)情況下選擇了忽略硬件地址(因?yàn)間uestOS喜歡在連續(xù)的地址空間上運(yùn)行),但是在它訪問(wèn)它所擁有的頁(yè)表的時(shí)候(這時(shí)必須使用硬件地址)必須使用轉(zhuǎn)換表。硬件地址也可以暴露給操作系統(tǒng)存儲(chǔ)管理系統(tǒng)中的有限的某些部分以?xún)?yōu)化存儲(chǔ)

60、訪問(wèn)(具體是哪些部分可以直接“看到”硬件地址呢?)。例如,一個(gè)guestOS可以分配特定的硬件頁(yè)用于優(yōu)化以實(shí)際分得地址為索引的緩存中的布局,或者使用超級(jí)頁(yè)將硬件內(nèi)存中的連續(xù)部分作自然對(duì)齊的映射。3.3.5網(wǎng)絡(luò)Xen提供了虛擬防火墻一路由器(VFR)的抽象,每個(gè)domain都有一個(gè)或多個(gè)在邏輯上附屬于VFR的網(wǎng)絡(luò)接口(VIF)。VIF看上去有些現(xiàn)代的網(wǎng)卡:具有兩個(gè)I/O緩沖區(qū)描述符環(huán),一個(gè)用于發(fā)送一個(gè)用于接收。在每個(gè)方向(/發(fā)送或者接收)上都有一些相關(guān)的規(guī)則形式(模式,動(dòng)作)一如果模式(pattern)匹配上的話(huà),那么相關(guān)的動(dòng)作(action)就會(huì)被起用。Domain0負(fù)責(zé)插入和刪除規(guī)則。例如在

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論