1.如何判斷一個架構能否虛擬化
先說下虛擬化的三個典型特徵:同質,高效,資源受控。
再說下指令:系統中有一些操作和管理關鍵系統資源的指令被定義成特權指令,這些指令只能運行在最高特權級上。
另外還有部分指令,可能需要讀取敏感寄存器,內存地址或者是IO指令,這些指令是敏感指令。顯而易見,所有的特權指令都是敏感指令,然而所有的敏感指令並不一定是特權指令。 VMM能捕獲到敏感指令,然後陷入再模擬,這就是普通的虛擬化手段。
總結:判斷一個架構能否虛擬化,就在於是否能將敏感指令能否觸發異常,從而捕獲,不然就是虛擬化漏洞。
2.CPU虛擬化
作爲虛擬化的三大部分之一,CPU的虛擬化佔據着絕對位置:
具體來說,CPU虛擬化要完成的就是捕獲客戶機中的敏感指令,讓非敏感或者非特權的指令能直接運行在物理CPU上,然後捕獲敏感指令,達到陷入再模擬。
當客戶機操作系統試圖去訪問關鍵資源的時候,該請求時不會發生在物理寄存器上。不管怎樣,其宗旨就是讓虛擬機裏執行的敏感指令陷入下來,能被VMM模擬,而不要直接運行在硬件上。並且陷入一般是通過CPU的保護機制來實現的。
3.內存虛擬化
內存虛擬化的核心,就在於引入了一層新的地址空間-----客戶機物理地址空間。所以這裏就存在着兩級頁表的轉換。GPA - GVA -HPA。
這裏具體來說,就是Guest 維護着GPA和GVA的關係,然後VMM維護着GVA和HPA的關係。由於兩次轉換確實是太費資源,所以出現了改進技術,影子頁表和TPT(擴展頁表)。
影子頁表會在後面的軟件完全虛擬化中詳細解釋。
4.IO虛擬化
分爲兩部分,一部分是讓Guest發現硬件設備,然後加載相關驅動。第二部分就是找到有效的辦法來截獲客戶機操作系統對虛擬設備的訪問。