2009年1月18日 星期日

從VT-x到VT-d Intel虚擬化技術發展藍圖[轉貼]

當前非常熱門的Virtualization虚擬化技術的出現和應用其實已經有數十年的歷史了,在早期,這個技術主要應用在服務器以及大型主機上面,現在,隨着PC性能的不斷增長,Virtualization也開始逐漸在x86架構上流行起來。

虚擬化技術將各種資源虚擬出多台主機,以提高這些資源的共享率和利用率,虚擬化可以將IT環境改造成為更加强大、更具彈性、更富有活力的架構。通過把多個操作系統整合到一台高性能服務器上,最大化利用硬件平台的所有資源,用更少的投入實現更多的應用,還可以簡化IT架構,降低管理資源的難度,避免IT架構的非必要擴張。客户虚擬機的真正硬件無關性還可以實現虚擬機的運行時遷移,可以實現真正的不間斷運行,從而最大化保持業務的持續性,而不用為購買超高可用性平台而付出高昂的代價。

和Sun上的虚擬化技術(CPU分區)比起來,x86上的虚擬化要落後不少的,然而確實在不斷進步着,在數年前,x86上還没有什麽硬件支持,甚至連指令集都不是為虚擬化而設計,這時主要靠完全的軟件來實現虚擬化,當時的代表是VMware的産品,以及尚未被Microsoft收購Connectix開發的Virtual PC,在服務器市場上應用的主要是VMware的産品,包括GSX Server和稍後的ESX Server,這些軟件虚擬化産品在關鍵指令上都采用了二進制模擬/翻譯的方法,開銷顯得比較大,後期出現了Para-Virtualization部分虚擬化技術,避免了一些二進制轉换,性能得到了提升,不過仍然具有隔離性的問題。

今天,虚擬化技術的各方面都有了進步,虚擬化也從純軟件逐深入到處理器級虚擬化,再到平台級虚擬化乃至輸入/輸出級虚擬化,代表性技術就是Intel Virtualization Technology for Directed I/O,簡寫為Intel VT-d,在介紹這個Intel VT-d之前,我們先來看看x86硬件虚擬化的第一步:處理器輔助虚擬化技術,也就是Intel Virtualization Technology,分為對應Itanium平台的VT-i和對應x86平台的VT-x兩個版本。AMD公司也有對應的技術AMD-V,用于x86平台。我們介紹的是x86平台上的VT-x技術,VT-i技術原理上略為相近。
純軟件虚擬化主要的問題是性能和隔離性。Full Virtualization完全虚擬化技術可以提供較好的客户操作系統獨立性,不過其性能不高,在不同的應用下,可以消耗掉主機10%~30%的資源。而OS Virtualization可以提供良好的性能,然而各個客户操作系統之間的獨立性并不强。無論是何種軟件方法,隔離性都是由Hypervisor軟件提供的,過多的隔離必然會導致性能的下降。
這些問題主要跟x86設計時就没有考慮虚擬化有關。我們先來看看x86處理器的Privilege特權等級設計。

x86架構為了保護指令的運行,提供了指令的4個不同Privilege特權級彆,術語稱為Ring,從Ring 0~Ring 3。Ring 0的優先級最高,Ring 3最低。各個級彆對可以運行的指令有所限制,例如,GDT,IDT,LDT,TSS等這些指令就只能運行于Privilege 0,也就是Ring 0。要注意Ring/Privilege級彆和我們通常認知的進程在操作系統中的優先級并不同。
操作系統必須要運行一些Privilege 0的特權指令,因此Ring 0是被用于運行操作系統内核,Ring 1和Ring 2是用于操作系統服務,Ring 3則是用于應用程序。然而實際上并没有必要用完4個不同的等級,一般的操作系統實現都僅僅使用了兩個等級,即Ring 0和Ring 3,如圖所示:

