看操作系統虛擬化原理總結篇——基於軟件的完全虛擬化——cpu

1,軟件虛擬化的可行方案

模擬執行和源代碼改寫。


下面也分爲三個部分來介紹軟件虛擬化

1.CPU的虛擬化:

通過之前的學習,我們已經知道了CPU的虛擬化本質是指令的虛擬化,即VMM能捕獲客戶機的敏感指令或者特權指令,通過陷入和模擬的方式完成虛擬化。
那麼下面再進行分類介紹:

1,解釋執行。
       取一條指令,然後模擬出這條指令的執行效果。由於每一條指令都被取出並且被模擬,也就是說每一條指令都被陷入了,所以就解決了虛擬化漏洞。在這個執行環境中,編譯好的二進制代碼是不會被載入到物理CPU直接運行的,而是由解釋器逐條解碼的,再調入對應的函數來模擬指令的功能。
缺點呢,就是每一條指令不區別對待,導致效率低下。

2,掃描和修補。
讓多數指令直接運行在物理CPU上,而把操作系統代碼中的敏感指令替換成跳轉或者陷入到VMM執行的指令塊中。 這樣相對於解釋執行的優勢就是有區別對待,效率有明顯的提高。下面我們分析下具體流程:
第一步:VMM會在虛擬機開始執行階段對其進行掃描,解析指令,提取特權指令和敏感指令。
第二不:根據特權指令和敏感指令生產補丁代碼。
第三步:執行補丁代碼,然後跳轉回去繼續執行。
!!! 這裏有個重要知識點:由於補丁代碼比被修改的代碼長,所以可以用 INT 指令引起陷入,然後在陷入發生的地方查找原指令,然後進行模擬。
另外,這些補丁代碼是存放在VMM的內存緩衝區的,這些容量有限,總會填滿,所以VMM還會維持着一個PC-補丁代碼關係。
同樣,我們來說缺點:
每個補丁都引入了額外的跳轉,跳轉會降低代碼的局部性。 由於掃描和修補是在內存中進行代碼修補的,必須維護一份與補丁對應的原始代碼的備份,以便在需要時進行恢復。  ====???這裏不太懂,內存中的數據都需要進行備份麼?

3,二進制代碼翻譯(以QEMU說明爲例)。

這個算是軟件虛擬化的主流方式了,VMware就是用的此。
二進制代碼翻譯在VMM中也是開闢了一段內存,將翻譯好的代碼放在其中。這樣客戶機代碼也不直接被物理CPU執行,而是存放在緩存中。
BT技術將源代碼以基本塊爲粒度進行翻譯,模擬器動態,按需讀入二進制代碼。並將翻譯好的目標代碼放入緩存中。這裏注意 ,我們必須知道哪些被翻譯了,哪些沒被翻譯,所以這裏就需要引入一個Hash表來維護源代碼和緩存區代碼的關係。注意,這裏的翻譯和模擬不太一樣,QEMU採用的是簡單翻譯,另外還有個等值翻譯,至於具體的不同,我的理解是模擬一般用的是跳轉函數,而翻譯一般採用的更改某個標誌位來實現,------這個待續。

例子來說明: 動態翻譯。
在QEMU中,它爲每個虛擬CPU都維護了一個數據結構,保存的是當前CPU運行環境,包括各種寄存器的參數和值。

qemu則是採用動態翻譯的技術,先將目標代碼翻譯成一系列等價的被稱爲“微操作”(micro-operations)的指令,然後再對這些指令進行拷貝,修改,連接,最後產生一塊本地代碼。這些微操作排列複雜,從簡單的寄存器轉換模擬到整數/浮點數學函數模擬再到load/store操作模擬,其中load/store操作的模擬需要目標操作系統分頁機制的支持。

         qemu對客戶代碼的翻譯是按塊進行的,並且翻譯後的代碼被緩存起來以便將來重用。在沒有中斷的情況下,翻譯後的代碼僅僅是被鏈接到一個全局的鏈表上,目的是保證整個控制流保持在目標代碼中,當異步的中斷產生時,中斷處理函數就會遍歷串連翻譯後代碼的全局鏈表來在主機上執行翻譯後的代碼,這就保證了控制流從目標代碼跳轉到qemu代碼。簡單概括下:指定某個中斷來控制翻譯代碼的執行,即每當產生這個中斷時纔會去執行翻譯後的代碼,沒有中斷時僅僅只是個翻譯過程而已。這樣做的好處就是,代碼是是按塊翻譯,按塊執行的,不像Bochs翻譯一條指令,馬上就執行一條指令。



發佈了111 篇原創文章 · 獲贊 8 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章