IO半虛擬化-Virtio學習筆記

參考:《深入淺出DPDK》及大佬們的各種博客

Virtio簡介&運行環境

Virtio 是一種用于虛擬化環境中的半虛擬化 I/O 框架,目的是在虛擬機和主機之間提供一種高效的 I/O 機制。關于什么是半虛擬化和全虛擬化:見SR-IOV學習筆記。
YES,virtio 是作為客戶機訪問主機上的設備的接口而開發的,因此可以分為兩部分:

  • virtio Guest OS(虛擬機)中實現的前端程序,定義了如何在客戶機和主機之間創建控制平面和數據平面
  • vhost 協議,在宿主機(物理機或主機)實現的后端驅動, 允許將 virtio 數據平面實現外置到另一部分(用戶進程或內核模塊)以提高性能的協議,核心目的是通過將虛擬設備的數據處理任務從虛擬機監視器(如 QEMU)轉移到主機上的用戶態或內核態進程
    ps:大家伙耳熟能詳(呃,或許并不太熟悉)的virtio-net是虛擬以太網卡,是一種virtio支持的IO設備。

Virtio 被廣泛應用于 KVM(Kernel-based Virtual Machine)和 QEMU 等虛擬化平臺,提供了包括網絡、塊設備等在內的多種虛擬設備支持。其工作環境如下:
在這里插入圖片描述
圖片來源:https://www.redhat.com/en/blog/introduction-virtio-networking-and-vhost-net

下面淺談下Virtio的同事們:

  • KVM

    • 個人簡介:基于Linux內核的開源虛擬化解決方案
    • 工作團隊:內核空間
    • 工作內容:提供虛擬化支持,允許在同一臺物理機上運行多個操作系統作為虛擬機,實現硬件資源的高效利用和靈活管理,相當于把 Linux 內核轉變為虛擬機管理程序,使得虛擬機可以直接利用硬件虛擬化擴展(如 Intel VT-x 和 AMD-V)運行。
  • QEMU

    • 個人簡介:通用且開源的虛擬機模擬器和虛擬化工具
    • 工作團隊:用戶空間
    • 工作內容:1. 模擬整個計算機系統,包括處理器、內存、硬盤、網絡接口等, 適用于運行不同架構的完整操作系統(比如在x86系統上運行ARM, 斗宗強者,竟恐怖如斯) 2. 提供虛擬化支持,可以利用硬件虛擬化技術(如 Intel VT-x 和 AMD-V)運行虛擬機,大大的提高性能。
  • Libvirt

    • 個人簡介:虛擬化技術管理員
    • 工作團隊:用戶空間
    • 工作內容:1. 調用qemu創建、啟動、恢復、暫停虛擬機,是真正的虛擬機管理者,并提供API供用戶調用 2. 為每個虛擬機啟動一個 qemu 進程,并將 XML 格式的配置轉換為 qemu CLI 調用的接口,供用戶使用

半虛擬化Virtio

Virtio使用場景

在現代數據中心中大量采用虛擬化技術,IO全虛擬方案中,虛擬機以寄存器的方式訪問外設,比如網卡發送一個報文,需要寫很多次寄存器,造成大量的(VM-exit,虛擬機暫停運行),性能很差。IO透傳方案性能很好,但不能從硬件上支持虛擬機的動態遷移以及缺乏足夠靈活的流分類規則。于是,就有了很多Vritio的使用場景。其實現有的云計算廠商,很多都是用的virtio實現的虛擬機和裸金屬場景的熱遷移。

以下是virio設備的典型場景
在這里插入圖片描述
宿主機使用虛擬交換機聯通物理網卡和虛擬機。虛擬交換機內部有DPDK vhost,實現了Virtio的后端網絡設備驅動程序邏輯,虛擬機里有DPDK的前端網絡設備驅動。前端和后端通過virtio的虛擬隊列交換數據。
這樣虛擬機中的網絡數據遍剋發送到虛擬交換機中,通過轉發邏輯,經由物理網卡進入外部網絡。

Virtio架構&原理

