在硬件與操作系統之間的是硬件抽象層,在操作系統與應用程序或函數庫之間的是API抽象層。硬件抽象層是計算機中軟件所能控制的硬件抽象接口,通常包括CPU的各種寄存器,內存管理模塊,I/O端口和內存映射的I/O地址等。API抽象層抽象的是一個進程所能控制的系統功能集合,包括穿件新進程,內存申請和歸還,進程間同步與共享,文件系統和網絡操作等。

系統虛擬化是指將一台物理計算機系統虛擬化為一台或多台虛擬計算機系統。每個虛擬計算機系統(簡稱虛擬機)都擁有自己的虛擬硬件(如CPU,內存和設備等),來提供一個獨立的虛擬機執行環境。通過虛擬化層的模擬,虛擬機中的操作系統認為自己仍然是獨占一個系統在運行。每個虛擬機中的操作系統可以完全不同,並且他們的執行環境是完全獨立的。這個虛擬化層被稱為虛擬機監控器(Virtual Machine Monitor,VMM)
虛擬機監視器(VMM)是一個系統軟件,可以維護多個高效的、隔離的程序環境,該環境支持用戶直接去訪問真實硬件,而這樣的程序環境就稱為虛擬機。
從本質上,虛擬計算機系統和物理計算機系統可以是兩個完全不同的ISA系統。但是,不同的ISA使得虛擬機的每一條指令都需要在物理機上模擬執行,從而造成性能下降。相同體系結構的系統虛擬化通常會有比較好的性能,VMM實現起來也會比較簡單
雲計算的一個核心思想就是在服務器端提供集中的計算資源,同時這些計算資源要獨立地服務於不同的用戶,也就是在共享的同時,為每個用戶提供隔離、安全、可信的工作環境。虛擬化技術獎是雲計算的一個基礎架構。通俗地說,雲計算實際是一個虛擬化的計算資源池,用來容納各種不同的工作模式,這些模式可以快速部署到物理設備上。虛擬化的資源按照來自用戶的需求多少動態調用資源,每個用戶都有一個獨立的計算執行環境。
在沒有虛擬化的環境中,操作系統直接負責物理處理器管理,負責進程間調度和切換。但是,VMM接管物理處理器后,客戶機操作系統沒有管理物理處理器的權利,可以說此時它已經運行在VMM為之涉及的虛擬處理器上,管理虛擬處理器,並在虛擬處理器上負責該虛擬機內進程間調度和切換。
虛擬處理器的功能可以由物理處理器和VMM共同完成。對於非敏感指令,物理處理器直接解碼處理請求,並將相關效果反應到物理寄存器上;而對於敏感指令,VMM負責陷入再模擬(是不是可以理解為敏感指令保存在虛擬寄存器,非敏感指令保存在物理寄存器上?)
在沒有虛擬化的環境里,對稱多處理技術可以讓操作系統擁有並控制多個物理處理器,它通過提供並發的計算資源和運算邏輯,允許上層操作系統同時調度多條基於不同計算目的的進程並發執行,從而有效提高系統的吞吐率和性能。同理,當物理計算資源足夠多時,VMM可以考慮為虛擬機呈現出多個虛擬處理器,也就是客戶對稱多處理器虛擬化技術,也稱SMP技術。
在沒有虛擬化的情況下,操作系統在對內存的使用與管理上達成了兩點認識:(1)內存都是從物理地址0開始的;(2)內存都是連續的,或者說至少在一些大的粒度(如256M)上連續。而對於虛擬環境中,由於物理地址為0的只有一個,無法同時滿足所有客戶機操作系統內存從0開始的要求。VMM要做的就是欺騙客戶機操作系統,讓謊言滿足客戶機操作系統對內存的兩點要求,這種欺騙過程,就是內存虛擬化。
引入了客戶機物理地址空間,內存虛擬化就主要處理以下兩個方面的問題:(1)給定一個虛擬機,維護客戶機物理地址到宿主機物理地址之間的映射關系(2)截獲虛擬機對客戶機物理地址的訪問,並根據所記錄的映射關系,將其轉換成宿主機物理地址
完全虛擬化通過Binarary Trasnlation在二進制代碼級別上來避免虛擬化漏洞,類虛擬化采用修改操作系統內核的代碼(即API級),使得操作系統內核完全避免這些難以虛擬化的指令
由於硬件體系結構在虛擬化方面設計存在缺陷,導致了虛擬化漏洞,為了進行彌補,在硬件還未提供足夠的支持之前,基於軟件的虛擬化技術給出了兩種可行的解決方案:模擬執行和直接源代碼改寫。模擬執行對應的就是基於軟件的完全虛擬化技術,直接改寫源代碼對應的是類虛擬化技術
自伸縮內存調節技術:VMM通過誘導客戶機操作系統來回收和分配客戶機所擁有的宿主機物理內存技術。具有氣球模塊,申請客戶機物理內存,但並不真正有效地使用它們,而是通知VMM這些客戶機物理內存對應的宿主機物理內存可以被回收。
頁共享技術:在一台物理主機上運行多個客戶機,VMM可以通過頁共享技術節省宿主機物理內存資源
設備模型是位於虛擬機設備驅動程序與實際設備驅動程序之間的一個模塊,由設備驅動所發出的I/O請求先通過設備模型模塊轉化為物理I/O設備的請求,再通過調用物理設備驅動來完成相應的I/O操作。反過來,設備驅動將I/O操作結果通過設備模型模塊,返回給客戶機操作系統的虛擬設備驅動程序。
第二章 x86架構及操作系統概述
2.1-2.2
分段機制:由四個基本部分構成,邏輯地址,段選擇寄存器,段描述符,段描述符表。

