2011年10月4日 星期二

Xen-ARM簡介

(一)簡介 

Xen-ARM是一種在ARM架構上實作的Hypervisor,能在一台機器上同時運行多個作業系統。在Hypervisor的分類當中,屬於Type1的Hypervisor[1] ,而在Hypervisor上運行的Guest OS是需要被Patch過的,在系統虛擬化技術分類上屬於Para-virtualizaiton(半虛擬化)。

Xen-ARM是基於Xen [2] (一款在x86平台上開發的Hypervisor)。不同於Xen是由XenSource公司所主導,Xen-ARM的開發者是以Samsung為主體,而近幾年來有關Xen-ARM的Paper多由Samsung所發表。

談到Xen-ARM與Xen社群的關係,自兩者官網的關係來看,Xen-ARM的官網是被當成Xen官網上的一個分頁,而在XenWiki當中,也有一頁是寫有關Xen-ARM的內容,顯見Xen社群是知道有Xen-ARM的存在,並且是近乎把Xen-ARM當做Xen一部分的方式放置在Xen的官網。然而,Xen-ARM迄今仍未被整合進Xen的主線當中,依據Xen-ARM官網上的說法,他們希望能於2012年進入Xen的主線。

在早期Xen-ARM開發時,只支援FreeScale的開發板,而至今Xen-ARM已經支援Xscale PXA310, Versatile, Realview-PB, Cortex-A9等SoC平台的硬體架構,也支援Goldfish(QEMU emulator patched for Android)。在Guest OS的部份,早期僅支援2.6.11的版本,時至今日,Xen-ARM官方目前已支援Linux v2.6.11, v2.6.18, v2.6.21, v2.6.24, v2.6.27的版本。

(二)Xen-ARM歷史發展

於2007年的Xen秋季高峰會上,三星提出他們成功把Xen移植到ARM處理器架構之下,三星把此計畫稱之為Xen-ARM。在2007年當時,三星團隊在ARM9(ARMv5)的FreeScale開發板上實作Xen-ARM,當時他們是以Xen-3.0.2為基礎移植至FreeScale上,在Hypervisor上運行的Guest OS則是Linux 2.6.11。

然而,雖然2007年當時三星就有到Xen Summit Autumn發表Xen-ARM當時開發的成果,但真正開放原始碼的時間則是到2008上半年才有開放。於08年所釋出的第一版Xen-ARM,僅支援FreeScale的硬體平台,其所支援的Guest OS也僅為miniOS。

也因為沒有釋出Patch過能在Guest mode運行的Linux實有不便,因此於同年(2008年)的下半年,三星又釋出了第二版的Xen-ARM,在這個版本當中,即有提供Para-virtualized Linux 2.6.24來做為Guest OS,同時也釋出了Xen tool。

於2009年下半年,Xen-ARM推出第三版,當中最主要的更新是支援ARM11MPCore(ARMv6)的平台。最新的版本則是2010年推出的版本,此版本已經支援Cortex-A9(ARMv7)的硬體平台,Guest OS也已經有支援Linux v2.6.11, v2.6.18, v2.6.21, v2.6.24, v2.6.27的版本。

(三)Xen-ARM的架構[3]


Xen-ARM的架構與Xen相仿,是在硬體上直接架一層Hypervisor來實際管控所有硬體資源,然後Guest OS再架上Guest OS。當Guest OS在執行Non-sensitive instructions時,由於此種指令不會更動到關鍵的硬體資源,故即讓其native-run。然而當執行到sensitive instruction時,由於此種指令會更動到系統的關鍵資源,而我們不希望Guest OS有權直接存取硬體資源,故此時我們會讓sensitive instruction強制trap進Hypervisor,交由Hypervisor來處理,而此種行為我們會稱為Guest OS發一個hyper-call進hypervisor,如同在OS中我們會稱user-space程式會發system-call進kernel一樣。


1. CPU virtualization




在Xen-ARM當中將CPU的指令分為三種:Xen-ARM mode、virtual kernel mode與virtual user mode,分別給hypervisor、kernel-space of guest OS、user-space of guest OS使用,而對應實際ARM的instruction mode分別為supervisor mode、user mode與user mode。我們可以看到virtual kernel mode和virtual user mode皆是使用user mode,即non-privilege mode,故實際上virtual kernel mode和virtual user mode的差別只是邏輯上的分別而已。


2. Memory virtualization



我們知道在Memory virtualization當中,我們需要於Hypervisor中建立一套shadow page table,讓Guest OS能夠管理自己的Memory,但又不會直接接觸到實際的記憶體配置,而是利用shadow page table來轉換到實體的記憶體配置。在Xen-ARM當中也利用一樣的技術,在Xen-ARM當中去將實體記憶體切割成數塊,分別定址給各個VM,還有一部分的記憶體會被分配給Hypervisor本身


3. I/O virtualization


在Xen-ARM的架構上,他會把Guest OS切成兩種,一種是負責其他VM和Hypervisor溝通的VM,我們稱其為Dom0或VM0,另一種VM則是無法直接對Hypervisor溝通的VM,我們稱呼其為DomU(在一個Hypervisor上只有兩個VM運行時,我們也多直接成其為Dom1或VM1)。當VM1發出一個I/O request時,他會透過他自己的I/O裝置驅動程式打入Xen-ARM之中,但Xen-ARM只幫忙傳遞訊息給VM0,由VM0當中的Back-end driver去負責模擬虛擬的I/O裝置給VM1使用,而真正接觸到實際硬體的則是交由VM0當中的Native driver去負責。