1. 程式人生 > >CPU虛擬化技術

CPU虛擬化技術

CPU虛擬化:在物理機(宿主機)中通過執行緒或程序這種純軟體方式模擬出假的CPU

物理cpu核數 > 虛擬cpu總核數的原因是:虛擬出來的每顆cpu實際上就是一個執行緒或者程序。虛擬cpu過多時,需要進行程序/執行緒切換,比較浪費

1、模擬:使用軟體方式實現CPU,需要模擬環0,1,2,3。host架構和guest架構不同,如x86和android,因此guest上執行的所有指令都要進行轉換,不管是使用者空間的指令還是核心空間的指令,因此效能很低。需要安裝模擬器來將其他型別的cpu指令翻譯為本機cpu的指令集。

2、虛擬:guest架構和host架構相同或可以被相容(host為64位,guest可以使用32位),只需要模擬環0即可,因為虛擬機器中的核心需要執行在核心態,即需要將虛擬機器中的核心程式碼轉換為本機的cpu指令集。

3、hypervisor直接管理物理硬體(cpu和memory),hypervisor有時候就是host中的核心。

4、程序中涉及到系統呼叫時的執行過程:

    程序執行在cpu的環3(使用者態)上,如果涉及到硬體呼叫時,就通過軟中斷方式發起系統呼叫,由使用者態切換到核心態。核心完成系統呼叫完成後將結果告知呼叫程序,因此恢復中斷現場,程序繼續執行。

 

5、CPU虛擬化方案:

    A、完全虛擬化:guest作業系統核心不需要進行任何修改,guest以為自己直接管理真實的底層物理硬體。

guest相對於宿主機(host)而言只是一個程序,這時候guest中的核心程式只是執行在host的環3(使用者空間)上的程序,但是,對於核心而言,它必須要執行在環0上,即核心空間要執行在環0上,需要具有所有資源的訪問許可權。

這時候我們就要進行CPU的虛擬化,通過軟體的方式模擬出一個假的CPU,讓guest的核心執行在模擬出來的CPU環0上。軟體模擬出來的CPU實際上就是host中的一個程序或執行緒。如果只考慮虛擬化方式而不考慮模擬方式,這時候模擬CPU只需要模擬環0就可,guest中使用者空間的操作可以直接執行在真實CPU的環3上。

執行過程:guest中執行的程式需要涉及到硬體操作時,需要發起系統呼叫,交給guest的核心進行處理,即要經歷CPU的工作流程,取指令,解析指令,執行指令等過程,但是guest中的核心執行在host的使用者態,因此無法轉換成真正的特權指令集,所以還需要向host核心發起系統呼叫,host核心完成系統呼叫後,將結果返回給guest核心,guest核心再將結果返回給guest使用者程序。可以理解為:在guest中執行的程式使用硬體,需要經過兩次核心操作,一是guest中的核心,二是host中的核心。

工作過程如下:

 

a、BT技術:host核心執行在環0上

    BT模式下,假設虛擬機器(guest)中的核心執行在環1上,guest的使用者空間執行在環3上。但是,guest核心是不可能執行在環1上的,因為環1上沒有特權指令,因此必須使用軟體的方式模擬環0。BT技術是將guest的核心程式碼從執行在模擬出來CPU環0移到真實的CPU的環1中。環1和環0之間的互動採用了BT(Dynamic Binary Translation,動態二進位制翻譯,這個技術主要是vmware公司開發的)技術。BT通過監聽環1,隨時將guest的核心呼叫轉換為host核心中真正的特權指令的呼叫,即將上圖中guest使用者程序呼叫guest核心,guest核心呼叫host核心的過程,簡化為guest使用者程序呼叫guest核心。即可以理解為BT實現了執行時翻譯,guest中涉及到核心空間的呼叫時,是邊呼叫邊翻譯邊轉化的,即減少了在模擬CPU中執行完CPU工作流程後再次提交給host核心的過程。BT技術嚴重依賴於底層架構(即虛擬機器中guest的架構必須和底層架構相同或者可以被相容),因為它是直接在guest中執行核心指令時動態轉換為真實的特權指令集,因此無法實現跨平臺。guest的核心執行在host的環1上,guest的使用者空間執行在host的環3上。

 

 

b、硬體方式:硬體輔助虛擬化,host的核心執行在環-1上。

    硬體輔助虛擬化(HVM,hardware virtual machine):由硬體方式實現完全虛擬化,hypevisor執行在環-1上,guest的核心在環0上,即四個環變成了五個環,由硬體進行特權指令的轉換,而不是軟體方式進行轉換。

    host中的核心執行在環-1上,特權指令變成放置在環-1上而不再是環0上。guest的核心就可以直接執行在物理CPU中的環0上了。在guest中可以看到物理CPU中的環0-3這個四個環,這是由硬體直接虛擬給guest而不再是通過軟體方式虛擬出CPU的四個環。guest中對核心空間的操作直接由硬體進行轉換,如guest中執行核心空間操作時,在環0上執行核心程式碼時,就會被執行在環-1上的hypevisor捕獲到,由硬體直接轉換為對應的特權指令。

    Intel:Intel VT,Intel Virtualization Technology

    AMD:AMD-V

 

 

B、半虛擬化:軟體方式實現,host核心在環0上

    這是為了提高軟體方式模擬環0虛擬化技術性能而出現的,硬體輔助虛擬化出現後,這種技術就沒有存在的意義了。guest的作業系統程式碼進行了更改,guest是知道自己執行在虛擬機器中的。在guest中涉及到核心空間的操作,不是在模擬的環0上轉換為cpu的指令集,而是要通過向VMM(hypervisor) 進行hypercall呼叫來完成特權指令的呼叫,這是直接呼叫而不是翻譯的過程。這樣guest的核心和host的核心互動的過程大大簡化了,因為不需要中間的翻譯過程了,比如省略了在軟體模擬環0上操作的過程。

 

總結:

效能:硬體輔助虛擬化 > 半虛擬化 > BT技術

完全虛擬化:虛擬機器監視器在關鍵的時候“欺騙”虛擬機器,使得客戶作業系統以為自己在真實的物理環境下執行,可以使用BT技術進行加速,如果支援HVM時,直接使用硬體輔助虛擬化技術

       優點:程式碼的轉換工作是動態完成的,無需修改客戶作業系統程式碼

       缺點:需要進行兩次轉換,即guest中進行硬體操作時,需要提交到guest的核心,然後再由guest核心提交給host核心進行翻譯為特定的硬體指令。

 

半虛擬化:guest作業系統通過更改程式碼來解決特權指令呼叫問題,在guest中進行系統呼叫時,直接提交給host核心進行解析。guest是知道自己執行在虛擬機器中的,而不是真實的物理硬體上。

        優點:比全虛擬化效能好一些,由兩次翻譯減少為一次翻譯

        缺點:不適用於所有的作業系統,因為有些作業系統不能進行程式碼更改,比如windows

參考:

計算機的心智作業系統之哲學原理

https://yq.aliyun.com/articles/71295

http://blog.51cto.com/tasnrh/1736758

https://blog.csdn.net/coderhattonliu/article/details/54670954