如何進(jìn)行virtio的分析

本篇文章為大家展示了如何進(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)成就非凡,專業(yè)從事網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)頁(yè)制作,軟文營(yíng)銷,一元廣告等。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è)備。

如何進(jìn)行virtio的分析

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è)備類型初始化函數(shù)
};

virtio_blk后端數(shù)據(jù)結(jié)構(gòu)如下

如何進(jìn)行virtio的分析

如何進(jìn)行virtio的分析

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)名稱
         .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ù),具體流程如下

如何進(jìn)行virtio的分析

如何進(jìn)行virtio的分析

  1. 前端驅(qū)動(dòng)讀取io請(qǐng)求放入vring

  2. 前端通過(guò)notify通知機(jī)制通知后端驅(qū)動(dòng)處理io

  3. notify操作使vcpu執(zhí)行線程退出到qemu應(yīng)用層,其從vring中獲取客戶機(jī)io請(qǐng)求信息,將請(qǐng)求線程放入aio線程池,然后vcpu線程的處理流程重新返回到客戶機(jī)

  4. aio線程處理完成后,通知主線程,并向客戶機(jī)注入中斷說(shuō)明其已完成io操作

  5. 客戶機(jī)相應(yīng)中斷,并獲取io請(qǐng)求結(jié)果和處理信息,接著繼續(xù)向上層返回結(jié)果

客戶機(jī)io請(qǐng)求流程


如何進(jìn)行virtio的分析

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ù)類型、以及邏輯塊是否靠近等因素進(jìn)行調(diào)度,最終形成一個(gè)req(struct request類型),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è)資訊頻道。

標(biāo)題名稱:如何進(jìn)行virtio的分析
標(biāo)題路徑:http://bm7419.com/article44/gejhee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名做網(wǎng)站、ChatGPT、網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站制作、域名注冊(cè)

廣告

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

商城網(wǎng)站建設(shè)