真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何進行virtio的分析-創(chuàng)新互聯(lián)

本篇文章為大家展示了如何進行virtio的分析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)的服務宗旨!把網(wǎng)站當作互聯(lián)網(wǎng)產品,產品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設中就是為了建設一個不僅審美在線,而且實用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對網(wǎng)站設計、成都網(wǎng)站建設、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設計、網(wǎng)站優(yōu)化、網(wǎng)絡推廣、探索永無止境。

virtio


virtio是一個通用的io虛擬化框架,hypervisor通過他模擬出一系列的虛擬化設備,并使得這些設備在虛擬機內部通過api調用的方式變得可用。它為客戶機提供了一個高效訪問塊設備的方法。它包含4個部分:前端驅動、后端驅動、vring及通信間統(tǒng)一的接口。與其他的模擬io方式對比,virtio減少了虛擬機的退出和數(shù)據(jù)拷貝,能夠極大地提高IO性能。計算機中存在不同的總線標準,而virtio采用的是pci總線(當然也可以用其他總線來實現(xiàn))。每一個virtio設備就是一個pci設備。

如何進行virtio的分析

virtio-blk的后端初始化


virtio-blk代碼包保存在hw/virtio-pci.c和hw/virtio-blk.c中,通過如下函數(shù)對virtio_blk進行初始化。主要的初始化函數(shù)是virtio_blk_init_pci。這里定義了設備的信息。

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;     //設備廠商號,所有的virtio設備都為0x1af4     k->device_id = PCI_DEVICE_ID_VIRTIO_BLOCK;          //設備號     k->revision = VIRTIO_PCI_ABI_VERSION;  //virtio ABI版本號     k->class_id = PCI_CLASS_STORAGE_SCSI;     dc->reset = virtio_pci_reset;     dc->props = virtio_blk_properties;   //virtio-blk設備所支持的特征 }   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ù) };

virtio_blk后端數(shù)據(jù)結構如下

如何進行virtio的分析

如何進行virtio的分析

virtio-blk首先是一個pci設備,初始化主要分兩個階段:pci設備初始化和設備初始化

以下是它初始化的幾個階段:

  • PCI設備探測和初始化

虛擬機啟動時,bios和系統(tǒng)會掃描pci總線,看看上面有沒有掛載的pci設備。如果有,則會創(chuàng)建一個pci_dev結構。一個pci設備用一個pci_dev數(shù)據(jù)結構表示,創(chuàng)建之后會用pci設備配置空間信息來填充pci_dev,然后調用device_register來將其注冊到pci總線上。PCI總線的match和probe函數(shù)根據(jù)pci_dev數(shù)據(jù)結構中的Vendor ID和Device ID將設備與注冊在PCI總線上的驅動進行匹配,進而匹配到了所有virtio設備所共用的PCI驅動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表示匹配任何設備ID static struct pci_driver virtio_pci_driver = {          .name                  = "virtio-pci",      //驅動名稱          .id_table         = virtio_pci_id_table,  //驅動所支持的設備ID信息          .probe                  = virtio_pci_probe,//探測函數(shù)(負責PCI設備初始化和進一步的virtio設備探測)          .remove               = virtio_pci_remove,//設備移除時的處理函數(shù) #ifdef CONFIG_PM          .driver.pm  = &virtio_pci_pm_ops, //電源管理函數(shù) #endif };
  • virtio設備的探測和初始化

virtio_pci_driver是該階段的關鍵函數(shù),具體流程如下

如何進行virtio的分析

如何進行virtio的分析

  1. 前端驅動讀取io請求放入vring

  2. 前端通過notify通知機制通知后端驅動處理io

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

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

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

客戶機io請求流程


如何進行virtio的分析

1、讀寫操作通過系統(tǒng)調用進入到操作系統(tǒng)內核層,首先到達VFS層

2、VFS層繼續(xù)向下層傳遞請求,如果頁高速緩存命中,而文件又不是直接讀寫,則IO請求在頁高速緩存得到處理

3、如果沒有頁高速緩存或者頁高速緩存MISS,則進入到Mapping Layer(映射層),在這一層主要是根據(jù)文件系統(tǒng)信息,解決文件偏移量與塊設備中的的邏輯塊號的映射,并根據(jù)映射將請求下發(fā)到Generic Block Layer(通用塊層)

4、在通用塊層,IO讀寫請求由struct bio表示,通用塊層繼續(xù)將請求下發(fā)到IO Scheduler Layer(IO調度層)

5、在IO調度層,上層傳遞下來的bio將根據(jù)類型、以及邏輯塊是否靠近等因素進行調度,最終形成一個req(struct request類型),req將被鏈接到設備的request_queue中

6、IO調度層繼續(xù)將請求下發(fā),請求到達了塊設備驅動,塊設備驅動從request_queue中取下一個個請求進行處理。

上述內容就是如何進行virtio的分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


分享題目:如何進行virtio的分析-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://weahome.cn/article/iephi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部