虛擬化原理

目錄

    • 什么是虛擬化
      • 廣義虛擬化
      • 狹義虛擬化
    • 虛擬化指令集
      • 敏感指令集
      • 虛擬化指令集的工作模式
        • 監視器對敏感指令的處理過程:
    • 虛擬化類型
      • 全虛擬化
      • 類虛擬化
      • 硬件輔助虛擬化
    • 虛擬化架構
      • 裸金屬架構
      • 宿主機模式架構

什么是虛擬化

虛擬化就是通過模仿下層原有的功能模塊創造接口來“欺騙”上層的機制。虛擬化可以通過資源管理技術,將物理存在的實體資源以虛擬機(Virtual Machine,VM)的形式抽象成一種邏輯表示。通常的做法是在整個系統架構中增加一個抽象層,負責分割下層的物理資源,然后組合成邏輯資源供上層使用。

廣義虛擬化

請添加圖片描述

狹義虛擬化

狹義虛擬化特指操作系統虛擬化,它使用虛擬化技術在一臺物理機上模擬出多臺虛擬機,每臺虛擬機都擁有獨立的資源(計算資源、存儲資源、網絡資源)。

虛擬化的具體實現是通過在操作系統與硬件之間加入一個虛擬化層,并通過空間上的分割、時間上的分時及仿真模擬,將服務器物理資源抽象成邏輯資源。虛擬化層可以將單個CPU模擬為多個CPU,并且這些CPU之間相互獨立、互不影響,也就是虛擬化層實現了計算單元的模擬及隔離。它向上層操作系統提供與原先物理服務器一致的環境,使得上層操作系統可以直接運行在虛擬環境中,并允許具有不同操作系統的多臺虛擬機相互隔離,并發地運行在同一臺物理服務器上,這臺物理服務器被稱為“宿主機”。虛擬化層模擬出來的主要邏輯功能為虛擬機,在虛擬機中運行的操作系統被稱為“GuestOS”。

虛擬化場景包括三個部分:硬件資源、虛擬機監視器(VMM)和虛擬機(VM)。系統虛擬化可以將一臺物理機(Host)虛擬化為多臺虛擬機,并通過虛擬化層(即虛擬機監視器)使每臺虛擬機都擁有自己的虛擬硬件,并擁有一個獨立的虛擬機運行環境,進而擁有一個獨立運行的操作系統。
請添加圖片描述

虛擬化指令集

虛擬化指令集指的是將某個硬件平臺的二進制代碼轉換為另一個平臺的二進制代碼,從而實現不同硬件指令集之間的兼容。這種技術也被形象地稱為“二進制翻譯”。

敏感指令集

敏感指令(Sensitive Instruction):在虛擬化場景下,在GuestOS的內核中有一部分非特權指令,它們不一定會改變或者損害整個系統,但是會影響基于虛擬化的整個系統的安全。

敏感指令是操作特權資源的指令,包括修改虛擬機的運行模式,改變宿主機的狀態,讀/寫時鐘、中斷等寄存器,訪問存儲保護系統、地址重定位系統及所有的I/O指令。

例如,GuestOS的內核指令可以讀取宿主機CPU的寄存器內容,從而看到整個系統的狀態,這樣一臺虛擬機就可以看到另一臺虛擬機的內部信息了。在虛擬化場景下,所有會危害到系統安全的指令集被稱為“敏感指令集”。

虛擬化指令集的工作模式

Popek&Goldberg 原理定義了如何設計一個有效的虛擬機監視器。

等價性:任何一個程序,在被管理程序控制時,除時序和資源可用性之外,應該與沒有被管理程序控制時是一樣的,而且預置的特權指令可以自由執行。

管理程序通常指的是虛擬機監視器,也稱為hypervisor。虛擬機監視器是一種軟件,它允許多個操作系統在同一臺物理計算機上運行,并且對它們進行管理和監視。虛擬機監視器負責分配計算機的資源,如處理器時間、內存和輸入/輸出設備,以便多個操作系統之間可以共享這些資源。

時序指的是程序執行的時間順序和時序關系,包括程序的指令執行順序、時鐘周期、中斷處理等。在虛擬機監視器中,被管理程序受到虛擬機監視器的控制,因此其時序可能會受到影響。

資源可用性指的是系統中各種資源的可用性,包括CPU、內存、磁盤、網絡等。在虛擬機監視器中,被管理程序的資源使用受到虛擬機監視器的限制和調度,因此其資源可用性也可能會受到影響。

