linux 之virtio 的驅動框架

1、基本知識

上一篇文章介紹了 virtio 的核心數據的實現和邏輯:linux 之 virtio 子系統核心的數據結構-CSDN博客

virtio 是對半虛擬化 hypervisor?中的一組通用模擬設備的抽象。它允許 hypervisor 導出一組通用的模擬設備,并通過一個通用的應用編程接口(API)讓它們變得可用。下圖展示了為什么這很重要。有了半虛擬化 hypervisor 之后,客戶操作系統能夠實現一組通用的接口,在一組后端驅動程序之后采用特定的設備模擬。后端驅動程序不需要是通用的,因為它們只實現前端所需的行為。

注意,在現實中(盡管不需要),設備模擬發生在使用?QEMU?的空間,因此后端驅動程序與 hypervisor 的用戶空間交互,以通過 QEMU 為 I/O 提供便利。QEMU 是一個系統模擬器,它不僅提供客戶操作系統虛擬化平臺,還提供整個系統(PCI 主機控制器、磁盤、網絡、視頻硬件、USB 控制器和其他硬件元素)的模擬。

2、virtio的模塊層次

2.1 virtio 的驅動的框架

除了前端驅動(在客戶機操作系統中實現)和后端驅動(在虛擬機 hypervisor 中實現)之外,virtio 還定義了 2 個層次來支持客戶機到 hypervisor 的通信。

在頂層(稱為 virtio 層)是虛擬隊列接口,它在概念上將前端驅動程序附加到后端驅動,驅動可以根據需要使用零個或多個隊列。例如,virtio 網絡驅動使用兩個虛擬隊列(一個用于接收,一個用于發送),而 virtio 塊驅動只使用一個隊列。虛擬隊列是虛擬的,它通過 ring 實現,以用于遍歷客戶機到 hypervisor 的信息。這可以以任何方式來實現,只要 Guest 和 hypervisor 通過相同的方式來實現。

內核中實現的virtio 的前端驅動框架:

如圖 所示,列出了五個前端驅動程序,分別用于塊設備(例如磁盤)、網絡設備、PCI 模擬、balloon 驅動(用于動態管理客戶機內存使用)和控制臺驅動。每個前端驅動在 hypervisor 中都有一個對應的后端驅動。

2.2 在驅動中, 前端驅動程序肯定是注冊了以下數據結構的關系

virtio 前端對象層次結構:

從客戶操作系統的角度來看,對象層次結構 的定義如上圖所示。在頂級的是 virtio_driver,它在客戶操作系統中表示前端驅動程序。與該驅動程序匹配的設備由 virtio_device(設備在客戶操作系統中的表示)封裝。這引用?virtio_config_ops?結構(它定義配置 virtio 設備的操作)。virtio_device 由?virtqueue?引用(它包含一個到它服務的 virtio_device 的引用)。最后,每個 virtqueue 對象引用 virtqueue_ops 對象,后者定義處理 hypervisor 的驅動程序的底層隊列操作。

virtio_driver 結構定義上層設備驅動程序、驅動程序支持的設備 ID 的列表、一個特性表單(取決于設備類型)和一個回調函數列表。當 hypervisor 識別到與設備列表中的設備 ID 相匹配的新設備時,將調用 probe 函數(由 virtio_driver 對象提供)來傳入 virtio_device 對象。將這個對象和設備的管理數據緩存起來(以獨立于驅動程序的方式緩存)。可能要調用 virtio_config_ops 函數來獲取或設置特定于設備的選項,例如,為 virtio_blk 設備獲取磁盤的 Read/Write 狀態或設置塊設備的塊大小,具體情況取決于啟動器的類型。

virtio_device 不包含到 virtqueue 的引用(但 virtqueue 確實引用了 virtio_device)。要識別與該 virtio_device 相關聯的 virtqueue,需要結合使用 virtio_config_ops 對象和 find_vq 函數。該對象返回與這個 virtio_device 實例相關聯的虛擬隊列。find_vq 函數還允許為 virtqueue 指定一個回調函數(查看左 圖中的 virtqueue 結構)。

virtqueue 是一個簡單的結構,它識別一個可選的回調函數(在 hypervisor 使用緩沖池時調用)、一個到 virtio_device 的引用、一個到 virtqueue 操作的引用,以及一個引用要使用的底層實現的特殊 priv 引用。雖然 callback 是可選的,但是它能夠動態地啟用或禁用回調。

virtio緩沖池:客戶操作系統(前端)驅動程序通過緩沖池與 hypervisor 交互。對于 I/O,客戶操作系統提供一個或多個表示請求的緩沖池。例如,你可以提供 3 個緩沖池,第一個表示 Read 請求,后面兩個表示響應數據。該配置在內部被表示為一個散集列表(scatter-gather),列表中的每個條目表示一個地址和一個長度。緩沖區的格式、順序和內容僅對前端和后端驅動程序有意義。內部傳輸(當前實現中的連接點)僅移動緩沖區,并且不知道它們的內部表示。

