XEN方法和概述 在傳統的VMM中
虛擬硬件的功能是與底層機器上的真實硬件完全相同的
這種
完全虛擬化
(full virtualization)的方法最顯而易見的好處在於操作系統可以不經任何修改就直接在虛擬硬件上運行
但是它也有很多缺點
特別是針對那些當前被廣泛應用的IA
(或者稱作x
)架構
這種方法帶來的缺陷更是不容忽視
x
架構的設計從來就不支持完全的虛擬化
如果要正確實現x
架構虛擬化
VMM就必須能夠對某幾條特定的
超級指令(supervisor instruction)
進行操作
但是
如果在沒有足夠特權的情況下執行這些超級指令會導致
沉默的失敗(//fail silently
如果特權級不夠
那麼會直接導致執行失敗
不會產生其它響應)
而並非產生一個便於我們使用的陷阱(trap)
另外
將x
架構中的MMU進行有效的虛擬化也是一件很困難的事情
這些問題是可以被解決的
但是在解決的同時必須要付出操作復雜度增加和系統性能降低的代價
VMware ESX Server[
]需要動態地重寫那些被VMM操控的機器碼部分
在其中有可能需要VMM干涉的地方插入陷阱操作(//在什麼地方插入陷阱操作
是在程序運行起來後才知道的
所以需要動態地重寫相關代碼)
因為務必要對所有那些不能夠引起陷阱的特權指令進行捕捉和操作
所以這種轉換(//動態重寫代碼)要被應用於整個guest OS的內核(導致了相關的轉換
執行和緩存等開銷)
ESX Server實現中采用的技術是建立系統結構(system structure)(比如頁表)的影子版本
通過為每一次
更新
操作設立陷阱來解決虛擬頁表和物理頁表的一致性問題(//具體細節還是要看ESX Server的說明)
但是在處理
更新密集
型的操作(如創建新的應用進程)的時候
該方法會帶來高昂的開銷
除了x
架構非常復雜的原因
還有一些其它方面的爭論反對
完全虛擬化
其中值得一提的是
被操控的操作系統在一些情況下需要接觸到真實的資源
例如
提供真實時間和虛擬時間以允許guest OS能夠更好地支持
時間敏感
型的任務
還可以正確地操作TCP超時和RTT估算
給出真實的機器地址以允許guest OS能夠利用超級頁(superpage)或者頁染色(page coloring)等方法改進性能
我們提出的虛擬機抽象能夠避免完全虛擬化帶來的種種缺陷
這種虛擬機抽象和底層硬件相似卻並不完全相同
因此被稱之為
准虛擬化
(//paravirtualization
或者翻譯為半虛擬化?後面譯文沿用准虛擬化)方法
這種方法雖然需要對guest OS進行一些改動
但是它能夠改善性能
還有特別重要的一點需要說明
准虛擬化方法不會對應用二進制接口(ABI)進行修改
因此用戶也就不用修改那些在guest OS上執行的應用程序
我們進行的關於准虛擬化方法的討論要遵循以下一些規則
最基本的是要支持那些不經改動的應用二進制文件的執行
即用戶不用對應用程序做針對Xen的轉換
因此我們必須虛擬化現有的標准ABI所需的全部體系結構特征
很重要的一點是要支持完整的多應用操作系統
這就需要將在單個guest OS實例中的復雜的服務器配置虛擬化(//例如
如果guest OS上配置了ftp服務
那麼虛擬硬件就要打開相應端口)
准虛擬化務必要有很高的性能
另外針對那些不協作(//uncooperative
這裡的不協作是指硬件架構不支持共享
所以才需要資源隔離)的機器架構
如x
架構
准虛擬化還需要能夠提供很強的資源隔離能力
在協作(cooperative)的機器架構上
准虛擬化方法要能夠完全地隱藏資源虛擬化帶來的影響
減少guest OS在正確性和性能上面臨的風險
請注意
我們在這裡提出的准虛擬化的x
抽象的方法是與最近在Denali項目中提出的方法有很大差異的
Denali是為了支持數以千計的運行著網絡服務的虛擬機而設計的
這些網絡服務中絕大部分是小規模的
不流行(//應用的不流行也就說明了運行該應用的環境比較少
所以只要針對這些相應的特定環境作專門的虛擬化即可)的應用
與之相反的是
Xen的設計最終要支持近
個運行著業界標准應用和服務的虛擬機
由於設計目標的極大差異
我們不妨將Denali的設計選擇和我們自己的設計規則做一個有益的討論
首先
Denali不需要關注現有的ABI
因此他們的VM接口忽略掉了相關的架構特征
例如
Denali並不完全支持x
的分段機制
但是這一點卻是在NetBSD
Linux和Windows XP等操作系統的ABI中都有提出並且被廣泛使用
例如
線程庫中經常會使用分段機制來尋址線程局部數據
其次
Denali的實現沒有解決在單個guest OS中支持多個應用(application multiplexing)的問題
也沒有解決多地址空間的問題
應用被顯式地鏈接到Ilwaco guest OS實例上
這麼做在某種意義上類似於之前在Exokernel中的libOS[
]
因此每個虛擬機只能操控一個單用戶單應用的沒有保護措施的所謂的
操作系統
在Xen中
與之相反
每個虛擬機上能夠操控一個真正的操作系統
這個操作系統上能夠安全地執行數以千計個不經改動的用戶級進程
雖然Denali號稱開發了一個虛擬MMU原型能夠對其在該領域有所幫助
但是我們沒有看到公開的技術細節和評估報告
再次
在Denali體系結構中
是由VMM執行全部的內存與磁盤間的頁面調度的
這可能是與虛擬層缺乏存儲管理支持有關
由VMM完成頁面調度是與我們的性能隔離目標相違背的
那些
有惡意
的虛擬機可能會故意產生抖動行為
導致其它虛擬機的CPU時間和磁盤帶寬被不公平地剝奪(//VMM監控很多VM
各個VM上再跑操作系統
所以如果很多事情都放在VMM中做必然會影響到各個VM
所以要把一些事情放在上面的操作系統做來達到隔離性)
在Xen中
我們希望每個guest OS在其自己分配到的內存空間和磁盤區域內執行它自己的頁面調度(此前已經有self
paging的方法被提出)
最後
Denali為機器的全部資源虛擬了
名字空間
這樣的話
如果一個VM不能夠
叫出
另一個VM下轄的資源的名字
那麼該VM就不能夠訪問這些資源(例如
Denali中的VM並不知道硬件地址
它們只看得到Denali創建的虛擬地址)
與此相對
我們認為hypervisor中的安全訪問控制已經足以確保安全性
此外
就像之前討論過的
當前在guest OS是否應該能夠直接看到物理資源這一點上存在著很熱烈的關於正確性和性能的爭論
在後續的章節裡
我們將描述Xen提出的虛擬機抽象
然後將討論如何將一個guest OS作必要的改動以適應Xen
在這篇文章裡我們定義了一些術語要提醒大家注意
例如
術語guest OS是指Xen能夠操控的操作系統之一
術語domain是指一個運行中的虛擬機
在其上有一個guest OS在執行
program和process之間的區別和傳統系統中的區別類似
我們稱Xen本身為hypervisor
因為它運行的特權級要比它所操控的guest OS中的supervisor code運行的特權級更高
虛擬機接口 一個准虛擬化的x
接口主要包括了系統中的三個大的方面
存儲管理
CPU和設備I/O
在下面
我們將依次介紹各個機器子系統的情況
並討論在我們的准虛擬化架構中是如何體現的
雖然在我們的實現中
有相當一部分
如存儲管理
是專門針對x
的
但是實際上還有很多方面(比如我們虛擬的CPU和I/O設備)都是可以很容易地應用於其它機器架構上的
更進一步地說
在與RISC架構在實現上有差異的很多地方
x
往往表現出的是該方面最壞情況時的情形
例如
對硬件頁表進行有效的虛擬化就比虛擬化一個軟件管理的TLB困難很多
存儲
管理分段不能夠使用具有完全特權級的段描述符
不能夠與線性地址空間的最頂部交迭(//因為最頂部是Xen)
分頁guest
OS直接對硬件頁表做讀訪問
但是更新(//就是寫)是分批進行的而且要經過hypervisor確認
一個domain可以被分配在不連續的頁面上
CPU保護guest OS必須運行在低於Xen的特權級上
異常guest OS必須將異常句柄的描述符表在Xen中記錄
除了頁面錯誤外
其它句柄和真實的x
架構相同
系統調用guest OS為系統調用提供一個
快速
的句柄
允許應用直接調用它所在的guest OS
而不必間接地通過Xen完成每次調用
中斷硬件中斷被一個輕量級的事件系統替換
時間每個guest OS具有一個定時器接口
可以得到
真實的
和
虛擬的
時間
設備I/O網絡
磁盤
……虛擬設備訪問起來很簡單
數據傳遞使用的是異步I/O環
由一個事件機制替換硬件中斷來發布通告
存儲管理 虛擬化存儲毫無疑問是准虛擬化一個體系結構中最困難的部分
它包括hypervisor所需的機制和移植各個guest
OS所需的改動
如果在架構中提供了由軟件管理的TLB的話
那麼這個任務會變得輕松些
它們可以以比較簡單的方式被有效地虛擬化[
]
帶標記的TLB是另外一個在大部分RISC架構(這些RISC架構主要用於構建服務器
比如Alpha
MIPS和SPARC)中支持的有用特征
其中
每個TLB項都有和地址空間標識符相關的標記
這使得hypervisor和各個guest OS能夠有效地在被隔離開的地址空間內共存
這時在執行轉移(//transferring execution
在進程執行間切換的時候
執行的指令序列從一個進程轉移到另一個進程
稱為執行轉移)的時候
是不需要刷新(flush)整個TLB(//只對具有和自己的地址空間標識符相吻合的TLB項進行操作)
不幸的是
x
架構並沒有由軟件管理的TLB
取而代之的是在發生TLB失效的時候
處理器會自動通過遍歷硬件頁表結構來處理
因此為了獲得最好的可能達到的性能
當前地址空間內所有的有效頁傳輸)都要在硬件可訪問的頁表中給出(//最好情況理應如
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19726.html