虛擬化的記憶體和中斷

2021-08-25 16:01:42 字數 1046 閱讀 5168

我個人以為,在一台物理機器上執行虛擬機器,並且虛擬機器還和物理機器公用一套硬體,最複雜的東西只有兩個,那就是記憶體管理和中斷管理,對於記憶體管理,影子葉表已經解決了絕大多數的問題,對於中斷問題,還有很多的不同的解決方案有待選擇。

以x86系列處理器為例,當中斷發生的時候,總是會有intr訊號傳送到cpu的,如果此時正在執行的是guest os的話既然guest os執行在ring1,那麼很顯然vmm會捕獲到這個訊號,那麼既然vmm捕獲到了這個訊號,那麼它肯定有辦法將此訊號轉交於host os的中斷處理程式,至於怎麼**,我想這不是問題,因為每乙個設計者都會很好的處理這個問題的,有時間的話看看《設計原本》這本書吧!具體的技術細我我們不需要關注,最重要的是我們必須有一種我們自己的風格,這就是設計!,ring0可以捕獲到ring1的操作,那麼ring0就可以模擬ring1的任何操作。

下面是自我構思的乙個vmm處理硬體中斷的過程。設起初,機器在guest os中的使用者態執行,突然間來了中斷:

1.機器進入ring0,由於涉及了ring的切換,ss,esp,cs,eip均進行了切換,從guest os切換到了vmm

2.由於vmm映**自己的idt,跳轉到了vmm的中斷處理程式

3.在vmm的中斷處理程式中,將中斷號記錄在了vmm和host os共享的cross page中。

4.在host os的idt中查詢中斷向量n對應的處理位址,並且設定host os的cs,eip為此處理程式,並且將原始的host os儲存的上下文(cs,eip,ss,esp)壓入儲存的host os的核心堆疊

5.切換回host os,自然跳入host os的中斷處理程式

6.中斷處理完畢,iret返回之前,決策排程,如需排程,則下列序列執行延遲,再次排程於此時執行,若否,則繼續

7.iret返回,由於第四步壓入堆疊的上下文,返回host os繼續執行,vmx86run返回到host os vmware-vmx的使用者空間,以後進入傳統的軌道。

8.如再次切換到guest os,那麼從2,3處的guest os上下文開始執行

由此可見,中斷執行涉及的上下文切換異常消耗巨大,然而,如果不理清這個處理過程,再高效的事情又從何談起呢?

虛擬化的記憶體和中斷

我個人以為,在一台物理機器上執行虛擬機器,並且虛擬機器還和物理機器公用一套硬體,最複雜的東西只有兩個,那就是記憶體管理和中斷管理,對於記憶體管理,影子葉表已經解決了絕大多數的問題,對於中斷問題,還有很多的不同的解決方案有待選擇。以x86系列處理器為例,當中斷發生的時候,總是會有intr訊號傳送到cp...

kvm中斷虛擬化

1 x86平台主要使用的中斷型別有pic apic及msi中斷,在多核系統下的apic結構圖如下所示,每個cpu有乙個lapic,外部中斷通過ioapic 到lapic,如果是msi中斷,則繞過了io apic直接發給lapic。2 kvm初始化過程為每個虛擬機器維護乙個pic主控制器 乙個pic備...

KVM 記憶體虛擬化

除了 cpu 虛擬化,另乙個關鍵是記憶體虛擬化,通過記憶體虛擬化共享物理系統記憶體,動態分配給虛擬機器。虛擬機器的記憶體虛擬化很象現在的作業系統支援的虛擬記憶體方式,應用程式看到鄰近的記憶體位址空間,這個位址空間無需和下面的物理機器記憶體直接對應,作業系統保持著虛擬頁到物理頁的對映。現在所有的 x8...