該層次結構的核心是 virtqueue_ops,它定義在客戶操作系統和 hypervisor 之間移動命令和數據的方式:

第一個函數 add_buf 用于向 hypervisor 提供請求。如前面所述,該請求以散集列表的形式存在。對于 add_buf,客戶操作系統提供用于將請求添加到隊列的 virtqueue、散集列表(地址和長度數組)、用作輸出條目(目標是底層 hypervisor)的緩沖池數量,以及用作輸入條目(hypervisor 將為它們儲存數據并返回到客戶操作系統)的緩沖池數量。當通過 add_buf 向 hypervisor 發出請求時,客戶操作系統能夠通過 kick 函數通知 hypervisor 新的請求。為了獲得最佳的性能,客戶操作系統應該在通過 kick 發出通知之前將盡可能多的緩沖池裝載到 virtqueue。

第二個函數get_buf 處理自 hypervisor 的響應。客戶操作系統僅需調用該函數或通過提供的 virtqueue callback 函數等待通知就可以實現輪詢。當客戶操作系統知道緩沖區可用時,調用 get_buf 返回完成的緩沖區。

最后兩個函數enable_cb 和 disable_cb用來啟用或禁用回調進程(通過在 virtqueue 中由 virtqueue 初始化的 callback 函數)。注意,該回調函數和 hypervisor 位于獨立的地址空間中,因此調用通過一個間接的 hypervisor 來觸發(比如 kvm_hypercall)。

3、virtio? 的驅動實例, 網友寫的比較清楚的virtio-net 的前端驅動程序

Linux virtio-net driver - 知乎

后面找個時間具有看一下源碼。

4、virtio? 的后端程序實例

一定要結合一個后端驅動進行分析,可以對照rpmsg-lite分析

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

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

相關文章

項目1總結其三(圖片上傳功能)