也就是説,在一個常規的x86操作系統中,系統内核必須運行于Ring 0,而VMM軟件以及其管理下的Guest OS却不能運行于Ring 0——因為那様就無法對所有虚擬機進行有效的管理,就像以往的協同式多任務操作系統(如,Windows 3.1)無法保證系統的穩健運行一様。在没有處理器輔助的虚擬化情况下,挑戰就是采用Ring 0之外的等級來運行VMM (Virtual Machine Monitor,虚擬機監視器)或Hypervisor,以及Guest OS。
現在流行的解决方法是Ring Deprivileging(暫時譯為特權等級下降),并具有兩種選擇:客户OS運行于Privilege 1(0/1/3模型),或者Privilege 3(0/3/3模型)。
無論是哪一種模型,客户OS都無法運行于Privilege 0,這様,如GDT,IDT,LDT,TSS這些特權指令就必須通過模擬的方式來運行,這會帶來很明顯的性能問題。特彆是在負荷沉重、這些指令被大量執行的時候。
同時,這些特權指令是真正的“特權”,隔離不當可以嚴重威脅到其他客户OS,甚至主機OS。Ring Deprivileging技術使用IA32架構的Segment Limit(限制分段)和Paging(分頁)來隔離VMM和Guest OS,不幸的是EM64T的64bit模式并不支持Segment Limit模式,要想運行64bit操作系統,就必須使用Paging模式。
對于虚擬化而言,使用Paging模式的一個致命之處是它不區分Privileg 0/1/2模式,因此客户機運行于Privileg 3就成為了必然(0/3/3模型),這様Paging模式才可以將主機OS和客户OS隔離開來,然而在同一個Privileg模式下的不同應用程序(如,不同的虚擬機)是無法受到Privileg機構保護的,這就是目前IA32帶來的隔離性問題,這個問題被稱為Ring Compression。

IA32不支持VT,就無法虚擬64-bit客户操作系統
這個問題的實際表現是:VMware在不支持Intel VT的IA32架構CPU上無法虚擬64-bit客户操作系統,因為無法在客户OS之間安全地隔離。
作為一個芯片輔助(Chip-Assisted)的虚擬化技術,VT可以同時提升虚擬化效率和虚擬機的安全性,下面我們就來看看Intel VT帶來了什麽架構上的變遷。我們談論的主要是IA32上的VT技術,一般稱之為VT-x,而在Itanium平台上的VT技術,被稱之為VT-i。
VT-x將IA32的CU操作擴展為兩個forms(窗體):VMX root operation(根虚擬化操作)和VMX non-root operation(非根虚擬化操作),VMX root operation設計來供給VMM/Hypervisor使用,其行為跟傳統的IA32并無特彆不同,而VMX non-root operation則是另一個處在VMM控制之下的IA32環境。所有的forms都能支持所有的四個Privileges levels,這様在VMX non-root operation環境下運行的虚擬機就能完全地利用Privilege 0等級。

兩個世界:VMX non-root和VMX root
和一些文章認為的很不相同,VT同時為VMM和Guest OS提供了所有的Privilege運行等級,而不是只讓它們分彆占據一個等級:因為VMM和Guest OS運行于不同的兩個forms。
由此,GDT、IDT、LDT、TSS等這些指令就能正常地運行于虚擬機内部了,而在以往,這些特權指令需要模擬運行。而VMM也能從模擬運行特權指令當中解放出來,這様既能解决Ring Aliasing問題(軟件運行的實際Ring與設計運行的Ring不相同帶來的問題),又能解决Ring Compression問題,從而大大地提升運行效率。Ring Compression問題的解决,也就解决了64bit客户操作系統的運行問題。
為了建立這種兩個虚擬化窗體的架構,VT-x設計了一個Virtual-Machine Control Structure(VMCS,虚擬機控制結構)的數據結構,包括了Guest-State Area(客户狀態區)和Host-State Area(主機狀態區),用來保存虚擬機以及主機的各種狀態參數,并提供了VM entry和VM exit兩種操作在虚擬機與VMM之間切换,用户可以通過在VMCS的VM-execution control fields裏面指定在執行何種指令/發生何種事件的時候,VMX non-root operation環境下的虚擬機就執行VM exit,從而讓VMM獲得控制權,因此VT-x解决了虚擬機的隔離問題,又解决了性能問題。
我們可以看到,Inter VT的出現,可以解决了重要的虚擬處理器架構問題,讓純軟件虚擬化解决方案的性能問題得以大大緩解。然而要做的事情還有很多。
我們知道對于服務器而言,很重要的一個組成部分就I/O,CPU的計算能力提升雖然可以更快地處理數據,但是前提是數據能够順暢的到達CPU,因此,無論是存儲,還是網絡,以及圖形卡、内存等,I/O能力都是企業級架構的一個重要部分。為此,人們不但在傳輸帶寬上投資(比如從百兆以太網到千兆以太網再到萬兆以太網),還在各種系統和架構上進行了大量的投入(比如吞吐量更高的RAID系列、多層數據中心)。
在虚擬化技術中,隨着整體處理器資源的利用效率的提升,對數據I/O也提出了更高的要求。
VMM虚擬機管理器必須提供I/O虚擬化來支持處理來自多個客户機的I/O請求,當前的虚擬化技術采用下列的方式來處理I/O虚擬化。

