qemuVirtio設(shè)備該如何創(chuàng)建

本篇文章為大家展示了qemu Virtio設(shè)備該如何創(chuàng)建,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站建設(shè)、網(wǎng)站制作與策劃設(shè)計(jì),勉縣網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:勉縣等地區(qū)。勉縣做網(wǎng)站價(jià)格咨詢:028-86922220

一、什么是Virtio?

qemu設(shè)備虛擬機(jī)化的roadmap可以概括為全虛擬化 -> 半虛擬化 (又可以分為用戶空間和內(nèi)核空間) -> 設(shè)備穿透 (又可以分為完整設(shè)備穿透和單根虛擬化)。所有的這些演進(jìn)都是為了提升虛擬設(shè)備的性能。

Virtio則是屬于一種半虛擬化解決方案,它是一種前后端架構(gòu),虛擬機(jī)內(nèi)部需要安裝特定的virtio設(shè)備驅(qū)動(dòng)作為前端,模擬的設(shè)備作為后端,后端可以放在用戶空間模擬,也可以放在內(nèi)核空間模擬。放在內(nèi)核空間模擬就是vhost的實(shí)現(xiàn),如DPDK,SPDK等。

Virtio代理的好處就是特定的設(shè)備驅(qū)動(dòng)前后端通過virtqueue進(jìn)行通信,virtqueue就是一塊前后端共享的memory。從而前后端之間的通信通過對共享memory的讀寫就可以了,相比較全虛擬機(jī)化,每次的讀寫虛擬設(shè)備都需要做vm exit和vm entry,通信的代價(jià)變小了。

Virtio帶來的不便就是需要開發(fā)特定的virtio設(shè)備驅(qū)動(dòng),虛擬機(jī)需要安裝設(shè)備驅(qū)動(dòng)。

二、Virtio balloon設(shè)備創(chuàng)建流程

這里分析了virtio balloon設(shè)備的創(chuàng)建流程,從qemu指定參數(shù)-device xxx設(shè)備開始到設(shè)備最終的實(shí)例化過程。

qemu中設(shè)備對象的實(shí)現(xiàn)采用了QOM模型,模擬了面向?qū)ο笳Z言中的封裝、繼承和多態(tài)。遵循該框架可以很方便的開發(fā)新的設(shè)備。下圖展示了類之間的繼承關(guān)系。這里比較特別的一點(diǎn)是每一個(gè)virtio設(shè)備都會(huì)有一個(gè)伴生的PCI設(shè)備,叫做virtio PCI代理設(shè)備。該設(shè)備主要的作用是實(shí)現(xiàn)設(shè)備總線相關(guān)的功能,而設(shè)備類只需要關(guān)注設(shè)備具體功能的實(shí)現(xiàn)。

qemu Virtio設(shè)備該如何創(chuàng)建

virtio balloon設(shè)備的創(chuàng)建過程如下:

1. 在main函數(shù)中會(huì)遍歷指定的-device參數(shù),然后調(diào)用device_init_func來做設(shè)備的初始化。

2. 會(huì)依次調(diào)用device_init_func-> qdev_device_add -> object_new -> object_initialize_with_type。主要的初始化工作都是在object_initialize_with_type中完成的。

3. 首先會(huì)調(diào)用type_initialize完成類的初始化。在類的初始化中會(huì)設(shè)置類的realize回調(diào)函數(shù)為virtio_balloon_pci_realize。該函數(shù)在做類對象的實(shí)例化的時(shí)候會(huì)調(diào)用。

4. 之后會(huì)調(diào)用object_init_with_type做類對象的初始化。會(huì)遞歸從父對象開始執(zhí)行instance_init。TYPE_DEVICE的instance_init函數(shù)為device_initfn。該函數(shù)調(diào)用執(zhí)行了object_property_add_bool增加了三個(gè)屬性。其中realized屬性是當(dāng)設(shè)置了對象真正創(chuàng)建的時(shí)候調(diào)用的。其set回調(diào)函數(shù)設(shè)置為device_set_realized。任何一個(gè)設(shè)備創(chuàng)建的時(shí)候都會(huì)調(diào)用該函數(shù)。

qemu Virtio設(shè)備該如何創(chuàng)建

5. 設(shè)備類和對象實(shí)例初始化完成后會(huì)回到qdev_device_add函數(shù),接下來就會(huì)進(jìn)行具體的設(shè)備實(shí)現(xiàn)過程。

6. 調(diào)用object_property_set_bool將realized屬性設(shè)置為true,從而會(huì)調(diào)用剛才設(shè)置的回調(diào)函數(shù)device_set_realized。

7. 會(huì)首先調(diào)用DeviceClass的realize函數(shù)即virtio_pci_dc_realize。該函數(shù)是在virtio_pci_class_init中設(shè)置的。

qemu Virtio設(shè)備該如何創(chuàng)建

8. 父類的realize函數(shù)會(huì)一次調(diào)用子類的realize函數(shù)。接著會(huì)調(diào)用PCIDeviceClass的realize函數(shù)即pci_qdev_realize。

9. 然后依次調(diào)用VirtioPCIClass、VirtioBalloonPCIClass的realize函數(shù)。從而實(shí)現(xiàn)了VirtioBalloonPCI設(shè)備的創(chuàng)建。最后還需要?jiǎng)?chuàng)建VirtioBalloon設(shè)備,將其掛載到PCI總線上。

10. 即依次調(diào)用VirtioDeviceClass、VirtioBalloonDeviceClass的realize函數(shù)。VirtioBalloon設(shè)備的具體實(shí)現(xiàn)就是在函數(shù)virtio_balloon_device_realize中。

整個(gè)流程如下圖所示,類之間的調(diào)用流則如類繼承關(guān)系圖中紅線所示。

qemu Virtio設(shè)備該如何創(chuàng)建

在virtio_balloon_device_realize中,調(diào)用virtio_add_queue為設(shè)備添加了三個(gè)virtqueue。其中兩個(gè)的回調(diào)處理函數(shù)為virtio_ballon_handle_output,另一個(gè)是virtio_balloon_receive_stats。從而構(gòu)建了從設(shè)備的輸入輸出通道,以及當(dāng)收到輸入輸出信息時(shí)調(diào)用的回調(diào)處理函數(shù)。

qemu Virtio設(shè)備該如何創(chuàng)建

至此設(shè)備創(chuàng)建完成,但是還差最后一步將設(shè)備掛載到virtio總線上去。該步驟是在函數(shù)virtio_device_realize中實(shí)現(xiàn)的。該函數(shù)調(diào)用vdc->realize創(chuàng)建了具體設(shè)備后,會(huì)調(diào)用virtio_bus_device_plugged,該函數(shù)的作用就是將virtio設(shè)備插入到virtio總線。

上述內(nèi)容就是qemu Virtio設(shè)備該如何創(chuàng)建,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前文章:qemuVirtio設(shè)備該如何創(chuàng)建
當(dāng)前URL:http://muchs.cn/article32/iepdpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、App設(shè)計(jì)關(guān)鍵詞優(yōu)化、外貿(mào)建站、網(wǎng)站營銷、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作