本篇文章為大家展示了如何進(jìn)行virtio的分析,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站10多年經(jīng)驗(yàn)成就非凡,專(zhuān)業(yè)從事網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)頁(yè)制作,軟文營(yíng)銷(xiāo),一元廣告等。10多年來(lái)已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:18980820575,我們期待您的來(lái)電!
virtio
virtio是一個(gè)通用的io虛擬化框架,hypervisor通過(guò)他模擬出一系列的虛擬化設(shè)備,并使得這些設(shè)備在虛擬機(jī)內(nèi)部通過(guò)api調(diào)用的方式變得可用。它為客戶機(jī)提供了一個(gè)高效訪問(wèn)塊設(shè)備的方法。它包含4個(gè)部分:前端驅(qū)動(dòng)、后端驅(qū)動(dòng)、vring及通信間統(tǒng)一的接口。與其他的模擬io方式對(duì)比,virtio減少了虛擬機(jī)的退出和數(shù)據(jù)拷貝,能夠極大地提高IO性能。計(jì)算機(jī)中存在不同的總線標(biāo)準(zhǔn),而virtio采用的是pci總線(當(dāng)然也可以用其他總線來(lái)實(shí)現(xiàn))。每一個(gè)virtio設(shè)備就是一個(gè)pci設(shè)備。
virtio-blk的后端初始化
virtio-blk代碼包保存在hw/virtio-pci.c和hw/virtio-blk.c中,通過(guò)如下函數(shù)對(duì)virtio_blk進(jìn)行初始化。主要的初始化函數(shù)是virtio_blk_init_pci。這里定義了設(shè)備的信息。
static void virtio_blk_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); k->init = virtio_blk_init_pci; //virtio-blk初始化函數(shù) k->exit = virtio_blk_exit_pci; k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET; //設(shè)備廠商號(hào),所有的virtio設(shè)備都為0x1af4 k->device_id = PCI_DEVICE_ID_VIRTIO_BLOCK; //設(shè)備號(hào) k->revision = VIRTIO_PCI_ABI_VERSION; //virtio ABI版本號(hào) k->class_id = PCI_CLASS_STORAGE_SCSI; dc->reset = virtio_pci_reset; dc->props = virtio_blk_properties; //virtio-blk設(shè)備所支持的特征 } static TypeInfo virtio_blk_info = { .name = "virtio-blk-pci", .parent = TYPE_PCI_DEVICE, .instance_size = sizeof(VirtIOPCIProxy), .class_init = virtio_blk_class_init, //virtio-blk設(shè)備類(lèi)型初始化函數(shù) };
virtio_blk后端數(shù)據(jù)結(jié)構(gòu)如下
virtio-blk首先是一個(gè)pci設(shè)備,初始化主要分兩個(gè)階段:pci設(shè)備初始化和設(shè)備初始化
以下是它初始化的幾個(gè)階段:
PCI設(shè)備探測(cè)和初始化
虛擬機(jī)啟動(dòng)時(shí),bios和系統(tǒng)會(huì)掃描pci總線,看看上面有沒(méi)有掛載的pci設(shè)備。如果有,則會(huì)創(chuàng)建一個(gè)pci_dev結(jié)構(gòu)。一個(gè)pci設(shè)備用一個(gè)pci_dev數(shù)據(jù)結(jié)構(gòu)表示,創(chuàng)建之后會(huì)用pci設(shè)備配置空間信息來(lái)填充pci_dev,然后調(diào)用device_register來(lái)將其注冊(cè)到pci總線上。PCI總線的match和probe函數(shù)根據(jù)pci_dev數(shù)據(jù)結(jié)構(gòu)中的Vendor ID和Device ID將設(shè)備與注冊(cè)在PCI總線上的驅(qū)動(dòng)進(jìn)行匹配,進(jìn)而匹配到了所有virtio設(shè)備所共用的PCI驅(qū)動(dòng)virtio_pci_driver。
static struct pci_device_id virtio_pci_id_table[] = { { 0x1af4, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { 0 }, }; // PCI_ANY_ID表示匹配任何設(shè)備ID static struct pci_driver virtio_pci_driver = { .name = "virtio-pci", //驅(qū)動(dòng)名稱(chēng) .id_table = virtio_pci_id_table, //驅(qū)動(dòng)所支持的設(shè)備ID信息 .probe = virtio_pci_probe,//探測(cè)函數(shù)(負(fù)責(zé)PCI設(shè)備初始化和進(jìn)一步的virtio設(shè)備探測(cè)) .remove = virtio_pci_remove,//設(shè)備移除時(shí)的處理函數(shù) #ifdef CONFIG_PM .driver.pm = &virtio_pci_pm_ops, //電源管理函數(shù) #endif };
virtio設(shè)備的探測(cè)和初始化
virtio_pci_driver是該階段的關(guān)鍵函數(shù),具體流程如下
前端驅(qū)動(dòng)讀取io請(qǐng)求放入vring
前端通過(guò)notify通知機(jī)制通知后端驅(qū)動(dòng)處理io
notify操作使vcpu執(zhí)行線程退出到qemu應(yīng)用層,其從vring中獲取客戶機(jī)io請(qǐng)求信息,將請(qǐng)求線程放入aio線程池,然后vcpu線程的處理流程重新返回到客戶機(jī)
aio線程處理完成后,通知主線程,并向客戶機(jī)注入中斷說(shuō)明其已完成io操作
客戶機(jī)相應(yīng)中斷,并獲取io請(qǐng)求結(jié)果和處理信息,接著繼續(xù)向上層返回結(jié)果
客戶機(jī)io請(qǐng)求流程
1、讀寫(xiě)操作通過(guò)系統(tǒng)調(diào)用進(jìn)入到操作系統(tǒng)內(nèi)核層,首先到達(dá)VFS層
2、VFS層繼續(xù)向下層傳遞請(qǐng)求,如果頁(yè)高速緩存命中,而文件又不是直接讀寫(xiě),則IO請(qǐng)求在頁(yè)高速緩存得到處理
3、如果沒(méi)有頁(yè)高速緩存或者頁(yè)高速緩存MISS,則進(jìn)入到Mapping Layer(映射層),在這一層主要是根據(jù)文件系統(tǒng)信息,解決文件偏移量與塊設(shè)備中的的邏輯塊號(hào)的映射,并根據(jù)映射將請(qǐng)求下發(fā)到Generic Block Layer(通用塊層)
4、在通用塊層,IO讀寫(xiě)請(qǐng)求由struct bio表示,通用塊層繼續(xù)將請(qǐng)求下發(fā)到IO Scheduler Layer(IO調(diào)度層)
5、在IO調(diào)度層,上層傳遞下來(lái)的bio將根據(jù)類(lèi)型、以及邏輯塊是否靠近等因素進(jìn)行調(diào)度,最終形成一個(gè)req(struct request類(lèi)型),req將被鏈接到設(shè)備的request_queue中
6、IO調(diào)度層繼續(xù)將請(qǐng)求下發(fā),請(qǐng)求到達(dá)了塊設(shè)備驅(qū)動(dòng),塊設(shè)備驅(qū)動(dòng)從request_queue中取下一個(gè)個(gè)請(qǐng)求進(jìn)行處理。
上述內(nèi)容就是如何進(jìn)行virtio的分析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。