Hypervisor
Hypervisor是一種運行在物理機上的軟件,可以在單個物理機上創建、運行和管理多個虛擬機。Hypervisor根據需要將底層物理計算資源(如cpu、內存)進行抽象統一管理,并按需將資源分配給各個虛擬機。Hypervisor實現了同一物理機上不同虛擬機之間的資源隔離,避免數據竊取或惡意攻擊,同時保證虛擬機的資源使用不受周邊虛擬機的影響。用戶使用虛擬機時,只能訪問屬于自己的虛擬機的資源(如硬件、軟件和數據),不能訪問其他虛擬機的資源,保證了虛擬機的數據隔離和安全。
CPU隔離
CPU虛擬化是Hypervisor中最核心的部分,內存虛擬化和IO虛擬化都依賴于CPU虛擬化的正確實現。
X86架構中為了保護指令的運行,提供了指令的4個不同特權級別,術語稱為Ring,優先級從高到低依次為:
Ring 0:最高特權級別,被用于運行操作系統內核。
Ring 1:用于操作系統服務。
Ring 2:用于操作系統服務。
Ring 3:用于應用程序。
Hypervisor運行在最高特權級別,可以控制物理處理器上的所有關鍵資源;而虛擬機操作系統運行在非最高級特權級別,所以其訪問物理資源的敏感指令會陷入到Hypervisor中通過軟件的方式進行模擬。通過攔截并模擬虛擬機的敏感指令,Hypervisor實現了虛擬機vCPU的隔離,有效防止了虛擬機越權惡意攻擊物理機或其他虛擬機。
內存隔離
Hypervisor通過內存虛擬化技術來實現不同虛擬機之間的內存隔離,使每個虛擬機都擁有獨立的內存空間,相互之間不受影響。
相較于傳統OS兩層內存地址映射(“虛擬地址”到“機器地址”),內存虛擬化的核心在于引入一層新的地址空間,叫做Guest物理地址空間。Hypervisor負載管理和分配每個虛擬機的物理內存,虛擬機操作系統看到的是一個虛構的Guest物理地址空間,其指令的目標地址也是一個Guest物理地址。這樣的地址在無虛擬化的情況下,其實就是實際的物理地址,但是在虛擬化場景下,這樣的地址是不能直接發送到系統總線上去,需要進行正確的轉換后才能交由物理處理器執行。虛擬機內部訪問內存時,正確的三層地址轉換的邏輯是:虛擬機負責將“Guest虛擬地址”映射為“Guest物理地址”,然后Hypervisor負責將“Guest物理地址”映射成“機器地址”。
Hypervisor的這種地址轉換機制,保證了虛擬機無法直接接觸實際的機器地址,只能訪問Hypervisor分配給它的物理內存。
I/O隔離
物理機外設資源是有限的,為了滿足多個虛擬機操作系統的需求,Hypervisor通過I/O虛擬化的方式來復用有限的外設資源。Hypervisor攔截虛擬機操作系統對設備的訪問請求,然后通過軟件的方式來模擬真實設備的效果。從處理器的角度看,外設是通過一組I/O資源(I/O端口或MMIO)來進行訪問的,所以設備相關的虛擬化又被稱為I/O虛擬化。
Hypervisor采用分離設備模型實現I/O的虛擬化。前端負責將虛擬機的I/O請求傳遞到Hypervisor中的后端,后端解析I/O請求并提交給相應的設備完成I/O操作。Hypervisor保證虛擬機只能訪問分配給它的I/O資源。