Full Virtualization


模擬I/O設備:VMM對客户機摸擬一個I/O設備,通過完全模擬設備的功能,客户機可以使用對應真實的驅動程序,這個方式可以提供完美的兼容性(而不管這個設備事實上存不存在),但是顯然這種模擬會影響到性能。作為例子,各種虚擬機在使用軟盤映像提供虚擬軟驅的時候,就運行在這様的方式,以及Virtual PC的模擬的真實的S3 Virge 3D顯卡,VMware系列模擬的Sound Blaster 16聲卡,都屬於這種方式。

Para- Virtualization


額外軟件界面:這個模型比較像I/O模擬模型,VMM軟件將提供一系列直通的設備接口給虚擬機,從而提升了虚擬化效率,這有點像Windows操作系統的DirectX技術,從而提供比I/O模擬模型更好的性能,當然兼容性有所降低,例如VMware模擬的VMware顯卡就能提供不錯的顯示速度,不過不能完全支持DirectDraw技術,Direct3D技術就更不用想了。相似的還有VMware模擬的千兆網卡,等等,這些品牌完全虚擬的設備(例如,VMware牌顯卡,VMware牌網卡)需要使用特制的驅動程序部分直接地和主機、硬件通信,比起以前完全模擬的通過虚擬機内的驅動程序訪問虚擬機的十兆百兆網卡,可以提供更高的吞吐量。
現在的I/O設備虚擬化主要是采用模擬方式或者軟件接口方式,因此性能上很容易成為瓶頸——畢竟傳統的機器上,I/O設備都很容易成為瓶頸,因此Intel就適時提出了Intel Virtualization Technology for Directed I/O,簡稱為Intel VT-d。
I/O虚擬化的關鍵在于解决I/O設備與虚擬機數據交换的問題,而這部分主要相關的是DMA直接内存存取,以及IRQ中斷請求,只要解决好這兩個方面的隔離、保護以及性能問題,就是成功的I/O虚擬化。


和處理器上的Intel VT-i和VT-x一様,Intel VT-d技術是一種基于North Bridge北橋芯片(或者按照較新的説法:MCH)的硬件輔助虚擬化技術,通過在北橋中内置提供DMA虚擬化和IRQ虚擬化硬件,實現了新型的I/O虚擬化方式,Intel VT-d能够在虚擬環境中大大地提升 I/O 的可靠性、靈活性與性能。
傳統的IOMMUs(I/O memory management units,I/O内存管理單元)提供了一種集中的方式管理所有的DMA——除了傳統的内部DMA,還包括如AGP GART、TPT、RDMA over TCP/IP等這些特彆的DMA,它通過在内存地址範圍來區彆設備,因此容易實現,却不容易實現DMA隔離,因此VT-d通過更新設計的IOMMU架構,實現了多個DMA保護區域的存在,最終實現了DMA虚擬化。這個技術也叫做DMA Remapping。

