Xen Introduction

 

     guest OS是指Xen能夠操控的操作系統之一,domain是指一個運行中的虛擬機,在其上有一個guest OS在執行。我們稱Xen本身爲hypervisor,因爲它運行的特權級要比它所操控的guest OS中的supervisor code運行的特權級更高。

 

     虛擬化CPUguest OS提出了幾個要求。因爲hypervisor插在操作系統的下層違背了慣常的關於操作系統在整個系統中特權最高的假設。爲了保護hypervisor不會受到操作系統不正確行爲的影響(即domain不受另一個domain的影響),guest OS就必須被改造爲能夠運行在較低的特權級上。很多處理器體系結構只是提供了兩個特權級。在這些情況下,guest OS和應用程序共享較低的特權級。同時,guest OS運行在單獨的地址空間中以保護自己不會受到應用程序執行的影響。guest OS通過hypervisor設定虛擬的特權級和改變當前的地址空間來間接地和應用之間進行控制傳遞。另外,如果處理器的TLB支持地址空間標記,那麼也就可以避免TLB刷新帶來的高昂代價。

 

     因爲x86架構在硬件上支持四個不同的特權級。x86架構的特權級通常用圈(ring)來表示,從ring 0(最高特權)到ring 3(最低特權)。操作系統的代碼運行在ring 0這個特權級上,因爲再沒有其它的ring能夠執行那些特權指令。ring 3通常用於執行應用代碼。就我們所知,自OS/2起到現在的各個知名的x86 架構上的操作系統都還沒有利用ring 1ring 2這兩個特權級的。那麼,任何遵循這個通常的安排的操作系統(沒有使用ring 1ring 2)就都可以移植到Xen上來。

這個移植過程只需要做一些改動使操作系統改爲運行在ring 1特權級上。這就防止了guest OS會直接執行特權指令,也保證了操作系統與運行在ring 3上的應用程序之間相隔離的安全性。特權指令需要被Xen確認和執行以達到準虛擬化的目的,這主要應用於諸如安置新的頁表,或者在處理器idle時放棄之(而不是去halt它)等操作。因爲只有Xen有足夠高的特權級來執行這些指令,所以任何guest OS試圖直接運行特權指令都會失敗,後果要麼是沉默要麼是產生錯誤。異常,包括內存錯誤和軟件陷阱,都可以在x86架構的基礎上直接進行虛擬化。有一個表,內容爲對每類異常進行描述的句柄。表中所列的異常都是在Xen中有記錄的,以用作確認。表中給出的句柄都是與真正的x86硬件中相同的;之所以這一點是可能做到的,主要是因爲在我們的準虛擬化架構中,異常堆棧框架是沒有被修改的。唯一的一個改動是在頁面錯誤句柄上。因爲該句柄的操作需要從特權處理器寄存器(CR2)中讀出出錯的地址;但是這是不可能的(因爲特權級別不夠了),我們就將它(頁面錯誤句柄?CR2的值?)寫入擴展的堆棧框架中(後來發現,在移植XP的時候,將這個值寫入一個預先商定的共享存儲位置上要比修改堆棧框架簡單一些)。當系統在ring 0以外執行時有異常發生,Xen的句柄就會在guest OS堆棧中創建一個異常堆棧框架的拷貝,並且會將控制交給相應的已經記錄過的異常句柄。

    

    典型的,只有兩類異常會經常發生而影響到系統的性能:系統調用(一般都是通過軟件異常實現)和頁面錯誤。我們讓每個guest OS都記錄一個快速的異常操作句柄來改進系統調用的性能。這個異常操作句柄可以直接由處理器使用,而不必非要間接地經過ring 0;這個句柄在放置進硬件異常列表中之前就是經過確認的(所以不必經過Xen)。不幸的是,我們不可能使用同樣的技術來處理頁面錯誤句柄,因爲只有那些運行在ring 0的代碼才能夠從寄存器CR2中讀出錯誤的地址;因此,頁面錯誤必須要經過Xen才能提交,Xen保存該寄存器的值供來自ring 1的訪問使用。

     

     Xen發現異常產生時,它會對異常句柄進行確認以確保安全性。這只需要檢查句柄的代碼段中是否含有指明要在ring 0中執行的操作。既然沒有guest OS能夠創建這樣一個段,那麼只需要將專門的段選擇符和少量的保留在Xen中的靜態值作比較即可。除了這點以外,任何其它的句柄問題都會在異常傳播(exception propagation)(一個異常導致了另一個異常的產生)的過程中被修正。例如,如果句柄缺少相應代碼段或者句柄沒有分配到內存頁,那麼在Xen爲將控制返回給句柄而執行iret指令的時候就會有一個相應的錯誤產生。Xen通過檢查出錯的程序計數器值來檢測這些雙錯誤(double faults:之前已經出錯了,現在到了iret已經是第二個錯誤了;第二個錯誤是由第一個錯誤傳播而來):如果地址是處於異常虛擬化的代碼中(說明異常處理沒有完成,iret沒成功),那麼guest OS就要被終止。

對於直接的系統調用句柄來說,這種懶惰(第一個錯誤發生的時候,沒有被檢查到;直到Xen執行了iret之後才報錯)的檢查也是安全的:當CPU試圖直接跳至guest OS句柄的時候,會發生訪問錯誤(之前的過程都一樣,只是直接的系統調用是不經過Xen的)。在這種情況下,產生錯誤的地址將處於Xen之外(因爲Xen不會去執行guest OS系統調用),因此錯誤就以上文講過的一般方式進行虛擬化即可。如果由於錯誤的傳播導致了進一步的雙錯誤,那麼guest OS會像上文談及的一樣被終止。

整個系統架構中有一個domain是在引導(boot)時創建的。這個domain被允許使用控制接口。這個初始的domain,術語稱爲Domain 0,它負責操控應用級的管理軟件。控制接口具有創建和終止其它domain的能力,還能控制它們相關的調度參數、物理存儲分配以及它們對給定的物理磁盤和網絡設備的訪問。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章