1. 程式人生 > 其它 >virtio介紹

virtio介紹

virtio 是一種 I/O 半虛擬化解決方案,是一套通用 I/O 裝置虛擬化的程式,是對半虛擬化 Hypervisor 中的一組通用 I/O 裝置的抽象。提供了一套上層應用與各 Hypervisor 虛擬化裝置(KVM,Xen,VMware等)之間的通訊框架和程式設計介面,減少跨平臺所帶來的相容性問題,大大提高驅動程式開發效率。

為什麼是 virtio

在完全虛擬化的解決方案中,guest VM 要使用底層 host 資源,需要 Hypervisor 來截獲所有的請求指令,然後模擬出這些指令的行為,這樣勢必會帶來很多效能上的開銷。半虛擬化通過底層硬體輔助的方式,將部分沒必要虛擬化的指令通過硬體來完成,Hypervisor 只負責完成部分指令的虛擬化,要做到這點,需要 guest 來配合,guest 完成不同裝置的前端驅動程式,Hypervisor 配合 guest 完成相應的後端驅動程式,這樣兩者之間通過某種互動機制就可以實現高效的虛擬化過程。

由於不同 guest 前端裝置其工作邏輯大同小異(如塊裝置、網路裝置、PCI裝置、balloon驅動等),單獨為每個裝置定義一套介面實屬沒有必要,而且還要考慮擴平臺的相容性問題,另外,不同後端 Hypervisor 的實現方式也大同小異(如KVM、Xen等),這個時候,就需要一套通用框架和標準介面(協議)來完成兩者之間的互動過程,virtio 就是這樣一套標準,它極大地解決了這些不通用的問題。

virtio 的架構
從總體上看,virtio 可以分為四層,包括前端 guest 中各種驅動程式模組,後端 Hypervisor (實現在Qemu上)上的處理程式模組,中間用於前後端通訊的 virtio 層和 virtio-ring 層,virtio 這一層實現的是虛擬佇列介面,算是前後端通訊的橋樑,而 virtio-ring 則是該橋樑的具體實現,它實現了兩個環形緩衝區,分別用於儲存前端驅動程式和後端處理程式執行的資訊。

嚴格來說,virtio 和 virtio-ring 可以看做是一層,virtio-ring 實現了 virtio 的具體通訊機制和資料流程。或者這麼理解可能更好,virtio 層屬於控制層,負責前後端之間的通知機制(kick,notify)和控制流程,而 virtio-vring 則負責具體資料流轉發。

virtio 資料流互動機制

vring 主要通過兩個環形緩衝區來完成資料流的轉發,如下圖所示。

vring 包含三個部分,描述符陣列 desc,可用的 available ring 和使用過的 used ring。

desc 用於儲存一些關聯的描述符,每個描述符記錄一個對 buffer 的描述,available ring 則用於 guest 端表示當前有哪些描述符是可用的,而 used ring 則表示 host 端哪些描述符已經被使用。

Virtio 使用 virtqueue 來實現 I/O 機制,每個 virtqueue 就是一個承載大量資料的佇列,具體使用多少個佇列取決於需求,例如,virtio 網路驅動程式(virtio-net)使用兩個佇列(一個用於接受,另一個用於傳送),而 virtio 塊驅動程式(virtio-blk)僅使用一個佇列。

具體的,假設 guest 要向 host 傳送資料,首先,guest 通過函式 virtqueue_add_buf 將存有資料的 buffer 新增到 virtqueue 中,然後呼叫 virtqueue_kick 函式,virtqueue_kick 呼叫 virtqueue_notify 函式,通過寫入暫存器的方式來通知到 host。host 呼叫 virtqueue_get_buf 來獲取 virtqueue 中收到的資料。

存放資料的 buffer 是一種分散-聚集的陣列,由 desc 結構來承載,如下是一種常用的 desc 的結構

當 guest 向 virtqueue 中寫資料時,實際上是向 desc 結構指向的 buffer 中填充資料,完了會更新 available ring,然後再通知 host。

當 host 收到接收資料的通知時,首先從 desc 指向的 buffer 中找到 available ring 中新增的 buffer,對映記憶體,同時更新 used ring,並通知 guest 接收資料完畢。

總結:

virtio 是 guest 與 host 之間通訊的潤滑劑,提供了一套通用框架和標準介面或協議來完成兩者之間的互動過程,極大地解決了各種驅動程式和不同虛擬化解決方案之間的適配問題。

virtio 抽象了一套 vring 介面來完成 guest 和 host 之間的資料收發過程,結構新穎,介面清晰。