Linux之virtio實現原理--pci 基礎

一、概述

?virtio設備可以基于不同總線來實現,本文介紹基于pci實現的virtio-pci設備。以virtio-blk為例,首先介紹PCI配置空間內容,virtio-pci實現的硬件基礎——capability,最后分析PIC設備的初始化以及virtio-pci設備的初始化。

再后面不詳細介紹PCI太多的知識, 已virtio 相關為主。

?二、PCI 配置空間

virtio設備作為pci設備,必須實現pci local bus spec規定的配置空間(最大256字節,現在有的最大是1K,看芯片自己設置, 只要前64字節是PCI標準)前64字節是spec中定義好的,稱預定義空間。其中前16字節對所有類型的PCI設備都相同之后的空間格式因類型而不同,對前16字節空間,我稱其為通用配置空間。

2.1 通用配置空間

通用配置空間如下圖所示:

(1)vendor id

廠商ID,用來標識PCI設備出自哪個廠商。這里是0x1af4,來自Red Hat。

(2)device id

廠商下的產品ID。傳統virtio-blk設備,這里是0x1001。

(3)revision id

設備版本ID。廠商決定是否使用,這里未使用。

(4)header type

pci設備類型。0x00表示普通設備、0x01表示pci bridge、0x02表示CardBus bridge。virtio是普通設備,這里是0x00。

通用配置空間即PCI配置空間前16字節中的以上4個地方用來識別virtio設備。

(5)command

command字段用來控制pci設備,打開某些功能的開關。對于virtio-blk設備來說,是(0x0507 = 0b01010111)。command的各字段含義如下圖所示:

其中,低三位的含義如下:

  • I/O Space位

如果PCI設備實現了IO空間,該字段用來控制是否接收總線上對IO空間的訪問;如果PCI設備沒有IO空間,該字段不可寫。

  • Memory Space位

如果PCI設備實現了內存空間,該字段用來控制是否接收總線上對內存空間的訪問;如果PCI設備沒有內存空間,該字段不可寫。

  • Bus Master位

控制PCI設備是否具有作為Master角色的權限。

(6)status

status字段用來記錄pci設備的狀態信息。對于virtio-blk設備,是(0x10 = 0b00010000)。status各字段含義如下圖所示:

其中,Capabilities List位的含義如下:

  • Capabilities List位

Capabilities List是pci規范定義的附加空間標志位,其意義是允許在pci設備配置空間之后加上額外的寄存器。這些寄存器由Capability List組織起來,用來實現特定的功能,附加空間在64字節配置空間之后,最大不能超過256字節。以virtio-blk設備為例,它標記了這個位,因此在virtio-blk設備的配置空間之后,還有一段空間用來實現virtio-blk的一些特有功能。此處,Capabilities List位為1表示Capabilities Pointer字段(0x34)存放了附加寄存器組的起始地址。這里的地址表示附加空間在PCI設備空間內的偏移。

virtio-blk設備配置空間的內容可以通過lspci命令查看到,如下圖所示:

2.2 virtio 配置空間

virtio-pci設備實現pci spec規定的通用配置空間后,設計了自己的配置空間,用來實現virtio-pci的功能。

上面已提到,PCI規范通過status字段的capabilities list位標記自己在64字節預定義配置空間之后有附加的寄存器組,capabilities pointer字段會存放寄存器組鏈表的頭部指針,這里的指針代表寄存器在配置空間內的偏移。如下圖所示(仍然是上圖中的信息):

pci spec中描述的capabilities list格式如下:第1個字節存放capability ID,標識后面配置空間實現的是哪種capability,第2個字節存放下一個capability的地址。capability ID查閱參見pci spec3.0

virtio-blk實現的capability有兩種一種是MSI-X( Message Signaled Interrupts - Extension)ID為0x11另一種是Vendor SpecificID為0x9。后面一種capability設計目的就是讓廠商實現自己的功能。virtio-blk的實現以此為基礎。

virtio-pci根據自己的功能需求,設計了如下的capabilities布局:

上圖中右側是6個capability,其中5個用做描述virtio-pci的capability,1個用作描述MSI-X的capability。這里我們只介紹用作virtio-pci的capability。右側描述了virtio-blk的capability布局,左邊是每個capability指向的物理地址空間布局。

根據virtio spec的規范,要實現virtio-pci的capabilty,其布局應該如下:

  • cap_vndr

表示capability類型。

  • cap_next

表示下一個capability在pci配置空間的位置。

  • cap_len

表示capability這個數據結構的長度。

  • cfg_type

表示配置類型。cfg_type通過如下取值,將virtio-pci的capability又細分成幾類:

2.3?virtio通用配置空間