資源控制:一個程序發出的任何調用系統資源的動作在被執行時,都應先調用控制程序(虛擬機監視器)。

效率性:一個程序產生的所有無害指令都應該由硬件直接執行,控制程序不應該在任何地方產生中斷。

Popek和Goldberg虛擬化原理是一種計算機虛擬化技術的基本原理。該原理由Gerald J. Popek和Robert P. Goldberg于1974年提出。該原理規定了一個處理器架構必須滿足的條件,以便能夠支持虛擬化。這些條件包括特權指令的識別、特權指令的陷阱和仿真、設備I/O的虛擬化等。根據這些條件,Popek和Goldberg提出了一個虛擬機監視器(VMM)的概念,該監視器可以在硬件層面上管理和支持虛擬化環境。這個原理對虛擬化技術的發展產生了深遠的影響,也為后來的虛擬化技術提供了理論基礎。

1、虛擬機GuestOS中的所有非敏感指令都會“穿透”虛擬機監視器,直接運行在CPU上。

2、虛擬機GuestOS中的敏感指令,理想的狀態是通過陷阱機制被虛擬機監視器所捕獲,然后虛擬機監視器通過不同的模擬或虛擬化技術實現在虛擬機上的模擬。

監視器對敏感指令的處理過程:

如果敏感指令都是特權指令,當在虛擬機中執行內核態的特權指令時,則會通過陷阱機制被下層的虛擬機監視器捕獲。虛擬機監視器可以對捕獲的特權指令進行替換操作,從而完整地模擬出某個虛擬機監視器下的特權操作。“陷阱+模擬”機制從本質上保證了可影響虛擬機監視器正常運行的指令由虛擬機監視器模擬執行,而大部分非敏感指令還是照常運行在物理CPU上。
請添加圖片描述
虛擬機監視器用到了優先級壓縮技術,使得虛擬機中的應用運行在Ring 3層,GuestOS運行在Ring 1層(有時也可運行在Ring 3層),虛擬機監視器運行在Ring 0層。

虛擬化將原本的GuestOS內核的特權級別從Ring 0改為Ring 1,即可“消除”GuestOS內核的特權。但這會給GuestOS的內核指令帶來一定的麻煩,原本GuestOS的內核指令是被設計在Ring 0層下執行的,通過優先級壓縮后會造成部分指令在虛擬機中的Ring 1層或Ring 3層下無法執行。

當GuestOS的特權指令無法直接下達到CPU執行時,可以通過虛擬機監視器的“陷阱+模擬”機制執行。具體來說,當虛擬機中的應用需要操作重要資源時,會觸發特權指令,通過陷阱機制被虛擬機監視器捕獲,然后交由對應的GuestOS執行。因為虛擬化之后GuestOS運行在Ring 1層,它沒有權限執行一些特權指令,需要通過其他方式保證這些特權指令的執行。

當虛擬機中的應用使用系統調用時,其跳轉到的GustOS內核中斷處理程序(routine)運行于Ring1層。但是在內核中斷處理程序中有部分指令是必須在Ring 0層才能執行的,此時會再通過陷阱機制將這些指令自動轉入虛擬機監視器后執行。用戶程序運行特權指令時會有兩次特權下降,其中一次是進入Ring 1層的GuestOS;另一次是通過特權指令的陷阱機制進入Ring 0層的虛擬機監視器。

控制權指的是程序執行的控制權,即程序在執行過程中所處的特權級別。假設在虛擬化環境中運行一個操作系統,其中運行了一個虛擬機,虛擬機中運行了一個應用程序。當應用程序需要進行系統調用時,控制權會轉移到虛擬機內的操作系統內核中斷處理程序中,此時操作系統內核的特權級別為Ring 1。如果系統調用需要執行一些特權指令,例如修改頁表或訪問I/O端口,那么操作系統內核就無法直接執行這些指令,因為它的特權級別不夠高。這時,操作系統內核會通過陷阱機制將控制權轉移到虛擬機監視器中,虛擬機監視器的特權級別為Ring 0,可以執行特權指令并與物理硬件交互。執行完特權指令后,虛擬機監視器會將控制權返回給操作系統內核,操作系統內核再將控制權返回給應用程序,應用程序繼續執行。這種特權級別的轉換是虛擬化環境中實現安全隔離和資源管理的重要機制。

