1. 程式人生 > >kvm虛擬化之IO虛擬化

kvm虛擬化之IO虛擬化

(文章來自作者維護的社群微信公眾號【虛擬化雲端計算】)
    QEMU-KVM作為一個VMM提供了全虛擬化環境,guest不經過任何修改就能執行在KVM環境中。不過KVM在IO虛擬化方面,使用QEMU純軟體的方式來模擬IO裝置,效率並不高。在KVM中,要想提高IO虛擬化的效率,就要使用半虛擬化的方式:virtio。簡單介紹全虛擬化和半虛擬化    在全虛擬化 中,guest作業系統執行在VMM之上,並不知道它已被虛擬化,不需要任何更改就可以工作。相反,在半虛擬化中,guest作業系統不僅知道它執行在 VMM上,還需要做修改來對接VMM的程式碼。    在全虛擬化中,VMM必須模擬裝置硬體,儘管這種模擬很徹底很乾淨,但它效率低程式碼最複雜。在半虛擬化模式中,guest和 VMM共同合作,模擬更加高效。
IO全虛擬化使用QEMU軟體模擬    1.當虛擬機器進行I/O操作時,根據《也談Intel的cpu虛擬化》我們知道,虛擬機器通過VM exit將cpu控制權返回給VMM,從而陷入到root模式下的ring0內的VMM,進行”陷入模擬“。    2.將本次I/O請求的資訊存放到IO共享頁,QEMU從IO共享頁讀取資訊後由硬體模擬程式碼來模擬出本次的IO操作,並呼叫核心中的硬體驅動把IO請求傳送到物理硬體,完成之後將結果放回到IO共享頁。    3.KVM模組中的捕獲程式碼讀取IO共享頁中的結果,把結果返回到guest。    4.通過VM entry,guest再次獲得cpu控制權,根據IO返回的結果進行處理。
說明:VMM和guest的IO資訊共享不光IO共享頁一種,還可以使用DMA。QEMU不把IO結果放到IO共享頁中,而是通過DMA將結果直接寫到guest的記憶體中去,然後通過KVM模組告訴客戶機DMA操作已經完成。下面這張圖(來自網路Eric部落格)是軟體模擬IO的流程圖:IO半虛擬化virtio    guest和host使用使用virtio前後端的技術減少了guest IO時的VM Exit(guest和host的上下文切換)並且使guest和host能並行處理IO來提高throughput和減少latency。但是IO的路徑並沒有比全虛擬化技術減少。下面是virtio的IO路徑:    guest在IO請求時,首先guest需要切換到host kernel,然後host kernel會切換到hyperisor來處理guest的請求,hypervisor通過系統呼叫將資料包傳送到外部網路後切換回host kernel,然後再切換回guest。這個長IO路徑和全虛擬化時相同的,只是減少了VM exit和VM entry。
vhost    為了解決virio的IO路徑太長的問題,vhost產生了。它是位於host kernel的一個模組,用於和guest直接通訊,所以資料交換就在guest和host kernel間進行,減少了上下文的切換。vhost相對與virto架構,把virtio驅動後端驅動從使用者態放到了核心態中(vhost的核心模組充當virtiO後端驅動下面這張圖(來自redhat)描述了在virtio和vhost(vhost-net時vhost架構中的網絡卡實現)架構下核心的不同工作流程:下面這張圖(來自intel)介紹了vhost工作原理:vhost-user    vhost-user和vhost類似,只是使用一個使用者態程序vhost-user代替了核心中的vhost模組。vhost-user程序和Guset之間時通過共享記憶體的方式進行資料操作。vhost-user相對與vhost架構,把virtio驅動後端驅動從核心態又放回到了使用者態中(vhost-user程序充當virtiO後端驅動)。下面這張圖(來自intel)介紹了vhost-user的工作原理:總結    io虛擬化經歷了從全虛擬化io到半虛擬化virtio。半虛擬化的後端驅動又經歷了從VMM中到核心中,從核心中到使用者空間中的過程。============================================================關注微信公眾號【虛擬化雲端計算】,閱讀更多虛擬化雲端計算知識,純技術乾貨更新不停。