I/O設備會産生非常多的中斷請求,I/O虚擬化必須正確地分離這些請求,并路由到不同的虚擬機上。傳統設備的中斷請求可以具有兩種方式:一種將通過I/O中斷控制器路由,一種是通過DMA寫請求直接發送出去的MSI(message signaled interrupts,消息中斷),由于需要在DMA請求内嵌入目標内存地址,因此這個架構須要完全訪問所有的内存地址,并不能實現中斷隔離。
VT-d實現的中斷重映射(interrupt-remapping)架構通過重新定義MSI的格式來解决這個問題,新的MSI仍然是一個DMA寫請求的形式,不過并不嵌入目標内存地址,取而代之的是一個消息ID,通過維護一個表結構,硬件可以通過不同的消息ID辨認不同的虚擬機區域。VT-d實現的中斷重映射可以支持所有的I/O源,包括IOAPICs,以及所有的中斷類型,如通常的MSI以及擴展的MSI-X。
VT-d進行的改動還有很多,如硬件緩衝、地址翻譯等,通過這些種種措施,VT-d實現了北橋芯片級彆的I/O設備虚擬化。VT-d最終體現到虚擬化模型上的就是新增加了兩種設備虚擬化方式:

左邊是傳統的I/O模擬虚擬化,右邊是直接I/O設備分配
直接I/O設備分配:虚擬機直接分配物理I/O設備給虚擬機,這個模型下,虚擬機内部的驅動程序直接和硬件設備直接通信,只需要經過少量,或者不經過VMM的管理。為了系統的健壯性,需要硬件的虚擬化支持,以隔離和保護硬件資源只給指定的虚擬機使用,硬件同時還需要具備多個I/O容器分區來同時為多個虚擬機服務,這個模型幾乎完全消除了在VMM中運行驅動程序的需求。例如CPU,雖然CPU不算是通常意義的I/O設備——不過它確實就是通過這種方式分配給虚擬機,當然CPU的資源還處在VMM的管理之下。
I/O設備共享:這個模型是I/O分配模型的一個擴展,對硬件具有很高的要求,需要設備支持多個功能接口,每個接口可以單獨分配給一個虚擬機,這個模型無疑可以提供非常高的虚擬化性能表現。
運用VT-d技術,虚擬機得以使用直接I/O設備分配方式或者I/O設備共享方式來代替傳統的設備模擬/額外設備接口方式,從而大大提升了虚擬化的I/O性能。

主流雙路Xeon Stoakley平台將支持Intel VT-d技術

高端四路Caneland平台也會支持VT-d功能
根據資料表明,不日發布的Stoakley平台和Caneland平台上將包含VT-d功能,Stoakley平台是現在的Bensley的下一代産品,用于雙路Xeon處理器,而Caneland則是Truland的繼任者,用于四路Xeon處理器,這些芯片組都能支持最新的45nm Penryn處理器。

從Intel虚擬化技術發展路綫圖來看,虚擬化無疑是從處理器逐漸擴展到其他設備的,從VT-i/VT-x到VT-d就非常體現了這個過程,對于關注I/O性能的企業級應用而言,完成了處理器的虚擬化和I/O的虚擬化,整個平台的虚擬化就接近完成了,因此在未來,Intel將會持續地開發VT-d技術,將各種I/O設備中加入虚擬化特性,從而提供一個强大的虚擬化基礎架構。

資料來源:
http://www.wlkj.net/redirect.php?tid=34660&goto=lastpost
http://www-07.ibm.com/tw/imc/seminar/download/200711_C_2.ppt
漫談CPU虛擬技術之Intel篇
影片:IBM何謂虛擬化技術?
影片:IBM BladeCenter 虛擬化I/O技術
影片:IBM 第四代多處理器伺服器為虛擬化環境所帶來的好處
IBM虛擬化新五步
IBM多系統虛擬技術運作優勢白皮書
Xen and the Art of Virtualization
Linux_Weather_Forecast/virtualization

2009年1月16日 星期五

CES 2009:Phoenix的HyperSpace可讓Windows與BIOS裡的OS同時運行

Phoenix(鳳凰科技)這次在CES 2009展示了新的BIOS技術,名為 "HyperSpace" 。這項技術的用意,簡單來說就是可以讓Windows與內嵌在BIOS的作業系統同時運行,並且可以即時切換,如果只是要單純上網或發E-mail,就可在HyperSpace裡完成,可以兼具省電與便利性(因為開機較快)...

HyperSpace很類似華碩的ExpressGate功能,不過HyperSpace感覺上在技術上又更複雜了些,Annti先將Hyperspcae的重要特色交代如下:

