看操作系統虛擬化原理總結篇——軟件虛擬化中的IO虛擬化

1,首先明確,如果以純軟件的方式去模擬IO,那簡直是作死。因爲大部分都是用模擬的方式,這樣效率不會太高。


在模擬的時候,只需要正確模擬出目標設備的軟件接口就可以保證客戶機操作系統觀察到的虛擬設備和目標設備一致,而不需要考慮真實的硬件構造,另外也不需要了解運行的客戶機操作系統的技術細節。

這裏只模擬了目標設備軟件接口,那麼也要實現目標設備的功能,而這個也是通過軟件實現的,所以沒有要求和具體的硬件設備相關。這裏設備模型就是個中間層,一邊連着虛擬機設備驅動模塊,一邊連着物理機設備驅動,那麼如何捕獲IO操作呢?

由設備驅動調用發出的IO請求先通過設備模型轉化成物理IO設備的請求,再通過調用物理設備驅動完成相關的IO操作,反過來,設備驅動將IO操作結果通過設備模型驅動,返回給客戶機的虛擬設備驅動程序。


那我們先說設備模型的軟件接口,這個是給客戶機操作系統用的:

大致有很多種接口模型,但是我們用到的也只有幾種。

1,PCI 配置空間,一般是通過寄存器映射來完成的。

2,端口IO,操作系統通過特殊的指令去訪問這些IO,因爲是獨立址,所以不能像訪問內存那樣去訪問IO。

3,MMIO,這個是大塊,現在的IO設備幾乎都是以這種方式去,現在的操作系統幾乎都是通過類似訪問內存的方式去訪問設備寄存器。


下面我們談下如何陷入:

IO操作還好,因爲in,out,ins,outs這四條指令都是敏感指令,可以通過修補,動態翻譯或者直接陷入的方式去攔截並執行端口IO的處理函數。

那麼MMIO呢,網絡設備,顯卡等都是這個方式。因爲這裏操作MM並不是敏感指令,VMM可不一定會陷入,這樣就顯得有點麻煩。

爲了使MMIO能陷入,在初始化時VMM不會爲客戶機映射的MMIO所屬的物理地址範圍建立影子頁表,即運行時,客戶機的MMIO訪問都會造成缺頁異常,VMM會對此進行攔截。所以說,MMIO映射的方式,本質上還是內存虛擬化中影子頁表的方式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章