capability中最核心的內容是virtio_pci_common_cfg,它是virtio前后端溝通的主要橋梁。common config分兩部分:第一部分用于設備配置;第二部分用于virtqueue使用。virtio驅動初始化利用第一部分來和后端進行溝通協商,比如支持的特性(guest_feature),初始化時設備的狀態(device_status),設備的virtqueue個數(num_queues)。第二部分用來實現前后端數據傳輸。后面會詳細提到兩部分在virtio初始化和數據傳輸中的作用。virtio_pci_common_cfg數據結構如下:

三、pci 的枚舉和配置

這部分百度上很多, 在之前的文章也寫到了, 在這不贅述了。

注意三點就行:

  1. 枚舉過程中訪問pci配置空間寄存器,軟件接口是往特定寄存器寫東西,真正發起讀寫請求的,是host bridge,它在pci總線上傳輸的是command type為configuration wirte/read的transaction。配置完成后,軟件對pci bar空間關聯的內存進行讀寫,可以直接使用mov內存訪問指令,這時候host bridge在pci總線上傳輸的是command type為IO Read/Write或者Memory Read/Write的transaction。
  2. pci設備被配置之后,bar寄存器中存放了關聯的內存起始地址,這個地址是pci總線域的物理地址,不是cpu域的物理地址,雖然這兩個值一樣,但這只是x86這種架構的特殊情況,因為host bridge轉換的時候是一一映射的,才造成這種假象。在別的架構上,比如power pc,cpu域的地址想要訪問pci總線域的地址,需要通過host bridge進行地址轉換才能進行,兩種地址并不相同。
  3. pci設備被配置之后,雖然看上去軟件可以像訪問內存一樣訪問pci設備的bar的空間,但cpu真正訪問的時候,是要把地址交給host bridge,讓它去訪問才可以。可以說,訪問pci設備bar空間的不是cpu,而是host bridge。至始至終,cpu都不能直接管理pci設備的bar空間,它只能通過host bridge來間接管理。

四、virtio-pci驅動初始化

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

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

相關文章

Claude-Flow AI協同開發:從“CTO”到“人機共生體”的AI協同開發

6.1 思維的終極融合:從“CTO”到“人機共生體” (Human-AI Symbiote) 在之前的章節中,我們逐步將您的角色從“開發者”提升為“項目經理”,最終定位為整個“人機混合團隊的CTO”。這個模型強調的是一種 “指揮-控制” (Command-and-Control) …

TCGA單癌腫按單基因高低分組的轉錄組差異熱圖分析作圖教程

TCGA單癌腫按單基因高低分組的轉錄組差異熱圖分析作圖教程分析作圖原理過程提取出TCGA中指定的單基因單癌腫的轉錄組表達數據對該單基因的表達水平的中位數作為閾值把樣本分成高表達組和低表達組按該基因的高低表達樣本分組來做該癌癥的轉錄組差異分析對差異分析結果中top差異高…

手搓Tomcat

