本文話題:
IO虛擬化概述
設備發現 訪問截獲 設備模擬 設備共享
基於軟件的IO虛擬化
基於前端后端的IO虛擬化
基於硬件的IO虛擬化
概述
從處理器的角度看,外設是通過一組I/O資源(端口I/O或者是MMIO)來進行訪問的,所以設備的相關虛擬化被稱為I/O虛擬化。其思想就是 VMM截獲客戶操作系統對設備的訪問請求,然后通過軟件的方式來模擬真實設備的效果。基於設備類型的多樣化,I/O虛擬化的方式和特點紛繁復雜。
一個完整的系統虛擬化方案在I/O虛擬化方面需要處理以下幾塊
虛擬芯片組
虛擬PCI總線布局,主要是通過虛擬化PCI配置空間,為客戶機操作系統呈現虛擬的或是直接分配使用的設備。
虛擬系統設備,例如PIC、IO-APIC、PIT和RTC等。
虛擬基本的輸入輸出設備,例如顯卡、網卡和硬盤等。
I/O虛擬化主要包含以下幾個方面的虛擬化
I/O端口寄存器
MMIO寄存器
中斷
IO虛擬化
下面具體的描述IO虛擬化需要做的工作
設備發現
設備發現就是要讓VMM提供一種方式,來讓客戶機操作系統發現虛擬設備,這樣客戶機操作系統才能加載相關的驅動程序,這是IO虛擬化的第一步。設備發現取決於被虛擬的設備類型。
模擬一個所處物理總線的設備,這其中包含如下兩種類型。
1)模擬一個所處總線類型是不可枚舉的物理設備,而且該設備本身所屬的資源是硬編碼固定下來的。比如ISA設備、PS/2鍵盤、鼠標、RTC及傳統 IDE控制器。對於這類設備,驅動程序會通過設備特定的方式來檢測設備是否存在,例如讀取特定端口的狀態信息。對於這類設備的發現,VMM在給定端口進行 正確的模擬就可以了,即截獲客戶機對該端口的訪問,模擬出結果交給客戶機。
2)模擬一個所處總線類型是可枚舉的物理設備,而且相關設備資源是軟件可配置的,比如PCI設備。由於PCI總線是通過PCI配置空間定義一套完備 的設備發現方式,並且運行系統軟件通過PCI配置空間的一些字段對給定PCI設備進行資源的配置,例如允許或禁止I/O端口和MMIO,設置I/O和 MMIO的起始地址等。所以VMM僅模擬自身的邏輯是不夠的,必須進一步模擬PCI總線的行為,包括拓撲關系和設備特定的配置空間內容,以便讓客戶機操作 系統發現這類虛擬設備。
模擬一個完全虛擬的設備
這種情況下,沒有一個現實中的規范與之對應,這種虛擬設備所處的總線類型完全由VMM自行決定,VMM可以選擇將虛擬設備掛在PCI總線上,也可以完全自定義一套新的虛擬總線協議,這樣的話客戶機操作系統必須加裝新的總線驅動。
訪問截獲
虛擬設備被客戶機操作系統發現后,客戶機操作系統中的驅動會按照接口定義訪問這個虛擬設備。此時VMM必須截獲驅動對虛擬設備的訪問,並進行模擬。
非直接分配給客戶機操作系統的設備
對於端口I/O,IO指令本身是特權指令,處於低特權的客戶機訪問端口I/O會拋出異常,從而陷入到VMM中,交給設備模擬器進行模擬。
對於MMIO,VMM把映射到該MMIO的頁表設為無效,客戶機訪問MMIO時會拋出缺頁異常,從而陷入到VMM中,交給設備模擬器進行模擬。
對於中斷,VMM需要提供一種機制,供設備模擬器在 接收到物理中斷並需要觸發中斷時,可以通知到虛擬中斷邏輯,然后由虛擬中斷邏輯模擬一個虛擬中斷的注入。
直接分配給客戶機操作系統的設備
對於端口I/O,可以直接讓客戶機訪問。
對於MMIO,也可以直接讓客戶機進行映射訪問。
對於中斷,VMM物理中斷處理函數接收到物理中斷后,辨認出中斷源屬於哪個客戶機,直接通知該客戶機的虛擬中斷邏輯。
設備模擬
上一步中我們已經多次提到,下面分類介紹下設備模擬。
基於軟件的全虛擬化
虛擬設備與現實設備具有完全一樣的接口定義。這種情況下,VMM的設備模擬器需要仔細研究現實設備的接口定義和內部設計規范,然后以軟件的方式模擬 真實邏輯電路來滿足每個接口的定義和效果。現實設備具有哪些資源,設備模擬器就需要呈現出同樣的資源。這種情況下,客戶機操作系統原有的驅動程序無需修改 就能驅動虛擬設備。設備訪問過程中,VMM通過截獲驅動程序對設備的訪問進行模擬。
舉例:qemu VMware Workstation
半虛擬化
給客戶機操作系統提供一個特定的驅動程序(稱為前端),VMM中的模擬程序稱為后端,前端將請求通過VMM提供的通信機制直接發送給后端,后端處理 完請求后再發回通知給前者。與傳統設備驅動程序流程(前一種方式)比較,傳統設備程序為了完成一次操作要涉及到多個寄存器的操作,使得VMM要截獲每個寄 存器訪問並進行相應的模擬,就會導致多次上下文切換。這種方式能很大程度的減少上下文切換的頻率,提供更大的優化空間。
舉例:xen virtio (virtio接下來我會繼續研究,主要包括virtio框架、virtio前端驅動、后端實現方式及原理、前端后端共享內存的方式)
基於硬件的直接分配(實際上已經不是設備模擬了)
直接將物理設備分配給客戶機操作系統,由客戶機操作系統直接訪問目標設備。這種情況下實際上不存在設備模擬,客戶機直接通過原有的驅動操作真實硬件。這種方式從性能上說是最優的,但這種方式需要比較多的硬件資源。
基於硬件的直接分配還有一種方式,硬件本身支持虛擬化,本身可以向不同的虛擬機提供獨立的硬件支持,設備本身支持多個虛擬機同時訪問。比如SR-IOV。(這種方式接下來我會繼續研究)
舉例:intel vt-d SR-IOV
一個VMM中,常常是多種虛擬化方式並存。
不同的IO虛擬化方式對比
設備共享
設備虛擬化中,有些設備可以被軟件模擬器完全用軟件的方式模擬而不用接觸實際物理設備,比如CMOS,而有些設備需要設備模擬進一步請求物理硬件的幫助。一般輸入輸出類設備,如鼠標、鍵盤、顯卡、硬盤、網卡。這些設備都涉及到從真實設備上獲取輸入或者輸出到真實設備上。
對於多個客戶機,每個客戶機擁有自己的設備模擬器,多個設備模擬器需要共享同一個物理設備,這種情況下,VMM中的真實設備的驅動程序需要同時接收並處理多個客戶或進程的請求,達到物理資源的復用。
點擊下面的鏈接可以進入我自己搭建的博客,查看更多關於虛擬化的文章。
原文鏈接:http://itblogs.ga/blog/20150111003133/ 轉載請注明出處