1. 概述
在傳統的設備模擬中,虛擬機內部設備驅動完全不知道自己處在虛擬化環境中,所以I/O操作會完整的走 虛擬機內核棧->QEMU->宿主機內核棧,產生很多VM Exit和VM Entry,導致性能很差。Virtio方案旨在提高I/O性能。在改方案中虛擬機能夠感知到自己處於虛擬化環境中,並且會加載相應的virtio總線驅動和virtio設備驅動,執行自己定義的 協議進行數據傳輸,減少VM Exit和VM Entry操作。2. 架構
VirtIO由 Rusty Russell 開發,對准虛擬化 hypervisor 中的一組通用模擬設備IO的抽象。Virtio是一種前后端架構,包括前端驅動(Guest內部)、后端設備(QEMU設備)、傳輸協議(vring)。框架如下圖所示:前端驅動:
虛擬機內部的 virtio模擬設備對應的驅動。作用為 接收用戶態的請求,然后按照傳輸協議對請求進行封裝,再寫I/O操作,發送通知到QEMU后端設備。
后端設備:
在QEMU中創建,用來接收前端驅動發送的I/O請求,然后按照傳輸協議進行解析,在對物理設備進行操作,之后通過終端機制通知前端設備。
傳輸協議:
使用virtio隊列(virtio queue,virtqueue)完成。設備有若干個隊列,每個隊列處理不同的數據傳輸(如virtio-balloon包含ivq、dvq、svq三個)。
virtqueue通過vring實現。Vring是虛擬機和QEMU之間共享的一段環形緩沖區,QEMU和前端設備都可以從vring中讀取數據和放入數據。



3. 原理