Virtio架構如下圖所示,
在這里插入圖片描述

  • 前端驅動程序

    • 包含不同前端驅動程序,如塊設備(例如磁盤)驅動、網絡設備驅動等驅動程序。每個前端驅動程序在虛擬機管理程序中都有相應的后端驅動程序。 驅動程序可以根據需要使用零個或多個隊列。例如,virtio網絡驅動程序使用兩個虛擬隊列(一個用于接收,一個用于發送),而virtio塊驅動程序僅使用一個。虛擬隊列是虛擬的,實際上被實現為環以遍歷客戶機到虛擬機管理程序的轉換。
  • 虛擬隊列

    • 連接客戶機操作系統 和宿主機后端驅動的實際數據鏈路

虛擬隊列

虛擬隊列主要由描述符列表(descriptor table)、可用換標和已用環表(used ring)組成。描述符列表指向的是實際要傳輸的數據。兩個環表指向的是描述符列表,分別用來標記前端和后端驅動程序對描述符列表中描述符的處理進度。詳細來看:

  • 描述符列表
/* dpdk/drivers/net/virtio/virtio_ring.h */
struct vring_desc {uint64_t addr;  /*  數據緩沖區的客戶機物理地址 */uint32_t len;   /* 數據緩沖區的長度 */uint16_t flags; /* 標志位,表示當前描述符的書香,如next是否有效等 */uint16_t next;  /* 描述符鏈中下一個描述符的地址 */
};
  • 可用環表
/* dpdk/drivers/net/virtio/virtio_ring.h */
struct vring_avail {uint16_t flags;		/* 標志位,表示環表的一些屬性,比如是否需要設備在使用了環表中的表項后發送中斷給驅動 */uint16_t idx;		/* 驅動寫入下一個可用描述符的位置 */uint16_t ring[0];   /* 存儲描述符指針(id)的數組 */
};
  • 已用環表
/* dpdk/drivers/net/virtio/virtio_ring.h */
struct vring_used_elem {/* Index of start of used descriptor chain. */uint32_t id;/* Total length of the descriptor chain which was written to. */uint32_t len;
};struct vring_used {uint16_t flags;			/* 標志位,包括是否需要驅動在回收了已用環表中的表項后發送提醒給設備  */volatile uint16_t idx;struct vring_used_elem ring[0];
};

Virtio設備的使用

設備的使用主要包括兩部分:

  • 驅動通過描述符列表和可用環表提供的數據緩沖區給設備用
    • 把數據緩沖區地址、長度等信息賦值到空閑的描述符中
    • 把改描述符指針添加到該虛擬隊列的可用環表的頭部
    • 更新可用環表中的頭部指針
    • 寫入該虛擬隊列編號到Queue Notify寄存器以通知設備
  • 設備使用描述符后再通過已用環表還給驅動
    • 把使用過的數據緩沖區描述符的頭指針添加到該虛擬隊列的已用環表的頭部
    • 更新該已用環表的頭部指針
    • 根據是否開啟MSI-X中斷,用不同的中斷方式通知驅動。

Virtio網絡設備

virtio網絡設備Linux驅動主要包括三部分:

  • 底層PCI-e設備層
    • 負責監測PCI-e設備,并初始化設備對應的驅動程序
  • 中間Virtio虛擬隊列層
    • 實現了Virtiio協議中的虛擬隊列
  • 上層網絡設備層
    • 實現了兩個抽象類:virtio設備和網絡設備,從而Linux系統能夠對待普通網卡一樣操作這個virtio網絡設備
/* dpdk/lib/librte_vhost/rte_virtio_net.h  */
/*** Device and vring operations.*/
struct virtio_net_device_ops {int (*new_device)(int vid);		/**< Add device. */void (*destroy_device)(int vid);	/**< Remove device. */int (*vring_state_changed)(int vid, uint16_t queue_id, int enable);	/**< triggered when a vring is enabled or disabled */void *reserved[5]; /**< Reserved for future extension */
};

以上,順心順意!

參考:

《深入淺出dpdk》
https://www.redhat.com/en/blog/introduction-virtio-networking-and-vhost-net
https://developer.ibm.com/articles/l-virtio/
https://tinylab.org/virtio-intro/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44709.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PDMS二次開發(二十二)——關于1.0.3.1版本升級內容的說明

