一、概述

 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开发中,我们频繁与各种数据结构打交道,其中序列类型(如列表、元组、字符串)是基石。然而,你是否曾因对它们理解不深,而在性能优化…