段選擇符

Index:段描述符表的索引
TI:用於指明索引哪個段描述符。0為GDT,全局描述符表;1為LDT,本地描述符表
段描述符
描述某個段的基地址、長度和各種屬性。當CPU通過一個邏輯地址的段選擇符獲得該段對應的段描述符后,會使用描述符中各種屬性字段對訪問進行檢查,一旦訪問被確認合法,CPU將段描述符中的32基地址和邏輯地址中的32位偏移量想加以獲得該邏輯地址對應的線性地址。
段描述符表

x86架構提供兩種段描述符,全局段描述符表(GDT)和本地段描述符表(LDT)。
為了加速對GDT和LDT的訪問,x86提供了GDTR寄存器和LDTR寄存器,描述為:GDTR:包括一個32位的基地址(BASE)和一個16位長度(LIMIT),LDTR:結構同段寄存器(包括對程序不可見的段描述符寄存器)
分頁機制讓現代操作系統中的虛擬內存機制成為可能,一個頁面可以存在於物理內存中,也可以存放在磁盤交換區域(如linux下的Swap分區,Windows下的虛擬內存文件),程序可以使用比機器物理內存更大的內存區域。操作系統在啟動過程中,通過將CR0寄存器的PG位置1來啟動分頁機制
分頁機制,一個4KB的頁面使用兩級頁表

頁目錄項:包含頁表的物理地址,CPU使用線性地址的22-31位索引頁目錄,獲得線性地址對應的頁目錄項
頁表項:包含該線性地址對應的PFN(物理頁幀號),頁表項存放在頁表中,CPU使用線性地址12-21位索引頁表,獲得該線性地址對應的頁表項
CPU在索引頁目錄前,必須知道頁目錄所在的物理地址,該物理地址存放在CR3寄存器,也稱為頁目錄基地址寄存器(PDBR)
TLB:旁路轉換緩沖區。為了提高地址轉換的效率,x86架構使用TLB對最近用到的頁面映射進行緩存,當CPU訪問某個線性地址,其所在頁面的映射存在於TLB中,無須查找頁表即可進行地址轉換。當操作 系統對頁表進行修改后,要負責對TLB中對應的條目進行刷新,以保證緩存的一致性。刷新方式有:(1)更新CR3,TLB整體刷新(2)INVLPG指令,對TLB單獨頁目錄項,頁表項刷新