目錄 1.更新內容介紹2.效果演示3.關于重構自動添加焊口功能的說明3.1錯誤示例 3.問題交流1.創建焊口提示失敗2.程序崩潰 1.更新內容介紹 在添加焊口之前先清除當前branch已有焊口&#xff1b;顯示清除焊口的個數和添加焊口的個數&#xff1b;重構了自動添加焊口功能&#xff0…

值得關注的數據資產入表

不錯的講解視頻&#xff0c;來自&#xff1a;第122期-杜海博士-《數據資源入表及數據資產化》-大數據百家講壇-廈門大學數據庫實驗室主辦第122期-杜海博士-《數據資源入表及數據資產化》-大數據百家講壇-廈門大學數據庫實驗室主辦-20240708_嗶哩嗶哩_bilibili

《A++ 敏捷開發》- 10 二八原則

團隊成員協作&#xff0c;利用項目數據&#xff0c;分析根本原因&#xff0c;制定糾正措施&#xff0c;并立馬嘗試&#xff0c;判斷是否有效&#xff0c;是改善的“基本功”。10-12章會探索里面的注意事項&#xff0c;13章會看兩家公司的實施情況和常見問題。 如果已經獲得高層…

Linq的常用方法

LINQ&#xff08;Language Integrated Query&#xff09;是.NET Framework中用于數據查詢的組件&#xff0c;它將查詢功能集成到C#等.NET語言中。LINQ提供了豐富的查詢操作符&#xff0c;這些操作符可以應用于各種數據源&#xff0c;如內存中的集合、數據庫、XML等。以下是一些…

java中的String 以及其方法(超詳細!!!)

文章目錄 一、String類型是什么String不可變的原因(經典面試題)String不可變的好處 二、String的常用構造形式1.使用常量串構造2.使用newString對象構造3.字符串數組構造 三、常用方法1. length() 獲取字符串的長度2. charAt() 獲取字符串中指定字符的值 (代碼單元)3. codePoin…

水的幾個科學問題及引發的思考

水的幾個科學問題及引發的思考 兩個相同的容器A和B&#xff0c;分別裝有同質量的水&#xff0c;然后&#xff0c;在A容器中加入水&#xff0c;在B容器中加入冰&#xff0c;如果加入水和冰的質量相同。問&#xff0c;容器B的水位將與容器A的水位相同嗎&#xff08;假設冰未融化時…

Log4j的原理及應用詳解(二)

本系列文章簡介&#xff1a; 在軟件開發的廣闊領域中&#xff0c;日志記錄是一項至關重要的活動。它不僅幫助開發者追蹤程序的執行流程&#xff0c;還在問題排查、性能監控以及用戶行為分析等方面發揮著不可替代的作用。隨著軟件系統的日益復雜&#xff0c;對日志管理的需求也日…

MySQL和SQlServer的區別

MySQL和SQlServer的區別 說明&#xff1a;在一些常用的SQL語句中&#xff0c;MySQL和SQLServer存在有一些區別&#xff0c;后續我也會將我遇到的不同點持續更新在這篇博客中。 1. 獲取當前時間 SQLServer&#xff1a; -- SQLServer -- 1.獲取當前時間 SELECT GETDATE(); --…

Vue2切換圖片小案例

代碼中 v-show "index>0",是表示下標只有大于零時上一頁按鈕才會顯示v-show "index<list.length-1",是表示下標只有小于list數組的最大值才會顯示&#xff0c;反之隱藏。click "index--"和click "index",是點擊按鈕后加減數…

【ZooKeeper學習筆記】

1. ZooKeeper基本概念 Zookeeper官網&#xff1a;https://zookeeper.apache.org/index.html Zookeeper是Apache Hadoop項目中的一個子項目&#xff0c;是一個樹形目錄服務Zookeeper翻譯過來就是動物園管理員&#xff0c;用來管理Hadoop&#xff08;大象&#xff09;、Hive&…

AR0132AT 1/3 英寸 CMOS 數字圖像傳感器可提供百萬像素 HDR 圖像處理(器件編號包含:AR0132AT6R、AR0132AT6C)

