虚拟化技术
1、虛擬化基本知識
計算機的基本部件
控制集:CPU
存儲:mem,
I/O:
keyboard,moitor
虛擬化就是將一組物理平臺,虛擬化為多組不同的,彼此之間隔離的平臺。
CPU在OS安裝以后就已經(jīng)被虛擬化了,每個進程認為自己是獨占CPU,內(nèi)存的。CPU的虛擬化就是將其分為時間片
用戶空間的進程需要使用硬件,
cpu執(zhí)行方式:
最外層運行普通指令環(huán)3,用戶空間的執(zhí)行運行在這里
最內(nèi)存環(huán)0:也叫特權(quán)環(huán),所有特權(quán)指令,cpu中敏感寄存器,尤其是硬件管控寄存機需要由環(huán)0中指令才能執(zhí)行,也就是內(nèi)和空間在環(huán)0
環(huán)1與環(huán)2(但是在x86平臺上有些敏感指令也運行在這些環(huán)上運行)
運行在環(huán)3上的guest內(nèi)核如何調(diào)用硬件?
guest的cpu實現(xiàn)方式:
3、軟件模擬,創(chuàng)建一個進程或者一個線程模擬的cpu,讓guest使用
X86虛擬化面臨的常出的問題: 1、特卻集壓縮:某些敏感指令,放在環(huán)1,環(huán)2上, 內(nèi)核運行在環(huán)0上,但是兼顧環(huán)1,環(huán)2,如果運用虛擬化,guestOS需要運行在環(huán)1,環(huán)2上。從而可以直接運行敏感指令,所以這些指令需要自行捕獲,
才會避免guestOS避免執(zhí)行這些指令。 2、特卻集別名:guestOS操作系統(tǒng)實際運行在環(huán)1,環(huán)2上,但guestOS認為自己運行在環(huán)0,所以我們需要將環(huán)1,環(huán)2將其虛擬為環(huán)0.因此我們需要將其起名為環(huán)0 3、非特權(quán)敏感指令:x86平臺上有些敏感指令運行在環(huán)1,環(huán)2上。
4、地址空間壓縮:每一個虛擬機所得到的內(nèi)存地址空間中必須保留一部分給vmm(虛擬機監(jiān)控器,比如關(guān)閉虛擬機之類的命令)使用。說明有些vmm直接運行在GuestOS當中的。HOST主機中。vmm會進入虛
擬化和退出虛擬化。所以guestOS使用的內(nèi)存需要給vmm保留一部分,實際使用要比看上去少,使用的地址被壓縮了。 5、靜默特權(quán)失敗:X86的某些特卻指令在執(zhí)行失敗后不會返回錯誤的。所以vmm不能捕獲這些錯誤。我們就不知道各個虛擬機實例運行的狀態(tài)。 6、屏蔽虛擬化:在虛擬化場景中,屏蔽中斷,和非屏蔽中斷,guestOS對于特權(quán)資源的每次訪問都會觸發(fā)處理器異常,(中斷發(fā)生,處理器必須要要處理)都需要在中斷時異常需要由vmm處理,
然后再把結(jié)果送個guest中。來回切換導(dǎo)致性能降低。
4、CPU實現(xiàn)虛擬化方式:
1、完全虛擬化
BT技術(shù)提升虛擬化性能 二進制翻譯
硬件層 ---> 環(huán)0(vmm) ----> 環(huán)1 (guestos 內(nèi)核)----> 環(huán)2 空閑 ---->環(huán)3(應(yīng)用程序)
guestOS與vmm之間使用的二進制翻譯
這個平臺為完全虛擬化,guestOS不知道自己是虛擬化。這種虛擬化需要給每個guestOS虛擬機模擬一個環(huán)0,所以性能確實很厲害
2、 半虛擬化:
硬件層 ---> 環(huán)0(vmm 與 guestos 內(nèi)核)) ----> 環(huán)1 、 環(huán)2 空閑 ---->環(huán)3(應(yīng)用程序)
guestOS不會直接調(diào)用環(huán)0,特權(quán)指令需要使用VMM,這時guestOS知道自己是虛擬化。(hypercall調(diào)用請求)
guestOS的內(nèi)核被修改了。知道自己是虛擬化。windows不能運行在半虛擬化環(huán)境,因為不能修改close的操作系統(tǒng)
3、硬件虛擬化 hvm
cpu虛擬化
硬件層 --->環(huán) -1 (vmm)-----> 環(huán)0( guestos 內(nèi)核) ----> 環(huán)1 、 環(huán)2 空閑 ---->環(huán)3(應(yīng)用程序)
guestos內(nèi)核直接安裝在環(huán)0上,不用做修改,cpu設(shè)計時直接支持虛擬化,但是環(huán)0上沒有特權(quán)指令上,只能捕獲操作特權(quán)指令,然后交給環(huán)-1上的vmm來執(zhí)行。
但是由于還是需要環(huán)-1 環(huán)0 來回切換,還是性能比半虛擬化要差一些
5、內(nèi)存虛擬化:
正常的內(nèi)存使用就是被虛擬化的。
指令和數(shù)據(jù)都是由內(nèi)存中獲取的。內(nèi)存本身就是由物理地址轉(zhuǎn)換成線性地址,(MMU來處理的)
MMU 工作原理:
線性空間轉(zhuǎn)換成物理空間的關(guān)系存在頁表當中的。 (page table)
每個進程給cpu發(fā)送指令時,cpu要將 page table 及時的加載到mmu,然后通過mmu va ---> pa的轉(zhuǎn)換
虛擬化后的內(nèi)存虛擬化:
GVA ---> GPA ---> HPA
guestOS線性地址空間 -----> guestOS的物理地址空間 -----> HostOS的物理地址空間
當guestOS中用戶空間訪問內(nèi)存中數(shù)據(jù),直接發(fā)送給HostOS cpu,此時由VMM捕獲到,HCPU通過MMU找到對應(yīng)的物理內(nèi)存地址后會把地址結(jié)果給到VMM,VMM在通知guestOS
GPA的位置,然后guestOS到gpa中查找。
后來inter X86 硬件支持(影子mmu),有2個MMU,每次訪問內(nèi)存地址會同時發(fā)給這兩個mmu,如果是虛擬機訪問的就直接返回給虛擬機HPA的地址,跳過了中間的GPA的轉(zhuǎn)換過程。
tlb技術(shù):保存了va--->pa的對應(yīng)關(guān)系 ,加快MMU的轉(zhuǎn)換速度,但是如果多個guestOS時,為了不混淆多個虛擬機的地址對應(yīng)關(guān)系,所以需要都清除tlb
后來又有了tagtlb ,這樣在tlb中增加了標記,標記著是那臺虛擬機的映射。
6、io虛擬化
本身就很慢,在虛擬化后更慢
IO虛擬化實現(xiàn)的方式借鑒于VMM模型
type-1、type-2
type1:
虛擬機直接跑在硬件上,有一個實例是特權(quán)實例(dome0),管理其他的虛擬機
=======> ,
io完全虛擬化 : guestOS調(diào)用dome0的虛擬硬盤接口,dome0然后再真正調(diào)用物理IO設(shè)備的接口,進行二次驅(qū)動,這種模擬IO性能比較差
io半虛擬化,前段分為兩半,一般在domeU中,后端在dome0上,前段簡單封裝送給后端,后端做訪問真正IO設(shè)備,進行IO設(shè)備的調(diào)用。
io由dome0自己調(diào)用。hv自己不會有過多的硬件驅(qū)動。所以要借助dome0 io 等各種驅(qū)動。
hypervisor自我實現(xiàn)驅(qū)動硬件,各個硬件廠商需要單獨開發(fā)給hv提供驅(qū)動,但是廠商不會專門給某個hv提供驅(qū)動的,所以hv需要自己開發(fā)驅(qū)動程序。但是硬件設(shè)備太多,自己開發(fā)硬件驅(qū)代價太大,
所以這種的虛擬化技術(shù)對于硬件的兼容性太差。 買服務(wù)器需要找好型號。
io虛擬化,是使用文件來模擬io設(shè)備。 dome0軟件模擬硬件真實的借口。
type-2: 虛擬機跑在操作系統(tǒng)上
vmm不用自己提供任何驅(qū)動,只需要模擬各硬件,真正設(shè)備的驅(qū)動又host來提供
梳理:
各vmm對io的驅(qū)動有三種模式:
類型1:半虛擬化,自主vmm:vmm自行提供驅(qū)動
混合vmm:借助于外在OS提供驅(qū)動。XEN、VM
1、依賴于外部OS提供特權(quán)域
2、自我提供特權(quán)提供特權(quán)域
類型2: 寄宿方式,有宿主機的VMM
IO虛擬化模型:
純模擬,完全虛擬化
半虛擬化
透傳:無論是半虛擬化還是模擬都需要借助dome0來實現(xiàn)IO虛擬化的,透傳則是由guest直接使用硬件。dome0管理各硬件
另一種技術(shù):
SR-IOV:將一個硬件輪流給多個guestOS使用。
完全虛擬化:vm(類型2) vb kvm, vm-exsi(類型1)
半虛擬化:xen (類型1)
總結(jié)
- 上一篇: 蓝牙音箱怎么连接电脑电脑如何接蓝牙音箱
- 下一篇: 共用路由器的两个电脑怎样进入对方桌面共路