本文首發於我的公眾號 Linux雲計算網路(id: cloud_dev),號內有 10T 書籍和視頻資源,後臺回復「1024」即可領取,歡迎大家關注,第一時間掌握技術乾貨!
I/O 虛擬化在虛擬化技術中算是比較複雜,也是最重要的一部分。從整體上看,I/O 虛擬化也包括基於軟體的虛擬化和硬體輔助的虛擬化,軟體虛擬化部分又可以分為全虛擬化和半虛擬化,如果根據設備類型再細分的話,又可以分為字元設備 I/O 虛擬化(鍵盤、滑鼠、顯示器)、塊設備 I/O 虛擬化(磁碟、光碟)和網路設備 I/O 虛擬化(網卡)等。
我們先看下在沒有虛擬機存在的情況下,I/O 設備請求是怎樣的。某個應用或進程發出 I/O 請求,通過系統調用等方式進入內核,調用相應的驅動程序,請求到具體的 I/O 設備,然後再將結果返回到調用者進行回顯。
那麼存在虛擬機的情況下,又是怎樣的呢。按理說,虛擬機是宿主機上的一個進程,應該可以以類似的 I/O 請求方式訪問到宿主機上的 I/O 設備,但別忘了,虛擬機處在非 Root 的虛擬化模式下,請求無法直接下發到宿主機,必須藉助於 VMM 來截獲並模擬虛擬機的 I/O 請求,至於怎麼截獲並模擬,每一種 VMM 的實現方案都不一樣,像 qemu-kvm ,截獲操作是由內核態的 kvm 來完成,模擬操作是由用戶態的 qemu 來完成的,這也是 kvm 不同於其他 VMM 實現方案的地方。kvm 這樣做也是為了提升性能和保持內核的純凈性,關於這塊的知識不清楚的可以查閱前文。
從層次上看,虛擬機發出 I/O 請求到完成相應的 I/O 操作,中間要經過虛擬機的設備驅動,到 VMM 的設備模型,再到宿主機的設備驅動,最終纔到真正的 I/O 設備。
那什麼是設備模型,設備模型就是 VMM 中進行設備模擬,並處理所有設備請求和響應的邏輯模塊,對於 qemu-kvm,qemu 其實就可以看做是一個設備模型。