物理機(jī)器是由CPU,內(nèi)存和I/O設(shè)備等一組資源構(gòu)成的實(shí)體。虛擬機(jī)也一樣,由虛擬CPU,虛擬內(nèi)存和虛擬I/O設(shè)備等組成。VMM(VM Monitor)按照與傳統(tǒng)OS并發(fā)執(zhí)行用戶進(jìn)程的相似方式,仲裁對(duì)所有共享資源的訪問(wèn)。本文將分別討論CPU虛擬化、內(nèi)存虛擬化和I/O虛擬化技術(shù)的原理和實(shí)現(xiàn)。
在虛擬化的平臺(tái)上,虛擬機(jī)(guest VM)所使用的多個(gè)虛擬CPU(以下稱(chēng)vCPU)可能是共享同一個(gè)物理CPU(以下稱(chēng)pCPU)的。VMM負(fù)責(zé)vCPU的調(diào)度,當(dāng)一個(gè)vCPU被調(diào)度到獲得pCPU的使用權(quán)后,基于該vCPU運(yùn)行的guest OS又可以調(diào)度OS中的各個(gè)線程/進(jìn)程了。也就是說(shuō),guest OS中的各個(gè)線程/進(jìn)程分時(shí)復(fù)用了vCPU,而各個(gè)vCPU又分時(shí)復(fù)用了pCPU。
為了從硬件上提供對(duì)vCPU調(diào)度和切換的支持,Intel推出了被稱(chēng)為VT-x(Virtualization Technology for x86)的CPU虛擬化擴(kuò)展技術(shù),用戶可通過(guò)VMXON/VMXOFF指令打開(kāi)/關(guān)閉這個(gè)功能。和Intel亦敵亦友的AMD也推出了被稱(chēng)為AMD-V的對(duì)應(yīng)技術(shù)。
在Linux中,從用戶空間trap到內(nèi)核空間可以通過(guò)system call或者interrupt/exception。以system call基于x86的實(shí)現(xiàn)為例,早期x86提供的trap方法是int 0x80這樣的software interrupt機(jī)制,而后改成了SYSENTER/SYSEXIT的指令對(duì),現(xiàn)在則已經(jīng)被速度更快的SYSCALL/SYSRET取代了。
類(lèi)似地,在VT-x中,從guest VM進(jìn)入VMM(這個(gè)過(guò)程被稱(chēng)為VM exit)通常有三種方式:
1)執(zhí)行VMCALL指令,這種方式被稱(chēng)為hyper call,跟執(zhí)行SYSCALL指令實(shí)現(xiàn)的system call原理差不多。
2)發(fā)生了硬件中斷或軟件異常。
3)guest VM執(zhí)行了一些敏感指令。有一些敏感指令并不會(huì)產(chǎn)生VM exit,比如SYSENTER;有一些敏感指令則可以根據(jù)下面將要介紹的VM executation control fields配置來(lái)選擇是否產(chǎn)生VM exit。
進(jìn)入VMM就意味著從non-root mode進(jìn)入了root mode,反之,從VMM返回guest VM(這個(gè)過(guò)程被稱(chēng)為VM entry)則是重新回到了non-root mode,mode的切換意味著上下文(context)的保存和恢復(fù)。
上下文其實(shí)是個(gè)難以定義的概念,它是從CPU的角度引出的,簡(jiǎn)單地說(shuō),上下文就是程序(進(jìn)程/中斷)運(yùn)行時(shí)所需要的寄存器的最小集合,這些寄存器的后面可能代表著程序運(yùn)行的一類(lèi)資源。
上下文切換是指程序從一種狀態(tài)切換到另一種狀態(tài)(比如從用戶態(tài)切換到內(nèi)核態(tài)),或者從一個(gè)程序切換到另一個(gè)程序(比如進(jìn)程切換)時(shí),導(dǎo)致上下文相關(guān)寄存器的值變化的行為。對(duì)于上下文切換時(shí)不需要改變的寄存器,也可以說(shuō)它不是該程序的上下文。
VMCS
在Linux中,一個(gè)進(jìn)程的相關(guān)信息保存在task_struct中。虛擬機(jī)的上下文比進(jìn)程的上下文更為復(fù)雜,在VT-x中,由VMCS(Virtual-Machine Control data Structures)負(fù)責(zé)保存vCPU需要的相關(guān)狀態(tài)和上下文信息。
VMCS在使用時(shí)需要和pCPU綁定。一個(gè)pCPU可以對(duì)應(yīng)多個(gè)vCPU,而一個(gè)vCPU對(duì)應(yīng)一個(gè)VMCS,但在任意給定時(shí)刻,一個(gè)pCPU上只能運(yùn)行一個(gè)vCPU(就像在多線程調(diào)度中,某一時(shí)刻,一個(gè)CPU上只能運(yùn)行一個(gè)線程一樣)。
因此,一個(gè)pCPU只能綁定一個(gè)VMCS,一個(gè)VMCS也只能與一個(gè)pCPU綁定,可分別通過(guò)VMPTRLD/VMCLEAR指令建立/解除兩者的綁定關(guān)系。VMCS存放在內(nèi)存中,一個(gè)VMCS占據(jù)4KB大小,由6個(gè)區(qū)域組成:
1)Guest state area,用于保存CPU在non-root mode下運(yùn)行時(shí)的狀態(tài)。當(dāng)發(fā)生VM exit的時(shí)候,CPU將自己當(dāng)前的狀態(tài)保存到guest state area中,當(dāng)發(fā)生VM entry的時(shí)候,guest state area保存的狀態(tài)將被自動(dòng)加載到CPU中。
其實(shí)也不用一口氣將所有寄存器的值都恢復(fù),反正都是保存在VMCS中的,可以等到該寄存器真正被guest使用到時(shí)再恢復(fù),這就是LazySave/Restore,其基本思想是盡量將寄存器的保存/恢復(fù)延遲到最后一刻,減少無(wú)用功,提高上下文切換的效率。這種思想在Linux的實(shí)現(xiàn)中也比比皆是,比如copy on write, demand paging等,拖延癥也不見(jiàn)得是件壞事哈。
2)Host state area,用于保存CPU在root mode下運(yùn)行時(shí)的狀態(tài)。需要保存的寄存器和guest state area是差不多的,但是保存/恢復(fù)的過(guò)程是剛好反過(guò)來(lái)的。
3)VM executation control fields,用于控制non-root模式下CPU的行為。出于優(yōu)化的目的,VMM可以讓某些敏感指令不產(chǎn)生VM exit,以減少mode切換帶來(lái)的上下文開(kāi)銷(xiāo),而這就是由VM execution control來(lái)實(shí)現(xiàn)的。
比如讀取timestamp的RDTSC指令,在一些延時(shí)函數(shù)的實(shí)現(xiàn)中,該指令會(huì)被頻繁使用,如果每次guest執(zhí)行該指令的時(shí)候都trap到VMM,那系統(tǒng)開(kāi)銷(xiāo)就太大了,這時(shí)VMM可以選擇每隔一段時(shí)間讀取物理CPU真實(shí)的 timestamp值,然后填寫(xiě)guest 的timestamp虛擬寄存器,來(lái)達(dá)到模擬RDTSC指令的效果。
4)VM exit control fields,用于規(guī)定VM exit時(shí)CPU的行為,比如是否應(yīng)答外部中斷。
5)VM exit information fields。VMM除了通過(guò)VM exit control fields來(lái)控制VM exit的行為,還需要知道VM exit的相關(guān)信息(比如trap的具體原因),這些信息就是保存在VM exit information fields中的。
6)VM entry control fields,用于控制VM entry的過(guò)程,比如后續(xù)的文章要介紹的中斷注入。
VM executation control可理解為what to trap,就是哪些event會(huì)引起trap,哪些不會(huì)。VM exit control可理解為how to trap,VM exit information則可理解為why to trap。讀寫(xiě)VMCS這段內(nèi)存空間需要使用專(zhuān)門(mén)的VMREAD和VMWRITE指令。
小結(jié)一下,一個(gè)完整的VT-x使用流程是這樣的:首先需要通過(guò)CPUID指令檢查當(dāng)前CPU是否支持虛擬化擴(kuò)展。如果支持,則通過(guò)VMXON使能VT-x,建立VMCS并通過(guò)VMPTRLD綁定物理CPU。
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120375 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
593瀏覽量
27397 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
917瀏覽量
28202 -
硬件中斷
+關(guān)注
關(guān)注
0文章
11瀏覽量
6843 -
VMM
+關(guān)注
關(guān)注
0文章
11瀏覽量
10073
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論