Popek&Coldberg原理的前提是,敏感指令必須都是特權指令,即敏感指令集是特權指令集的子集,如圖所示。只有這樣,虛擬機監視器才能通過選用特權指令集的陷阱捕獲方式進行虛擬化。
請添加圖片描述
但是在x86處理器中,只能保證絕大多數的敏感指令是特權指令,還有約17個敏感指令不是特權指令,也就是說,敏感指令的范圍更大。然而,當特權指令集是敏感指令集的真子集時,一部分敏感指令無法被虛擬機監視器捕獲,也就是說虛擬機監視器無法完全控制這些指令的執行。這種情況被稱為“虛擬化漏洞”,因為虛擬機監視器無法完全替代或者控制這些敏感指令的執行,可能會導致安全性問題。

請添加圖片描述

虛擬化類型

虛擬化分為全虛擬化、類虛擬化和硬件輔助虛擬化三類

全虛擬化

從GuestOS看來和在真實的物理機上運行完全一致,GuestOS察覺不到是運行在一個虛擬化平臺上。在這樣的虛擬化平臺上,GuestOS 無須做任何修改即可運行,所抽象的虛擬機具有完全的物理計算機特性,我們稱這種虛擬化平臺為“全虛擬化平臺”。全虛擬化平臺需要正確處理所有的敏感指令,進而正確完成對CPU、內存和I/O的各種操作。

在全虛擬化中,對于特權指令,還是采用先前的“陷阱+模擬”的方式。當虛擬機的內核態需要運行虛擬化漏洞指令時,Ring 0下的虛擬機監視器通過二進制代碼掃描并替換Ring 1下的GuestOS的二進制代碼,將所有虛擬化漏洞指令替換為其他指令。二進制翻譯是一種直接翻譯可執行二進制程序的技術,能夠把一種處理器上的二進制程序翻譯到另一種處理器上執行。在虛擬機監視器中,會動態地把虛擬機中的虛擬化漏洞指令翻譯為其他指令,從而實現虛擬化。
請添加圖片描述

類虛擬化

不同于全虛擬化,類虛化的GuestOS知道自己運行在一個虛擬化環境中。類虛擬化可以通過修改GuestOS的內核代碼來規避虛擬化漏洞的問題。

GuestOS會將與敏感指令相關的操作都轉換為對虛擬機監視器的超級調用(Hypercall),交由虛擬機監視器進行處理,使GuestOS內核完全避免處理那些難以虛擬化的虛擬化漏洞指令。

與全虛擬化不同的是它將問題的中心由虛擬機監視器移向GuestOS自身,通過主動的方式由GuestOS去處理這些指令,而不是移交給虛擬機監視器進行處理,在這種設計理念下就必須得修改GuestOS內核。

但與全虛擬化相同的是,類虛擬化修改過的GuestOS也會運行在Ring 1下。運行在Ring 1下的GuestOS沒有權限執行的指令,會交給運行在Ring 0下的虛擬機監視器來處理。虛擬機監視器向GuestOS提供了一套“系統調用”,以方便GuestOS調用,這套“系統調用”就是超級調用。只有Ring 1下的GuestOS才能向虛擬機監視器發送超級調用請求,以防止Ring 3下的應用調用錯誤導致對系統可能的破壞。

例如,當虛擬機內核需要操作物理資源來分配內存時,虛擬機內核無法直接操作物理資源,而是通過調用與虛擬機監視器內存分配相關的超級調用,由超級調用來實現真正的物理資源操作。

全虛擬化通過Binary Translation在二進制代碼級別上來避免虛擬化漏洞。類虛擬化采取的是另一種思路,即修改操作系統內核的代碼,使得操作系統內核完全避免這些難以虛擬化的指令。
請添加圖片描述

硬件輔助虛擬化

為了更好地解決x86架構下虛擬化漏洞的問題,芯片廠商擴展了其指令集來支持虛擬化。其核心思想是通過引入新的指令和運行模式,使虛擬機監視器和GuestOS分別運行在root模式和no-root模式下,這樣一來,GuestOS還是可以運行在Ring 0下的,GuestOS的內核也不需要修改。

將虛擬機監視器與GuestOS的執行環境完全隔離開,通過指令集的變化實現虛擬機監視器和GuestOS運行環境之間的相互轉換,即上文所述的root模式和no-root模式。啟動或退出root模式和no-root模式通過新添加的VMXON和VMXOFF指令實現。從root模式到no-root模式的轉換通過VMEntry指令實現,從no-root模式到root模式的轉換通過VMExit指令實現。