1.因為會用到虛擬化技術(VT-x或SVM),所以CPU要支援虛擬化技術
2.開機進入到HyperSpace的OS約14秒
3.Windows與HyperSpace的OS同時運行,並有硬體快速鍵切換(據說是F4),切換成HyperSpace模式後,Windows會進入待機或休眠狀態(依HyperSpace版本而定)
4.一直HyperSpace模式運作,續航力可再多延長25%
5.HyperSpace的OS為Linux,有瀏覽器、收發MAIL、即時通訊與多媒體(播放DVD或聽MP3)
6.因為是基於硬體端上運作,即使Windows掛了,仍可進入HyperSpace
7.可與Phoenix其他功能結合,如在IDF展出的FailSafe安全技術,或是BelnSync(可將資料透過網路備份、同步或分享)
8.結合筆電的上網能力(WLAN或3.5G),可透過網路作遠端遙控、鎖機或IT維護
9.HyperSpace有兩種模式,使用虛擬化技術叫 "HyperSpace Hybrid" ,如果CPU沒有虛擬化技術也可使用,只是兩者無法同時開啟並存,叫做 "HyperSpace Dual" 。
10.可依廠商需求來客製化HyperSpace的功能,也能在輕省筆電(Netbook)上運作

具有HyperSpace功能的筆電,除了可以模式切換,並且能同時並存運作。

BelnSync是未來鳳凰另一個新計畫,在BIOS裡(如Hyperspace或FailSafe)可將資料透過網路同步、分享或備份等動作,而不用開啟作業系統。

以下為HyperSpace的情境影片:


Why use HyperSpace


HyperSpace Switch


HyperSpace Demo


資料來源:
http://chinese.engadget.com/2009/01/07/new-bios-technology-phoenix-hyperspace/

2009年1月1日 星期四

SystemC SC_THREAD() and SC_CTHREAD()

SC_THREAD是最常用的處理過程,基本上可以用在任何地方。它是由輸入信號的變化觸發,但與SC_METHOD不同的是它可以在兩次調用這保存控制狀態。它的功能類似於暫存器的功能。SC_THREAD中可以包含有wait()函數,這使得處理過程可以被掛起。 SC_CTHREAD是SC_THREAD的一種特殊情况。SC_CTHREAD能産生更好的綜合效果。SC_CTHREAD中可以使用wait()函數。在不同的狀態間加入wait()函數,設計人員可以用SC_CTHREAD來實現狀態機。這種設計風格是簡便的而且容易理解。SC_CTHREAD只能由時脈信號緣觸發,而SC_THREAD可以由其它非時脈信號觸發。如果在時脈上跳邊觸發,可以使用pos()函數,反之用neg()。 為進一步説明SC_CTHREAD,下面給出了一個SC_CTHREAD的例子。

SC_MODULE(example) {
sc_in_clk clock;//輸入時脈
sc_in<bool> trigger, din;
sc_out<bool> dout;
void invert();
SC_CTOR(example) {
SC_CTHREAD(toggler, clock.pos());//時脈上升緣觸發
}
}
void example::invert() {
bool last = false;
for (;;) {
wait_until(trigger.delayed() == true);//等到下個時脈上升緣
//且trigger=1再執行
last = din;
dout = last;
wait();
last =~din;
dout = last;wait();//下個上升緣才更改數據
}
}

Process Type

SC_METHOD

SC_THREAD

SC_CTHREAD

Exec. Trigger

Signal Events

Signal Events

Clock Edge

Exec. Suspend

No

Yes

Yes

Infinite Loop

No

Yes

Yes

Suspend / Resume by

N.A.

wait()

wait() / wait_until()

Construct &

Sensitize Method

SC_METHOD(call_back);

sensitive(events);

sensitive_pos(events);

sensitive_neg(events);

SC_THREAD(call_back);

sensitive(events);

sensitive_pos(events);

sensitive_neg(events);

SC_CTHREAD(call_back,clock_pos())

SC_CTHREAD(call_back,clock_net())


資料來源:
基於SYSTEM C的FPGA設計方法
http://www.cnblogs.com/oomusou/archive/2006/12/13/590991.html