天天看點

虛拟化的記憶體和中斷

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

     以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上下文開始執行

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

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1271122

繼續閱讀