虛擬化架構

虛擬化架構主要分為裸金屬架構和宿主模式架構兩種

裸金屬架構

虛擬機監視器被直接安裝和運行在物理機上,依賴其自帶的虛擬內核管理,使用底層硬件資源。虛擬機監視器擁有硬件的驅動程序,不依賴特定的操作系統,其管理著宿主機及其他虛擬機。宿主機和虛擬機都安裝有各自的操作系統,即宿主機操作系統和GuestOS。裸金屬架構的代表是Xen。

請添加圖片描述

宿主機模式架構

虛擬機監視器被安裝和運行在操作系統上,依賴操作系統對硬件設備的支持和對物理資源的管理。在這種情況下,雖然虛擬機監視器對硬件資源進行訪問必須經過宿主機操作系統,但虛擬機監視器依然可以充分利用操作系統對硬件設備的支持,以及內存管理進程調度等服務。宿主模式架構的代表是KVM。

請添加圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166639.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166639.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166639.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【開源】基于JAVA的衣物搭配系統

項目編號: S 016 ,文末獲取源碼。 \color{red}{項目編號:S016,文末獲取源碼。} 項目編號:S016,文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、研究內容2.1 衣物檔案模塊2.2 衣物搭配模塊2.3 衣…

linux進程調度(二)-進程創建

文章目錄 2.進程創建和終止2.1 進程創建的4種方法2.2 進程創建過程分析2.2.1 copy_process函數分析2.2.1.1 dup_task_struct函數分析2.2.1.2 sched_fork函數分析2.2.1.3 copy_mm函數分析2.2.1.4 copy_thread函數分析 2.2.2 wake_up_new_task函數分析 2.進程創建和終止 在 Linu…

常用數據存儲格式介紹:Excel、CSV、JSON、XML

在現代數字時代,數據經過提煉后可以推動創新、簡化運營并支持決策流程。然而,在提取數據之后,并將其加載到數據庫或數據倉庫之前,需要將數據轉化為可用的數據存儲格式。本文將介紹開發者常用的4種數據存儲格式,包括 Ex…

布局下一個時代,UTONMOS夯實元宇宙發展基礎

從 PC 互聯網到移動互聯網,再到元宇宙,互聯網的發展在一直不斷演變和升級著。元宇宙的時代紅利將帶來從底層基礎設施向外延展到用戶體驗的全面升級。 人們以各自不同視角理解元宇宙。但我們認為,目前學術界和產業界對元宇宙雖然沒有統一規范的…

JavaScript 閉包技巧

什么是閉包? MDN:“閉包是捆綁在一起(封閉)的函數及其周圍狀態(詞法環境)的引用的組合。換句話說,閉包使您可以從內部函數訪問外部函數的作用域。在 JavaScript 中,每次創建函數時都…

css引入的三種方式

css引入的三種方式 一、內聯樣式二、外部樣式表三、 內部樣式表總結trouble 一、內聯樣式 內聯樣式也被稱為行內樣式。它是將 CSS 樣式直接應用于 HTML 元素的 style 屬性中的一種方式 <p style"color: blue; font-size: 16px;">這是一個帶有內聯樣式的段落。&…

Modbus RTU轉Profinet網關連接PLC與變頻器通訊在機床上應用案例

背景&#xff1a;以前在機床加工車間里&#xff0c;工人們忙碌地操作著各種機床設備。為了使整個生產過程更加高效、流暢&#xff0c;進行智能化改造。 方案&#xff1a;在機床上&#xff0c;PLC通過Modbus RTU轉Profinet網關連接變頻器進行通訊&#xff1a;PLC作為整個生產線…

實現簡單的操作服務器和客戶端(下)

一、說明 描述:本教程介紹如何使用 simple_action_client 庫創建斐波那契操作客戶端。此示例程序創建一個操作客戶端并將目標發送到操作服務器。 內容 代碼代碼解釋編譯運行操作客戶端連接服務器和客戶端二、代碼 首先,在您喜歡的編輯器中創建actionlib_tutorials/src/fib…

【封裝UI組件庫系列】封裝Icon圖標組件

封裝UI組件庫系列第三篇封裝Icon圖標組件 &#x1f31f;前言 &#x1f31f;封裝Icon 1.創建Icon組件 2.引用svg圖標庫 第一步 第二步 第三步 3.二次封裝 4.封裝自定義屬性 &#x1f31f;總結 &#x1f31f;前言 在前端開發中&#xff0c;大家可能已經用過各種各樣的UI組…

