日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机io工作方式,QEMU/KVM和VirtIO工作模式

發布時間:2024/10/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机io工作方式,QEMU/KVM和VirtIO工作模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://blog.csdn.net/shengxia1999/article/details/52244119

KVM:Kernel-Based Virtual Machine 基于內核的虛擬機,是Linux內核的一個可加載模塊,通過調用Linux本身內核功能,實現對CPU的底層虛擬化和內存的虛擬化,使Linux內核成為虛擬化層,需要x86架構的,支持虛擬化功能的硬件支持(比如Intel VT,AMD-V),是一種全虛擬化架構。KVM在2007年年2月被導入Linux 2.6.20內核中。從存在形式來看,它包括兩個內核模塊:kvm.ko ?和? kvm_intel.ko(或kvm_amd.ko),本質上,KVM是管理虛擬硬件設備的驅動,該驅動使用字符設備/dev/kvm(由KVM本身創建)作為管理接口,主要負責vCPU的創建,虛擬內存的分配,vCPU寄存器的讀寫以及vCPU的運行。

QEMU:是一套由Fabrice Bellard編寫的模擬處理器的自由軟件,它是一個完整的可以單獨運行的軟件,可以獨立模擬出整臺計算機,包括CPU,內存,IO設備,通過一個特殊的“重編譯器”對特定的處理器的二進制代碼進行翻譯,從而具有了跨平臺的通用性。QEMU有兩種工作模式:系統模式,可以模擬出整個電腦系統,另一種是用戶模式,可以運行不同與當前硬件平臺的其他平臺上的程序(比如在x86平臺上運行跑在ARM平臺上的程序)

在QEMU-KVM中,KVM運行在內核空間,QEMU運行在用戶空間,實際模擬創建,管理各種虛擬硬件,QEMU將KVM整合了進來,通過/ioctl 調用 /dev/kvm,從而將CPU指令的部分交給內核模塊來做,KVM實現了CPU和內存的虛擬化,但kvm不能虛擬其他硬件設備,因此qemu還有模擬IO設備(磁盤,網卡,顯卡等)的作用,KVM加上QEMU后就是完整意義上的服務器虛擬化。

當然,由于qemu模擬io設備效率不高的原因,現在常常采用半虛擬化的virtio方式來虛擬IO設備。

綜上所述,QEMU-KVM具有兩大作用:

1.提供對cpu,內存(KVM負責),IO設備(QEMU負責)的虛擬

2.對各種虛擬設備的創建,調用進行管理(QEMU負責)

libvirt

順帶提一提libvirt,這是RedHat開始支持KVM后,大概是覺得QEMU+KVM方案中的用戶空間虛擬機管理工具不太好用或者通用性不強,所以干脆搞了個libvirt出來,一個針對各種虛擬化平臺的虛擬機管理的API庫,一些常用的虛擬機管理工具如virsh(類似vim編輯器),virt-install,virt-manager等和云計算框架平臺(如OpenStack,OpenNebula,Eucalyptus等)都在底層使用libvirt提供的應用程序接口。

libvirt主要由三個部分組成:API庫,一個守護進程 libvirtd 和一個默認命令行管理工具 virsh。

總結:

目前來說,QEMU是一個獨立的虛擬化解決方案,并不依賴KVM(它本身自己可以做CPU和內存的模擬,只不過效率較低),而KVM是另一套虛擬化解決方案,對CPU進行虛擬效率較高(采用了硬件輔助虛擬化),但本身不提供其他設備的虛擬化,借用了QEMU的代碼進行了定制,所以KVM方案一定要依賴QEMU。

即使后來RedHat后來開發了libvirt,也只能簡單的認為是個虛擬機管理工具,仍然需要通過用戶空間QEMU來與KVM進行交互。

http://lihanlu.cn/virtio-introduction/

實現IO虛擬化主要有三種方式:全虛擬化、半虛擬化和透傳。全虛擬化Guest OS不會感知到自己是虛擬機,也無需修改Guest OS,但是它的效率比較低。半虛擬化Guest OS知道自己是虛擬機,通過Frontend/Backend驅動模擬實現IO虛擬化。透傳就是直接分配物理設備給VM用。Virtio是一種半虛擬化的設備抽象接口規范,在Qemu和KVM中得到了廣泛使用,本文將簡單介紹Virtio的基本原理。

Virtio SPEC

* Virtual I/O Device (VIRTIO) Version 1.0

* http://docs.oasis-open.org/virtio/virtio/v1.0/cs04/virtio-v1.0-cs04.html

* Virtio PCI Card Specification Version 0.9.5

* http://ozlabs.org/~rusty/virtio-spec/virtio-0.9.5.pdf

每個Virtio設備包括以下部分

* Device status field  設備狀態字段

* Feature bits  特征位

* Device Configuration space  設備配置空間

* One or more virtqueues  一個或多個virtqueues

每個virtqueue由三部分組成:

* Descriptor Table

* Available Ring

* Used Ring

如圖所示,virtnet_info作為virtio網絡設備的私有數據將virtio_device和net_device鏈接在一起。對于virtio網絡設備來說,它至少有兩個virtqueue(如果協商了VIRTIO_NET_F_MQ則可以創建多個隊列,詳見VirtIO SPEC中5.1.2 ),一個用于TX(send_queue),另一個用于RX(receive_queue),TX和RX隊列中都包含了virtqueue和scatterlist[]。virtio_device、virtnet_info、receive_queue、send_queue、virtqueue給定任一結構體均可得到其它結構體信息。

可以把virtqueue理解為一個接口類,而vring_virtqueue作為這個接口的一個實現,vring_virtqueue通過成員vq可以與上述其它struct建立聯系。virtio的環形緩沖區機制是由vring來承載的,vring由三部分組成:Descriptor表(vring_desc),Available ring(vring_avail)和Used ring(vring_used)。

https://www.jianshu.com/p/9be4969e0bb1

virtio作為一種設備,同樣也處在Linux kernel對設備模型的管理之下,virtio使用了virtio pcibus類型的虛擬總線,當命令行傳入virtio時,Qemu會根據注冊的virtio_net_pci_info進行virtio net設備的初始化,并在Qemu自身模擬的pci bus層加入了virtio net設備的初始化信息。

當Qemu加載Guest OS后,Guest OS的Bios和Kernel的啟動過程中會對Pci設備進行枚舉和資源的分配。

當總線類型注冊后,/sys/bus/目錄下,創建了一個新的目錄virtio,在該目錄下同時創建了兩個文件夾為devices和drivers。表示創建virtio總線,總線支持設備與驅動devices和drivers目錄。

總結

以上是生活随笔為你收集整理的计算机io工作方式,QEMU/KVM和VirtIO工作模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。