總結以上即為:CPU先訪問TLB緩存,若有對應項,從TLB中得到物理地址,如果沒有對應項,CPU在訪問頁表,如果在頁表中有對應項,在頁表中得到對應的物理地址,如果沒有對應項,產生缺頁中斷,用調度算法從磁盤中獲取頁面
x86四種運行模式:實模式,保護模式,SMM模式和虛擬8086模式。
實模式:CPU加電經歷最初混沌狀態,首先進入實模式。操作系統或BIOS通常在該模式下准備必要的數據結構和初始化關鍵寄存器,然后切換進入保護模式
保護模式:操作性運行時最常用的模式,CPU所有功能幾乎都能使用,可以訪問架構允許的所有物理地址空間
操作系統對中斷/異常的處理流程
一個中斷/異常發生,打斷當前正在執行的任務
(1)CPU通過vector索引IDT表得到對應的門,並獲得其處理函數的入口地址
(2)程序跳轉到處理函數執行,由於處理函數存放在CPL=0的代碼段,程序可能會發生權限提升,處理函數通常執行下列幾個步驟
i 保存被打斷任務的上下文,並開始執行處理函數;
ii 如果是中斷,處理完成后需要寫EOI寄存器(偽中斷不需要)應答,異常不需要
iii 恢復被打斷的任務上下文,准備返回
(3)從中斷/異常的處理函數返回,恢復被打斷的任務,使其繼續執行
進程:盡管表面上看起來程序和進程非常類似,但本質上他們是截然不同的。程序是指一個靜態的指令序列,而進程則是一個容器,其中包含了當執行一個程序的特定實例時所用到的各種資源
上下文切換是指程序從一種狀態切換到另一種狀態,或從一個程序切換到另一個程序(例如進程切換)時,導致上下文相關寄存器值的變化行為,這種變化是指就程序上下文相關寄存器的值被保存到內存中,新程序上下文寄存器的值被加載到寄存器中。通常只有三種情況:用戶態到內核態的切換;進程切換;到中斷上下文的切換
中斷的處理函數運行在特殊的上下文環境,稱為中斷上下文
設備通過寄存器和設備RAM將自身的功能展現給CPU,CPU讀寫這些寄存器和RAM即可完成對設備的訪問和操作。
DMA(直接內存訪問)是將CPU從I/O操作中解放,通過DMA,驅動程序可以事先設定一個內存地址,設備就可以繞開CPU直接向內存中復制或讀取數據。DMA可以分為兩種:(1)同步DMA:是指DMA操作由軟件發起(2)異步DMA:是指DMA操作由設備發起
第三章 虛擬化概述
傳統的虛擬化技術一般是通過陷入再模擬的方式實現的,而這種方式依賴於處理器的支持,也就是說,處理器本身是否是一個可虛擬化的體系結構。VMM對物理資源的虛擬可以歸結為三個主要任務:處理器虛擬化,內存虛擬化和I/O虛擬化
虛擬環境由三個部分組成:硬件,VMM和虛擬機。在沒有虛擬化的情況下,操作系統直接運行在硬件之上,管理底層的物理硬件,這就構成了一個完整的計算機系統,也就是所謂的“物理機”。在虛擬環境里,虛擬機監控器VMM搶占了操作系統的位置,變成了真是物理硬件的管理者,同時向上層的軟件呈現出虛擬的硬件平台,而此時操作系統運行在虛擬平台上,仍然管理着它認為是“物理硬件”的虛擬硬件。