目錄 Tomcat是什么? 前置工作準備 構建并啟動Tomcat 處理Socket邏輯順序 獲取輸入流并讀取數據封裝到Request 自定義Servlet對象 暫存響應體 按Http協議發送響應數據 部署Tomcat ? Tomcat是什么? Tomcat 是一個 Web 應用服務器(準確…

Linux網絡:初識網絡

文章目錄1. 網絡發展1.1 獨立模式1.2 網絡互聯1.3 局域網LAN1.4 廣域網WAN2. 認識 “協議”2.1 什么是協議?2.2 為什么要有協議?2.3 深入了解協議序:開網絡之篇章,建網絡之基礎,將近2月過去,暑假期間不曾有…

文件檢查與拷貝-簡化版

本篇繼續來學習shell腳本,對上一篇的文件檢查與拷貝腳本進行簡化修改。 1 功能說明 在Linux系統中,通過一個shell腳本,實現將一個目錄中的所有文件(包括子目錄中的),拷貝到頂一個指定的目錄,要求…

DCA1000 AWR1843 環境安裝

mmWaveStudio GUI設計用于表征和評估TI Radar器械。mmWaveStudio通過SPI向mmWave設備發送命令來配置和控制mmWave設備。使用DCA 1000 EVM或TSW 1400 EVM板捕獲ADC數據,并在Matlab中處理數據,結果顯示在GUI中。mmWaveStudio GUI利用C DLL和一組API通過FTD…

機器學習實操項目01——Numpy入門(基本操作、數組形狀操作、復制與試圖、多種索引技巧、線性代數)

上一章:【從 0 到 1 落地】機器學習實操項目目錄:覆蓋入門到進階,大學生就業 / 競賽必備 下一章: 機器學習核心知識點目錄:機器學習核心知識點目錄 機器學習實戰項目:【從 0 到 1 落地】機器學習實操項目目…

【vscode】如何離線下載vsxi插件,且在無網環境下離線安裝插件-2026最新實驗教程

文章目錄插件市場也可以從APP進入無網環境下安裝插件插件市場 https://marketplace.visualstudio.com/vscode 也可以從APP進入 這里以下載python插件為例 選擇版本 無網環境下安裝插件

vue2 偵聽器watch

一、watch 核心作用監測數據變化:當被監聽的數據發生改變時,自動執行指定的處理函數處理副作用:適合執行異步操作(如接口請求)、復雜邏輯處理等 “副作用” 代碼二、基礎語法(3 種寫法)簡單寫法…

今天繼續學習Linux系統中shell腳本

首先繼續上次的內容看一下另一個案例案例:持續檢查服務器負載uptime查看負載情況(也可以用top命令)[rootlocalhost ~]# uptime22:11:26 up 7:05, 3 users, load average: 0.00, 0.00, 0.00#!/bin/bash #Function:持續檢查服務器負載,如果負…

Win系統下配置PCL庫第一步之下載Visual Studio和Qt 5.15.2(超詳細)

之前在上篇文章Win系統下配置PCL庫_windows pcl庫 下載-CSDN博客中提到配置PCL庫的教程是下載Visual Studio和Qt 5.15.2,后續在測試中我發現前面這兩步很重要,一般Qt在線下載器選項選不好的話Qt是裝的Qt6,在VTK編譯的時候Qt6往往需要C17編譯&…

openCV3.0 C++ 學習筆記補充(自用 代碼+注釋)---持續更新 四(91-)

環境:OpenCV3.2.0 VS201791、合并Y方向重疊的輪廓以輪廓的最小垂直外接矩形框的y為依據,合并y重疊的輪廓。數學邏輯:幾何合并的數學表達坐標系統:假設矩形由左上角坐標(x, y)和寬高(width, height)定義。合并公式:合并…

numpy數組的升維和降維的方法集錦

為適配計算包對numpy數組的維度要求,對numpy數組進行升維或降維轉化,是非常常見的操作。這里嘗試通過多種方式對numpy數組進行升維或降維。1 數組升維1.1 np.expand_dims在0維升維,示例如下a np.array([1,2,3,4,5]) np.expand_dims(a, axis0…

介紹 Python Elasticsearch Client 的 ES|QL 查詢構建器

作者:來自 Elastic Miguel Grinberg 學習如何使用 ES|QL 查詢構建器,這是一個新的 Python Elasticsearch client 功能,可以更輕松地使用熟悉的 Python 語法構建 ES|QL 查詢。 想要獲得 Elastic 認證嗎?快來了解下一期 Elasticsear…

三坐標測量儀:高精度測量內徑檢測手段及其實際運用

在工業制造領域中,內徑尺寸的精準度直接關系到產品的裝配性能、運行穩定性乃至使用壽命。傳統檢測方法如卡尺、內徑千分尺等難以滿足高精度、復雜結構件的需求。三坐標測量儀技術的出現,打破了這一困境,成為當前工業領域實現高精度內徑檢測的…

DIPMARK:一種隱蔽、高效且具備魯棒性的大語言模型水印技術

摘要水印技術為通過在數據中嵌入隱蔽信息來保障數據安全提供了一種很有前景的方法。該領域的一個首要挑戰在于,在水印嵌入過程中保持原始數據的分布。我們的研究拓展并優化了現有的水印框架,著重強調了保持分布(DiP)水印的重要性。…

IMU傳感器價格與高精度慣性導航系統供應商分析

本段將對IMU傳感器價格及高精度慣性導航系統的市場情況進行概覽。IMU傳感器作為慣性導航的重要組成部分,其價格水平受到技術、需求和供應商競爭等多重因素的影響。隨著無人機、自動駕駛車輛等新興應用場景的興起,IMU傳感器的市場需求逐漸攀升。這不僅帶動…

3-9〔OSCP ? 研記〕? WEB應用攻擊?利用REST API提權

鄭重聲明: 本文所有安全知識與技術,僅用于探討、研究及學習,嚴禁用于違反國家法律法規的非法活動。對于因不當使用相關內容造成的任何損失或法律責任,本人不承擔任何責任。 如需轉載,請注明出處且不得用于商業盈利。 …

UE5 基礎應用 —— 07 - 角色藍圖 簡單使用

目錄 一、角色藍圖 1.1 Pawn / Character 1.2 角色基類 1.3 角色基類設置 1.3.1 基礎設置 1.3.2 角色移動和相機旋轉 1.3.3 角色移動 —— 鎖定視角 1.3.4 角色跳躍 1.4 角色派生類設置 1.4.1 添加動畫藍圖 一、角色藍圖 1.1 Pawn / Character Pawn / Character 有什…

流暢的Python(二) 豐富的序列

流暢的Python 第二章:豐富的序列 摘要:在日常Python開發中,我們頻繁與各種數據結構打交道,其中序列類型(如列表、元組、字符串)是基石。然而,你是否曾因對它們理解不深,而在性能優化…