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