特權指令:系統中有一些操作和管理關鍵系統資源的指令,這些指令只有在最高特權級上才能正確運行。
敏感指令:操作特權資源的指令,包括修改虛擬機的運行模式,讀寫時鍾,中斷等寄存器。主要是在虛擬化場景下,客戶機OS內核的特權被解除,從原來的0降到1或者3,這部分特權指令在客戶機OS中發生時,就會產生Trap,被VMM捕獲,從而由VMM完成。虛擬化場景中敏感指令必須被VMM捕獲並完成。對於一般 RISC 處理器,如 MIPS,PowerPC 以及 SPARC,敏感指令肯定是特權指令,但是x86 例外,但是x86絕大多數的敏感指令是特權指令,但是由部分敏感指令不是特權指令,執行這些指令的時候不會自動trap被VMM捕獲
陷入再模擬:如果一個系統上所有敏感指令都是特權指令,則能夠用一個簡單的方法來實現一個虛擬環境:將VMM運行在系統的最高特權級上,而將客戶機操作系統運行在非最高特權級上,當客戶機操作系統因執行敏感指令(此時,也就是特權指令)而陷入到VMM中,VMM模擬執行引起一場的敏感指令,這種方法被稱為“陷入再模擬”
虛擬化漏洞:判斷一個結構是否可虛擬化,核心在於該結構對敏感指令的支持上,如果某些結構上所有敏感指令都是特權指令,則它是可虛擬化結構,否則如果它無法支持在所有的敏感指令上觸發異常,則不是一個可虛擬化結構,稱其存在虛擬化漏洞
當客戶機操作系統試圖訪問關鍵資源時,該請求不會真正發生在物理寄存器上,相反,VMM會通過准確模擬物理處理器的行為,而將其訪問定位到VMM為其設計與物理寄存器相應的“虛擬”寄存器上。例如:當處理器取指令MOV CR0,EAX后,發現特權級別不符合,則拋出異常,VMM截獲這個異常之后模擬處理器的行為,讀取EAX內容並存放到虛擬的CR0中,由於虛擬CR0存放在VMM為該虛擬機設計的內存區域里,因此該指令執行的結果不會讓物理的CR0內容改變,等到下一次虛擬機試圖讀CR0時,處理器也會拋出異常,然后由VMM從虛擬的CR0而不是從物理的CR0中返回內容給虛擬機
對稱多處理技術:可以讓操作系統擁有並控制多個物理處理器,它提供並發的計算資源和運算邏輯。即有多個CPU可以並發執行。當物理計算資源足夠多時,VMM也可以考慮為虛擬機呈現出多個虛擬處理器,也就是客戶對稱多處理器虛擬化技術,也稱客戶SMP技術。

