第三章 虚拟化概述(处理器虚拟化)
一、指令模擬
??????? 處理器虛擬化的關(guān)鍵在于正確的模擬指令行為,其中涉及到三個(gè)概念:虛擬寄存器、上下文和虛擬處理器。
??????? 虛擬寄存器
??????? 從某種程度上說(shuō),物理處理器無(wú)非包括了一些存放數(shù)據(jù)的物理寄存器,并且規(guī)定了使用這些寄存器的指令集。程序代碼就是物理處理器按照一段預(yù)先寫好的指令流,在給定時(shí)間點(diǎn)使用給定的部分物理寄存器來(lái)完成某種目的。
??????? 在沒(méi)有虛擬化的環(huán)境中,操作系統(tǒng)直接訪問(wèn)物理寄存器,處在最高級(jí)權(quán)限,可以控制系統(tǒng)中的所有關(guān)鍵資源,包括寄存器、內(nèi)存和I/O外設(shè)。而當(dāng)虛擬機(jī)接管物理處理器之后,操作系統(tǒng)運(yùn)行在非最高級(jí)權(quán)限后,其試圖訪問(wèn)關(guān)鍵資源的指令就成為了敏感指令。虛擬機(jī)會(huì)使用各種手段,保證敏感指令的執(zhí)行能夠觸發(fā)異常,從而陷入到虛擬機(jī)中進(jìn)行模擬,防止對(duì)虛擬機(jī)運(yùn)行的破壞。
??????? 所以,當(dāng)客戶機(jī)操作系統(tǒng)試圖訪問(wèn)關(guān)鍵資源的時(shí)候,該請(qǐng)求不會(huì)真正發(fā)生在物理寄存器上。相反,虛擬機(jī)會(huì)通過(guò)準(zhǔn)確的模擬物理處理器的行為,將其訪問(wèn)定位到虛擬機(jī)為其設(shè)計(jì)與物理寄存器對(duì)應(yīng)的虛擬寄存器上。當(dāng)然,從虛擬機(jī)的實(shí)現(xiàn)上來(lái)說(shuō),這樣的虛擬器往往是在內(nèi)存中。
??????? 上下文
??????? 在沒(méi)有虛擬化的環(huán)境中,操作系統(tǒng)直接負(fù)責(zé)物理處理器管理,負(fù)責(zé)進(jìn)程間調(diào)度和切換。但當(dāng)虛擬機(jī)接管物理處理器之后,操作系統(tǒng)運(yùn)行在虛擬機(jī)為其設(shè)計(jì)的虛擬處理器上,并在虛擬處理器上負(fù)責(zé)該操作系統(tǒng)內(nèi)進(jìn)程間調(diào)度和切換。虛擬機(jī)管理物理處理器,負(fù)責(zé)虛擬處理器的調(diào)度和切換。
????????不管何種調(diào)度切換,必然要涉及到保留現(xiàn)場(chǎng),這個(gè)現(xiàn)場(chǎng)就是上下文狀態(tài)。只不過(guò),對(duì)于操作系統(tǒng)而言是進(jìn)程上下文,對(duì)于虛擬機(jī)而言是虛擬處理器上下文。(程序運(yùn)行在操作系統(tǒng)上以進(jìn)程的形式存在,操作系統(tǒng)運(yùn)行在虛擬機(jī)上以虛擬處理器的形式存在。虛擬機(jī)不關(guān)心虛擬處理器上運(yùn)行的是操作系統(tǒng)還是其他的什么代碼,它面對(duì)的運(yùn)行單元室虛擬處理器,它只負(fù)責(zé)虛擬機(jī)理器的上下文正確。而操作系統(tǒng)也一樣,它不管進(jìn)程運(yùn)行的是代碼有沒(méi)有l(wèi)ongjmp,有沒(méi)有信號(hào)處理程序,它只負(fù)責(zé)進(jìn)程上下文正確)
??????? 虛擬處理器上下文比進(jìn)程上下文更負(fù)責(zé),因?yàn)榭蛻舨僮飨到y(tǒng)本身包含許多敏感指令,會(huì)試圖訪問(wèn)和修改物理處理器上定義的所有寄存器,而這種訪問(wèn)和修改會(huì)被虛擬機(jī)重定位到虛擬處理器上。所以,對(duì)于虛擬處理器,其上下文包括了更多的系統(tǒng)的寄存器,上下文的保存和恢復(fù)也更為復(fù)雜。(曾經(jīng)看過(guò)Linux和Fiasco內(nèi)核中對(duì)虛擬化的支持,有大量的數(shù)據(jù)結(jié)構(gòu)定義了物理處理器定義的寄存器,通用的系統(tǒng)的雜的。當(dāng)然,不是全部的,因?yàn)椴僮飨到y(tǒng)一般不會(huì)使用全部的指令和寄存器。所定義的,也只是物理處理器定義的所有寄存器的子集)
??????? 虛擬處理器
??????? 虛擬處理器是一個(gè)邏輯上虛擬機(jī)的概念,而不是物理的概念,可分別從客戶操作系統(tǒng)和虛擬機(jī)去看待理解它。
??????? 客戶操作系統(tǒng)角度:要求虛擬處理器與其”期望“的物理處理器一致的功能和行為。典型的”期望“包括:
??????? 1、指令集合和執(zhí)行效果
??????? 2、可用寄存器集合,系統(tǒng)的通用的
??????? 3、運(yùn)行模式(運(yùn)行模式?jīng)Q定了指令執(zhí)行效果、尋址寬度與限制、保護(hù)粒度等)
??????? 4、地址翻譯系統(tǒng)
??????? 5、頁(yè)保護(hù)機(jī)制
??????? 6、中斷/異常機(jī)制
??????? 虛擬機(jī)角度:虛擬處理器是需要模擬完成的一組功能集合。虛擬處理器的功能可以由物理處理器和虛擬機(jī)共同完成。對(duì)于非敏感指令,物理處理器直接解碼處理,并將相關(guān)結(jié)果直接反應(yīng)到物理寄存器上;而對(duì)于敏感指令,虛擬機(jī)負(fù)責(zé)陷入再模擬,并將相關(guān)結(jié)果反應(yīng)到虛擬寄存器上。從程序角度出發(fā),虛擬機(jī)陷入再模擬的這部分也就是一組數(shù)據(jù)結(jié)構(gòu)(虛擬寄存器)和相關(guān)處理代碼(模擬指令)的集合。
??????? 概括來(lái)講,虛擬機(jī)利用了處理器的保護(hù)機(jī)制來(lái)完成的,其宗旨是讓敏感指令能陷入虛擬機(jī)中被模擬執(zhí)行,而不是直接作用在真實(shí)硬件上。它有以下幾種方式:
??????? 1、基于處理器的保護(hù)機(jī)制出發(fā)的異常
??????? 2、主動(dòng)觸發(fā)異常
??????? 3、異步中斷
二、中斷和異常的模擬及注入
??????? 異常保證了系統(tǒng)程序?qū)μ幚砥麝P(guān)鍵資源的絕對(duì)控制,而中斷提供了與外設(shè)之間更有效的一種交互模式。所以,虛擬機(jī)在實(shí)現(xiàn)虛擬機(jī)處理器時(shí),必須正確模擬中斷與異常的行為。
??????? 異常模擬及注入
??????? 虛擬機(jī)對(duì)異常的虛擬化需要安全遵照物理處理器對(duì)于各種異常條件的定義,根據(jù)虛擬處理器當(dāng)前的內(nèi)容,來(lái)判斷是否需要模擬一個(gè)虛擬異常,并注入到虛擬環(huán)境中。
??????? 虛擬機(jī)通常會(huì)在異常處理程序和指令模擬代碼中進(jìn)行異常虛擬化檢查。虛擬機(jī)需要區(qū)分兩種情況:
??????? 1、虛擬機(jī)異常。虛擬機(jī)自身對(duì)運(yùn)行環(huán)境和上下文的設(shè)置違背了指令正確執(zhí)行的條件。
??????? 2、客戶代碼異常。客戶代碼運(yùn)行在非最高特權(quán)級(jí),由于虛擬化原因觸發(fā)的異常。
??????? 第二種情況是由于陷入再模擬的虛擬化方式所造成的,并不是虛擬機(jī)本身的行為。
??????? 中斷模擬及注入
??????? 物理中斷的觸發(fā)來(lái)源于特定的物理中斷源,同樣,虛擬中斷的觸發(fā)來(lái)自于虛擬設(shè)備的模擬程序。當(dāng)設(shè)備模擬器發(fā)現(xiàn)虛擬設(shè)備狀態(tài)滿足中斷產(chǎn)生的條件,會(huì)將這個(gè)虛擬中斷通知給中斷控制器的模擬程序。虛擬機(jī)會(huì)在特定的時(shí)候檢測(cè)虛擬中斷控制器的狀態(tài),來(lái)決定是否模擬一個(gè)中斷的注入。
??????? 不管怎樣,當(dāng)虛擬機(jī)決定向虛擬機(jī)注入一個(gè)中斷或是異常時(shí),它還需要嚴(yán)格模擬物理處理器的行為來(lái)改變客戶指令流的路徑,而且還要包括一些必需的上下文保護(hù)與恢復(fù)。
??????? 中斷/異常的虛擬化由中斷/異常源定義,中斷/異常源與虛擬機(jī)處理器虛擬化模塊間的交互機(jī)制以及最終模擬注入的過(guò)程組成。
??????? (以前看Fiasco代碼時(shí),里面對(duì)中斷的模擬就有chip數(shù)據(jù)結(jié)構(gòu)。當(dāng)時(shí)對(duì)中斷虛擬化了解不多,對(duì)x86中斷過(guò)程了解不夠徹底,導(dǎo)致我總以為這部分代碼是多余的,哈哈)
三、對(duì)稱多處理器技術(shù)的模擬
??????? 虛擬機(jī)也可以為客戶操作系統(tǒng)提供多個(gè)虛擬處理器,也就是客戶對(duì)稱多處理器虛擬化技術(shù),客戶操作系統(tǒng)與虛擬機(jī)按照自己的邏輯管理虛擬處理器。
?????? 在客戶對(duì)稱多處理器引入后,虛擬機(jī)面臨著物理處理器以及虛擬處理器之間的同步問(wèn)題。(同步鎖問(wèn)題,而不是內(nèi)存的硬件同步,其實(shí)仔細(xì)想想,內(nèi)存的硬件同步問(wèn)題在這個(gè)環(huán)境中不存在)
??????? 1、對(duì)于發(fā)生在虛擬機(jī)上的同步問(wèn)題,由虛擬機(jī)負(fù)責(zé)協(xié)調(diào)物理處理器之間同步問(wèn)題。
??????? 2、對(duì)于發(fā)生在客戶操作系統(tǒng)上的同步問(wèn)題,虛擬機(jī)并不參與。只需要在客戶操作系統(tǒng)發(fā)起某些特權(quán)同步操作,如刷新頁(yè)表,清理cache時(shí),正確的模擬其效果即可。
??????? 3、對(duì)于虛擬機(jī)造成的虛擬處理器之間的同步問(wèn)題,仍需要虛擬機(jī)來(lái)負(fù)責(zé)。比如,當(dāng)N個(gè)虛擬處理器,運(yùn)行在M(N<M)個(gè)物理處理器上時(shí),虛擬機(jī)需要負(fù)責(zé)所有M個(gè)物理處理器上的狀態(tài)同步。(我理解的就是,虛擬處理器可能遷移到不同的物理處理器上,其cache不一樣可能導(dǎo)致遺留,復(fù)用垃圾)
??????? 客戶對(duì)稱多處理技術(shù)需要模擬一套初始化及通信機(jī)制,以便讓客戶操作系統(tǒng)能正確的識(shí)別并管理虛擬處理器。這套方式甚至可以自定義一套簡(jiǎn)單的協(xié)議,但必須修改客戶操作系統(tǒng)代碼以適應(yīng)。
總結(jié)
以上是生活随笔為你收集整理的第三章 虚拟化概述(处理器虚拟化)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: virtual多态 你不知道的事情
- 下一篇: Linux C 算法——排序