AR0132AT 1/3 英寸 CMOS 數字圖像傳感器&#xff0c;帶 1280H x 960V 有效像素陣列。它能在線性或高動態模式下捕捉圖像&#xff0c;且帶有卷簾快門讀取。它包含了多種復雜的攝像功能&#xff0c;如自動曝光控制、開窗&#xff0c;以及視頻和單幀模式。它適用于低光度和高動態范…

QML界面控件加載與顯示順序

一、QML界面控件加載順序 QML在界面加載時的順序和我們認知的有很大的不同&#xff0c;有時候會對我們獲取參數以及界面實現造成很大的困擾 1、加載順序 import QtQuick 2.12 import QtQml 2.12 import QtQuick.Window 2.12 import QtQuick.VirtualKeyboard 2.4Window {id: …

Open3D點云算法與點云深度學習案例匯總(長期更新)

目錄 引言 Open3D算法匯總 Open3D快速安裝 測試點云資料 一、點云的讀寫與顯示 二、KD tree和八叉樹的應用 三、點云特征提取 四、點云濾波算法 五、點云配準算法 六、點云分割算法&#xff08;待更新&#xff09; 七、常用操作 八、數據轉換 九、常用小工具 三維…

交換機的二三層原理

相同VLAN的交換機交換原理&#xff08;二層交換原理&#xff09;&#xff1a; 交換機收到數據幀&#xff0c;首先會檢查數據幀的VLAN標簽和目標MAC&#xff0c;若屬于相同VLAN&#xff0c;且該目標MAC在本地MAC表中&#xff0c;則直接根據出接口進行數據轉發 不同VLAN的交換機…

九盾安防:如何調控叉車限速器的報警速度呢

在繁忙的物流倉儲和制造業環境中&#xff0c;叉車是不可或缺的搬運設備。然而&#xff0c;其高速行駛也帶來了潛在的安全隱患。為了確保作業人員和貨物的安全&#xff0c;又車限速器的設置顯得尤為關鍵。那么&#xff0c;如何調控叉車限速器的報警速度呢? 叉車限速器的速度調整…

復制vmware虛擬機文件并改名(文件名使用python替換)得到一臺新的虛擬機

文章目錄 需求實驗復制文件夾并重命名使用python將所有文件名“WinSer2022”字符替換成“wingetmac”修改虛擬機配置文件&#xff08;.vmx&#xff09;打開新的虛擬機成功 需求 將已有的Winser2022虛擬機復制成wingetmac并開機 實驗 復制文件夾并重命名 將"WinSer2022…

《人生苦短,我用python·九》python之線程池ThreadPoolExecutor的使用

Python線程池是一種管理和使用線程的高級抽象&#xff0c;使得線程的創建、分配和管理更加方便。通過線程池&#xff0c;可以避免頻繁地創建和銷毀線程&#xff0c;從而提高程序的性能。Python的concurrent.futures模塊提供了一個ThreadPoolExecutor類&#xff0c;可以方便地使…

了解并緩解 IP 欺騙攻擊

欺騙是黑客用來未經授權訪問計算機或網絡的一種網絡攻擊&#xff0c;IP 欺騙是其他欺騙方法中最常見的欺騙類型。通過 IP 欺騙&#xff0c;攻擊者可以隱藏 IP 數據包的真實來源&#xff0c;使攻擊來源難以知曉。一旦訪問網絡或設備/主機&#xff0c;網絡犯罪分子通常會挖掘其中…

1559. 二維網格圖中探測環

1559. 二維網格圖中探測環 給你一個二維字符網格數組 grid &#xff0c;大小為 m x n &#xff0c;你需要檢查 grid 中是否存在 相同值 形成的環。 一個環是一條開始和結束于同一個格子的長度 大于等于 4 的路徑。對于一個給定的格子&#xff0c;你可以移動到它上、下、左、右…

【Qt 初識】QPushButton 的詳解以及 Qt 中的坐標

文章目錄 1. Qt 中的信號槽機制 &#x1f34e;2. 通過圖形化界面的方式實現 &#x1f34e;3. 通過純代碼的方式實現按鈕版的HelloWorld &#x1f34e;4. 設置坐標 &#x1f34e; 1. Qt 中的信號槽機制 &#x1f34e; 》&#x1f427; 本質就是給按鈕的點擊操作&#xff0c;關聯…