在沒有虛擬化的情況下,操作系統在內存的使用和管理上達成了兩點認識:內存都是從物理地址0開始的;內存都是連續的,或者說至少在一些大的粒度(如256MB)上連續。
為了更有效的利用空閑的物理內存,尤其是系統長期運行后產生的碎片,VMM通常會以比較小的粒度(如4KB)進行分配,這就造成了給定一個虛擬機的物理內存實際上是不連續的問題,其具體位置完全取決於VMM的內存分配算法。
引入了客戶機物理地址空間,內存虛擬化就主要處理兩個方面的問題:給定一個虛擬機,維護客戶機物理地址到宿主機物理地址之間的映射關系;截獲虛擬機對客戶機物理地址的訪問,並根據所記錄的映射關系,將其轉換為宿主機物理地址。
客戶機操作系統采用客戶頁表維護客戶機虛擬地址到客戶機物理地址的映射:GPA=f1(GVA),GVA為客戶機虛擬地址,GPA為客戶機物理地址。而VMM負責客戶機物理地址到宿主機物理地址之間的映射:HPA=f2(GPA),HPA表示宿主機物理地址
I/O虛擬化:現實中外設資源是有限的,為了滿足多個客戶機操作系統對外設訪問的需求,VMM必須通過I/O虛擬化的方式復用有限的外設資源,在面臨這種問題時,VMM所要做的是模擬,即截獲客戶操作系統對設備的訪問請求,然后通過軟件的方式模擬真實物理設備的效果,仍然是欺騙客戶機操作系統,這種模擬過程,就是I/O虛擬化。
設備發現就是要讓VMM提供一種方式,來讓客戶機操作系統發現虛擬設備, 這樣客戶操作系統才能加載有關的驅動程序,這是I/O虛擬化的第一步
VMM實現虛擬機間的通信機制,並向虛擬機提供相應的API。虛擬機的客戶機操作系統通過調用這些API與其他虛擬機進行通信。VMM除了提供虛擬機之間通信的API外,也提供虛擬機與VMM之間交互的API
類虛擬化技術,其主要思想是通過客戶機操作系統與虛擬化管理層的協同設計,由虛擬化管理層軟件提供一個近似於原物理系統,但又不完全相同的虛擬平台,以表面虛擬化漏洞和實現更高的虛擬化效率。虛擬化技術需要修改操作系統的源代碼來與下層的虛擬化管理層軟件協同工作,從而避免體系結構上的缺陷
VMM按照虛擬平台分類,可分為:完全虛擬化和類虛擬化。前者是虛擬平台可以運行現有的操作系統,不需要對操作系統進行任何修改,后者是平台在現實中不存在,而是通過VMM重新定義,這樣的虛擬平台需要對所運行的客戶機操作系統進行或多或少的修改使之適應虛擬環境
類虛擬化:通過在源代碼級別修改指令以回避虛擬化漏洞的方式來使VMM能夠對物理資源實現虛擬化。對於x86一些難以虛擬化的指令,完全虛擬化通過在二進制代碼級別(掃描客戶機二進制代碼,將難以虛擬化的指令轉化為支持虛擬化的指令)上來避免虛擬化漏洞。類虛擬化采取修改操作系統內核的代碼(即API級),使得操作系統內核完全避免這些難以虛擬化的指令
VMM實現結構分類:(1)Hypervisor模型:優點:VMM同時具備物理資源的管理功能和虛擬化功能,因此,物理資源虛擬化的效率會更高。虛擬機的安全只依賴於VMM安全;缺點:VMM由於完全擁有物理資源,因此VMM需要進行物理資源的管理,包括設備驅動,而對於設備驅動開發的工作量很大,因此任務量較大。(2)宿主模型:物理資源由宿主機操作系統管理。宿主機操作系統是傳統的操作系統,如windows,linux等,這些傳統的操作系統並不是為虛擬化而設計的,因此本身不具備虛擬化功能,實際的虛擬化功能由VMM來提供。最大的優點是可以充分利用現有操作系統的設備驅動程序,VMM無須為各類I/O設備重新實現驅動程序。但缺點在於,安全方面,由於VMM是宿主機操作系統內核的一部分,因此,如果宿主機操作系統內核是不安全的,VMM也是不安全的。(3)混合類型:上述兩種模式的混合體。VMM依然在最底層,擁有所有的物理資源,但是VMM會主動讓出大部分I/O設備控制權,交由一個運行在特權虛擬機中的特權操作系統控制
第四章 基於軟件的完全虛擬化
解釋執行:在模擬技術中,最簡單的模擬技術是解釋執行,即取一條指令,模擬出這條指令執行的效果,再繼續取下一條指令,由於一條一條取指令不會漏過每一條指令,在某種程度上即每條指令都陷入了,所以解決了陷入再模擬的問題,進而避免了虛擬化漏洞。但雖然這種方法保證了所有指令執行受到VMM的監視控制,然后它對每條指令不區別對待,其最大的缺點就是性能太差。
掃描和修補:由於解釋執行有很大的性能損失,加上虛擬機中模擬的CPU和物理CPU體系結構是相同的,這樣大多數指令可以被映射到物理CPU上直接運行。掃描和修補技術即通過這樣的方式,讓大多數指令直接在物理CPU上運行,而把操作系統代碼中的敏感指令替換為跳轉指令或會陷入到VMM中去的指令,使其一旦運行到敏感指令處控制流就會進入VMM中,由VMM代為模擬執行。流程如下:(1)VMM會在虛擬機開始執行每段代碼之前對其進行掃描,解析每一條指令,查找到特權指令和敏感指令(2)補丁代碼會在VMM中動態生成,通常每一個需要修補的指令會對應一塊補丁代碼(3)敏感指令被替換成一個外跳轉, 從虛擬機跳轉到VMM的空間里,在VMM中執行動態生成的補丁代碼(4)當補丁代碼執行完后,執行流再跳轉回虛擬機中的下一條代碼繼續執行

掃描與修補原理:大部分指令都能被物理CPU載入執行,但對於一些敏感指令將會被VMM替換為外跳轉,其對應一塊補丁代碼,外跳轉將會執行補丁代碼,從而模擬指令的功能
二進制代碼翻譯
將客戶機操作系統代碼放置在緩存中,不會被物理機CPU直接執行
內存虛擬化的目的:提供虛擬機一個從零開始的連續的物理內存地址;各個虛擬機之間有效隔離,調度以及共享資源
VMM為每個虛擬機動態維護一個從客戶機物理地址到宿主機物理地址的表,使得多個虛擬機之間相互隔離,可以各自擁有從零開始的物理內存地址。VMM截獲對客戶機物理地址的訪問,將其訪問為宿主機對應的物理地址。
影子頁表就是一種對應的客戶機虛擬機地址到宿主機物理地址的映射表