1、UploadService public interface UploadService {//上傳圖片String uploadImage(MultipartFile file, String type); }upload.location D:/upload Value("${upload.location}")private String uploadLocation;//文件上傳路徑Overridepublic String uploadImage(M…

Linux應用層開發--線程池介紹

Glib 線程池 1. 線程池簡介 線程池是一種管理和重用多個線程的設計模式: 避免頻繁創建/銷毀線程的開銷。提高性能與資源利用率。任務提交后,由線程池內的線程自動執行,任務執行完線程不會退出,而是繼續等待下一個任務。 2. Gli…

【Python】Python 多進程與多線程:從原理到實踐

Python 多進程與多線程:從原理到實踐 文章目錄Python 多進程與多線程:從原理到實踐前言一、并發編程基礎:進程與線程1.1 進程(Process)1.2 線程(Thread)1.3 進程與線程的關系二、Python 中的 &q…

electron-vite_18Less和Sass共用樣式指定

項目中可以封裝less公用樣式和方法&#xff0c;比如自動以滾動條樣式、單行省略號、多行省略號、display:none等&#xff1b;關于additionalData的配置生效,請在main.js中引入一個別的樣式或vue組件中使用“<style lang“scss”><style>”找到electron.vite.config…

Python面試題及詳細答案150道(71-80) -- 文件操作篇

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

python新工具-uv包管理工具

uv 是一個由 Astral (Ruff 的創建者) 開發的極速 Python 包和項目管理器&#xff0c;用 Rust 編寫。它旨在作為傳統 Python 包管理工具&#xff08;如 pip、pip-tools、pipx、poetry、pyenv、twine 和 virtualenv 等&#xff09;的替代品&#xff0c;通過其高性能和多功能集成&…

有關spring-ai的defaultSystem與systemMessage優先級

今天在寫項目的時候想用nacos隨時修改system的prompt&#xff0c;突然發現defaultSystem的優先級比systemMessage高很多&#xff0c;廢話我就不說了&#xff0c;看圖吧。你覺得證據不夠&#xff1f;那這樣呢&#xff1f;

#運維 | 前端 # Linux http.server 實踐:隱藏長文件名,簡短路徑 (http://IP:port/別名 ) 訪問

如何運行頁面為 http://ip:port/名稱 1. 準備文件目錄 假設文件原始位置&#xff1a; /home/ubuntu/projects/yinran/ckd.html將它移動到子目錄并改名為 index.html&#xff1a; mkdir -p /home/ubuntu/projects/yinran/ckd mv /home/ubuntu/projects/yinran/ckd.html \/home/u…

任務管理器不刷新

記錄一個小問題&#xff1a; 進入任務管理器之后發現頁面不會刷新&#xff0c;性能界面也是一致。解決辦法&#xff1a;查看–>更新速度–>正常

2025-08-21 Python進階9——__main__與lambda

文章目錄1 \_\_main\_\_1.1 name 變量1.1.1 當模塊作為主程序直接運行時1.1.2 當模塊被其他模塊導入時1.2 \_\_main\_\_ 的含義1.3 if \_\_name\_\_ \_\_main\_\_1.5 小結2 lambda表達式2.1 基本概念2.2 lambda 函數語法2.3 使用示例2.4 與高階函數結合使用2.4.1 與 map () 結…

Java:將視頻上傳到騰訊云并通過騰訊云點播播放

功能需求:傳入一個videoFile也就是視頻字節流,返回騰訊云點播的視頻保存url需要在騰訊云中尋找的配置信息:導入的依賴:<!--騰訊云點播--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId&…

Unity3D物理游戲網絡同步指南

前言 Unity3D 物理游戲的網絡同步是一個復雜但非常核心的話題。要實現一個流暢、公平且可擴展的多人物理游戲&#xff0c;需要深入的理解和精心的設計。 下面我將為你全面解析 Unity3D 物理游戲的網絡同步&#xff0c;包括核心概念、主流方案、實現細節以及最佳實踐。 對惹&…

Amazon Redshift 訪問配置完整指南

概述 Amazon Redshift 是 AWS 提供的云端數據倉庫服務,支持多種訪問方式。本文將詳細介紹如何配置 IAM 權限、使用 AWS 控制臺 Query Editor v2,以及通過 SQL Workbench/J 等第三方工具連接 Redshift 集群。 目錄 環境準備 IAM 權限配置 Redshift 用戶管理 AWS 控制臺訪問 …

electron-vite_19配置環境變量

前端配罟環境變量主要通過項目根目錄下的.env系列文件實現&#xff0c;不同框架(如Vue、React)或構建工具(如Vite、Webpack)的具體操作略有差異&#xff0c;但核心邏輯均為通過環境變量文件區分開發、測試、生產等環境。方案1: 直接在根目錄新建.env文件 1.在根目錄新建 .env.d…

【python】arange用法

1. NumPy 里的 np.arangeimport numpy as np# 語法 np.arange([start, ]stop, [step, ], dtypeNone)參數說明&#xff1a;start&#xff1a;起始值&#xff08;默認 0&#xff09;stop&#xff1a;終止值&#xff08;不包含這個值&#xff09;step&#xff1a;步長&#xff08;…

力扣1005:k次取反后最大化的數組和

力扣1005:k次取反后最大化的數組和題目思路代碼題目 給你一個整數數組 nums 和一個整數 k &#xff0c;按以下方法修改該數組&#xff1a; 選擇某個下標 i 并將 nums[i] 替換為 -nums[i] 。 重復這個過程恰好 k 次。可以多次選擇同一個下標 i 。 以這種方式修改數組后&…

國產數據庫管理工具 CloudDM 2.7.1.0 發布,OceanBase 等數據源支持復雜 SQL 脫敏數據

CloudDM 是 ClouGence 公司推出的面向團隊使用的數據庫管理工具&#xff0c;支持云上、云下、多云等多種環境&#xff0c;并且提供多達 23 種數據源的支持。CloudDM 還支持數據庫 DevOps CI/CD 功能&#xff0c;將用戶產品發布流程中數據庫發布和程序發布無縫串聯起來。 更新亮…

AI大模型實戰:用自然語言處理技術高效處理日常瑣事

引言在數字化時代&#xff0c;我們每天都會面對大量的瑣碎事務&#xff1a;整理會議記錄、處理名單數據、撰寫學習筆記等等。這些工作不僅耗時&#xff0c;而且容易出錯。幸運的是&#xff0c;隨著人工智能技術的發展&#xff0c;特別是大語言模型&#xff08;LLM&#xff09;的…

【spring security】為什么要使用userdetailservice

Spring Security UserDetailsService 深度解析&#xff1a;從401到認證成功的完整實現 &#x1f4cb; 目錄 問題背景Spring Security認證架構UserDetailsService的作用完整實現過程常見問題與解決方案最佳實踐 &#x1f3af; 問題背景 在開發B2B采購平臺時&#xff0c;我們…

機器學習中的數據處理技巧

一、Pandas處理丟失數據&#xff08;一&#xff09;判斷缺失值??isnull()函數??&#xff1a;用于判斷數據框&#xff08;DataFrame&#xff09;中各個單元格是否為空&#xff0c;可幫助我們識別出存在缺失數據的單元格位置。&#xff08;二&#xff09;處理缺失值的方法??…