VUE項目部署過程中遇到的錯誤:POST http://124.60.11.183:9090/test/login 405 (Not Allowed)

我當初報了這個405錯誤&#xff0c;再網上查了半天&#xff0c;他們都說什么是nginx部署不支持post訪問靜態資源。 但后面我發現我是因為另一個原因才導致的無法訪問。 我再vue中有使用devServer:{ proxy:{} }進行路由轉發。 但是&#xff01;&#xff01; 在這個配置只…

接口測試學習路線

接口測試分為兩種&#xff1a; 測試外部接口&#xff1a;系統和外部系統之間的接口 如&#xff1a;電商網站&#xff1a;支付寶支付 測試內部接口&#xff1a;系統內部的模塊之間的聯調&#xff0c;或者子系統之間的數據交互 測試重點&#xff1a;測試接口參數傳遞的正確性&…

node與 pnpm、node-sass 等工具的版本兼容關系

1. node & pnpm 2. node & node-sass 3. node-sass & sass-loader sass-loader依賴于node-sass&#xff0c;以下是部分版本號對應

Zookeeper 集群中是怎樣選舉leader的

zookeeper集群中服務器被劃分為以下四種狀態&#xff1a; LOOKING&#xff1a;尋找Leader狀態。處于該狀態的服務器會認為集群中沒有Leader&#xff0c;需要進行Leader選舉&#xff1b;FOLLOWING&#xff1a;跟隨著狀態&#xff0c;說明當前服務器角色為Follower&#xff1b;LE…

Jmeter基礎和概念

JMeter 介紹&#xff1a; 一個非常優秀的開源的性能測試工具。 優點&#xff1a;你用著用著就會發現它的重多優點&#xff0c;當然不足點也會呈現出來。 從性能工具的原理劃分&#xff1a; Jmeter工具和其他性能工具在原理上完全一致&#xff0c;工具包含4個部分&#xff1a; …

綠色能源守護者:光伏運維無人機

隨著我國太陽能光伏產業被納入戰略性新興產業&#xff0c;光伏發電成為實現“雙碳”目標的關鍵之一。在政策支持下&#xff0c;光伏產業維持高速發展&#xff0c;為迎接“碳達峰、碳中和”大勢注入了強大動力。在這一背景下&#xff0c;復亞智能與安徽一家光伏企業合作&#xf…

LeetCode78. Subsets

文章目錄 一、題目二、題解 一、題目 Given an integer array nums of unique elements, return all possible subsets (the power set). The solution set must not contain duplicate subsets. Return the solution in any order. Example 1: Input: nums [1,2,3] Outpu…

size和shape的區別與聯系

對于Numpy數據類型 shape和size都是屬于Numpy的屬性 arr.shape 將返回一個包含兩個元素的元組&#xff0c;例如 (m, n)&#xff0c;其中 m 表示數組的行數&#xff0c;n 表示數組的列數。arr.size 將返回數組中元素的總數。 舉例: 輸入&#xff1a; import numpy as np# 創…

JavaScript之DOM操作

第一章 API介紹 ?API是一種事先定義好的函數&#xff0c;用來提供應用程序與開發人員基于某軟件或硬件得以訪問的一組例程&#xff0c;而又無需訪問源碼&#xff0c;或理解內部工作機制的細節。 ?Web API接口&#xff1a;瀏覽器提供的一系列操作瀏覽器功能和頁面元素的API(BO…

【Linux】Linux的常用基本指令

Linux常用基本指令 Linux指令的歷史背景前言說明一、 ls 列出文件中的所有內容常用選項 二、pwd 顯示當前所在目錄進程三、cd 將當前工作目錄改變到指定的目錄下常用樣例 四、touch 1. 更改文檔或目錄的日期時間 2. 新建一個不存在的文件常用選項 四、mkdir 1. 更改文檔或目錄的…

牛客劍指offer刷題回溯篇

文章目錄 矩陣中的路徑題目思路代碼實現 機器人的運動范圍題目思路代碼實現 矩陣中的路徑 題目 請設計一個函數&#xff0c;用來判斷在一個n乘m的矩陣中是否存在一條包含某長度為len的字符串所有字符的路徑。路徑可以從矩陣中的任意一個格子開始&#xff0c;每一步可以在矩陣…