深入理解SR-IOV和IO虚拟化

news2024/11/26 12:22:43

一、背景

SR-IOV(Single Root I/O Virtualization)是由PCI-SIG组织定义的PCIe规范的扩展规范《Single Root I/O Virtualization and Sharing Specification》,目的是通过提供一种标准规范,为VM(虚拟机)提供独立的内存空间、中断、DMA数据流,当前最新版本为1.1。

图1.1

IO虚拟化有软件模拟、基于virtio的半虚拟化和设备直通三种方式,见图1.1,其中设备直通实现了数据面加速,允许物理PCIe设备可以直接访问虚拟机的GuestOS中运行相应驱动分配的物理地址(GPA)。

SR-IOV的出现,支持了单个物理PCIe设备虚拟出多个虚拟PCIe设备,然后将虚拟PCIe设备直通到各虚拟机,以实现单个物理PCIe设备支撑多虚拟机的应用场景,如图1.2。

图1.2

学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

二、SR-IOV原理

2.1 硬件实现

2.1.1 SR-IOV基本结构

SR-IOV是在PCIe规范的基础上实现的,SR-IOV协议引入了两种类型功能的概念:物理功能 (Physical Function, PF)和虚拟功能 (Virtual Function, VF),基本结构见图2.1.1。

图2.1.1

PF用于支持 SR-IOV 功能的 PCI 功能,如 SR-IOV 规范中定义,PF 包含 SR-IOV 功能配置结构体,用于管理 SR-IOV 功能。PF 是全功能的 PCIe 功能,可以像其他任何 PCIe 设备一样进行发现、管理和处理。PF 拥有完全配置资源,可以用于配置或控制 PCIe 设备。

VF是与PF关联的一种功能,是一种轻量级 PCIe 功能,可以与物理功能以及与同一物理功能关联的其他 VF 共享一个或多个物理资源。VF 仅允许拥有用于其自身行为的配置资源。

2.1.2 VF的BAR空间资源

VF的BAR空间是PF的BAR空间资源中规划的一部分,VF不支持IO空间,所以VF的BAR空间也需要映射到系统内存,VF的BAR空间的物理资源排布如图2.1.2:

图2.1.2

2.1.3 PF的SR-IOV Extended Capabilities 配置

PF的PCIe扩展配置空间 SR-IOV Extended Capability支持对SR-IOV功能进行配置,如图2.1.3:

图2.1.3

其中SR-IOV Control 字段的bit0位是SR-IOV的使能位,默认为0,表示关闭,如果需要开启SR-IOV功能,需要配置为1。

TotalVFs字段表示PCIe Device支持VF的数量。

NumVFs字段表示开启VF的数量,此值不应超过PCIe Device支持的VF的数量TotalVFs的值。

First VF Offset字段表示第一个各VF相对PF的Routing ID(即Bus number、Device number、Function number)的偏移量。

VF Stride字段表示相邻两个VF的Routing ID的偏移量。

其他字段含义详见《Single Root I/O Virtualization and Sharing Specification Revision 1.1》。

2.2 软件支持

Linux系统下,基于SR-IOV有三种应用场景:HostOS使用PF、HOstOS使用VF、将VF直通到VM(虚拟机),见图2.2.1:

图2.2.1

Linux系统中PCI驱动框架drivers/pci/iov.c提供了一系列对SR-IOV Extended Capability的配置接口函数,PCIe Device需要有相应的PF驱动和VF驱动,PF驱动支持配置SR-IOV,VF驱动需要实现相应的PCIe Device的业务功能(例如NIC或GPU),VFIO中的vfio-pic是一个简易符合VFIO框架PCIe驱动。

三、基于SR-IOV的IO虚拟化

3.1 基于QEMU/KVM的PCIe设备直通框架

在QEMU/KVM的虚拟化架构下,PCIe设备直通的软硬件系统架构由下往上有如下几部分(见图3.1):

l PCIe Device(支持SR-IOV功能)
l IOMMU
l VFIO
l Hypervisor(QEMU/KVM)

l VF Driver(运行在GuestOS中)

图3

3.1.1 IOMMU

IOMMU(I/O Memory Management Unit)是一个内存管理单元,主要针对外设访问系统内存市进行内存管理,像intel VT-d、AMD的IOMMU及ARM的SMMU都具有相同功能。IOMMU支持PCIe Device虚拟化的两个基础功能:地址重映射中断重映射

3.1.1.1 DMA物理地址重映射

(DMA Remapping )

1)地址空间隔离

在没有iommu的时候,用户态驱动可以通过设备dma可以访问到机器的全部的地址空间,如何保护机器物理内存区对于用户态驱动框架设计带来挑战。引入iommu以后,iommu通过控制每个设备dma地址到实际物理地址的映射转换,可以实现地址空间上的隔离,使设备只能访问规定的内存区域,见图3.1.1.1.1。

图3.1.1.1.1

2)GPA(虚拟机物理地址) --> HPA(宿主机物理地址)

物理PCI设备通过直通的方式进入到虚拟机的客户机时,客户机设备驱动使用透传设备的DMA访问虚拟机内存物理地址时,IOMMU会进行 GPA-->HPA的转换,详细转换细节在下一章节分析。

3.1.1.2 中断重映射

以Intel VT-d为例,提出了两个机制支持中断重映射:

引入两种中断请求格式

兼容模式和重映射模式,Bit4位为0来表征为不可重映射中断,Bit4位为

1来表征为可重映射中断,见图3.1.1.2.1和图3.1.1.2.2。

图3.1.1.2.1

图3.1.1.2.2

引入Interrupt Remapping Table Entry (IRTE)

Interrupt Remapping Table Entry是一个二级表,需要先通过Interrupt Remapping Table Address Register来找到Interrupt Remapping Table Entry所在的地址,Interrupt Remapping Table Entry的格式如图3.1.1.2.3:

图3.1.1.2.3

IOMMU中断重映射的实质是将来自PCIe设备的中断(包括来自IOAPIC和PCIe设备的MSI/MSI-X等)拦截下来判断是否为重映射中断,如果是重映射中断会通过查询中断映射表(Interrupt Remapping Table Entry)找到真正的中断路由信息然后发送给物理CPU。

3.1.2 VFIO

VFIO(Virtual Function I/O)是基于IOMMU为HostOS的用户空间暴露PCIe设备的配置空间和DMA。VFIO的组成主要有以下及部分,见图3.1.2.1:

图3.1.2.1

l VFIO Interface:

VFIO通过设备文件向用户空间提供统一访问接口:

• Container文件描述符:打开/dev/vfio字符设备可得

• IOMMU group文件描述符:打开/dev/vfio/N文件可得

• Device文件描述符:向IOMMU group文件描述符发起相关ioctl可得

l vfio_iommu_type1_driver:

为VFIO提供了IOMMU重映射驱动,向用户空间暴露DMA操作。

l vfio-pci:

vfio支持pci设备直通时以vfio-pci作为pci设备驱动挂载到pci总线, 将pci设备io配置空间、中断暴露到用户空间。

3.1.3 QEMU/KVM PCI设备直通

QEMU/KVM 的PCI设备直通QEMU的核心工作主要有两部分:

1) 读取PCIe设备信息

通过VFIO接口读取PCIe设备的配置空间和DMA信息,

2) 为虚拟机创建虚拟PCIe设备

为虚拟机创建虚拟PCIe设备,虚拟PCIe设备的寄存器规划和DMA信息是物理PCIe设备在虚拟机中的映射。

QEMU中PCI设备直通时vfio-pci注册流程见图3.1.3.1:

图3.1.3.1

QEMU中PCI设备直通时vfio-pci初始化流程见图3.1.3.2:

图3.1.3.2

3.2 PCI设备直通数据面加速

PCI设备直通时,GuestOS中的设备驱动操作虚拟PCI设备的DMA时,QEMU会将上述操作通过VFIO接口下发给物理PCI设备的DMA,物理设备DMA收到GuestOS中的物理地址GPA,通过IOMMU的映射,找到Host主机物理内存的物理地址HPA,达到物理PCI设备直接访问GuestOS中的GPA,从而达到数据数据面加速。

3.2.1 GPA->HPA的映射过程

对于直通的设备,QEMU创建虚拟机时需要两方面的地址映射,见图3.2.1.1:

1)VM在创建时GuestOS的内存需要QEMU调用KVM最终通过EPT和MMU建立GVA->GPA->HPA的映射;

2)QEMU进行VM的虚拟PCI设备初始化时,会将HVA和GPA下发给IOMMU,

让IOMMU建立GPA到HPA的映射关系。

当GuestOS中直通设备的驱动分配内存并配置DMA时,QEMU通过VFIO接口将GPA下发到PCI Device的DMA,DMA读取数据时经由IOMMU映射,找到相应的HPA。

【推荐阅读】

浅谈虚拟地址转换成物理地址(值得收藏)

一文了解Linux上TCP的几个内核参数调优

一文剖析Linux内核中内存管理

分析linux启动内核源码

关于如何快速学好,学懂Linux内核。内含学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot+vue职称评审管理系统

开发语言:Java 框架:Springbootssm(SpringSpringMVCMyBatis) JDK版本:JDK1.8 前端框架:vue.js 服务器:tomcat 数据库:mysql 数据库工具:Navicat11 开发软件:eclipse/idea都支持 Mave…

前端页面的性能测试

介绍 随着 Web 应用的空前发展,前端业务逐渐复杂,为了处理这些复杂业务,前后端分离,出现了专门应对这种分离架构的应用开发框架,比如 Angular,React,Vue 等,从而也导致 Web 应用的复…

高效率开发Web安全扫描器之路(一)

一、背景 经常看到一些SRC和CNVD上厉害的大佬提交了很多的漏洞,一直好奇它们怎么能挖到这么多漏洞,开始还以为它们不上班除了睡觉就挖漏洞,后来有机会认识了一些大佬,发现它们大部分漏洞其实是通过工具挖掘的,比如说下…

linux服务器监控性能测试

一、服务器实时内存监控 1、top:能够实时监控系统的运行状态,并且可以按照cpu以及内存等进行排序。 输入:top -help就可以出现下面的例子: 命令例子:top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o fiel…

计算机网络——分层结构,协议接口,服务

分层结构 主机进行资源共享时需满足以下条件: (1)发起通信的计算机要将数据通路进行激活 (2)告诉网络如何识别主机 (3)发起通信的主机要查明目的主机是否开机等 (4)发起…

Java 中你绝对没用过的一个关键字?

这节课给大家介绍一个 Java 中的一个关键字 Record,那 Record 关键字跟不可变类有什么关系呢?看完今天的文章你就知道了。友情提示 Record 关键字在 Java14 过后才支持的,所以是不是被我说中了,还在使用 Java 8 的你一定没用过&am…

vpp hqos分析

vpp支持两套qos实现,一套是基于policer实现的qos,另外一套是基于dpdk的qos套件实现的hqos。 (免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂 更多DPDK相关学习资料有…

DPU网络开发SDK——DPDK(一)

随着软件定义网络SDN的不断发展,网络数据转发面的需求越来越多样化,这体现在更快的数据包处理速率,更高的网络吞吐带宽,更灵活的自定义网络协议。传统的硬件设备无法满足网络协议的自定义,而基于Linux内核网络协议栈的…

故障电弧探测器的必要性及组网方案 安科瑞 时丽花

摘要】:电气设备是建筑中不可缺少的一部分,具有较为重要的作用和意义,在应用过程中不仅能够提升建筑本身实用性能,而且可为消费者提供更加优良的生活环境。但设备一旦在运行过程中出现故障,不仅会影响居民正常生活&…

艾美捷细胞失巢凋亡检测试剂盒测定原理化验方案

对细胞外基质(ECM)的粘附对于许多粘附细胞的生存和繁殖至关重要细胞。细胞与ECM的粘附丧失或不当粘附导致的细胞凋亡定义为“anoikis”。Anoikis,来自希腊语无家可归的意思,与生理学有关组织更新和细胞稳态的过程。 癌症发展和生长…

做测试8年,33岁前只想追求大厂高薪,今年只求稳定收入

疫情3年,每一个行业的危机,每一个企业的倒下,背后都是无数人的降薪、降职和失业。这也暴露了人生的残酷真相:人活一辈子,总有“丰年”和“荒年” 优秀的测试既过得了丰年,也受得住荒年 一个测试宝妈&…

冒烟测试的7个好处,你是否经常用到它?

以下为作者观点: 冒烟测试(smoke testing)是在开发的早期阶段评估基本的软件组件,以检查它们是否 “着火”(有问题),本文旨在介绍冒烟测试及其在程序开发过程中的作用。 什么是冒烟测试? 冒烟测试是在开…

Linux文件权限

Linux文件权限 文件权限介绍 Linux文件权限有三种: 权限对应字符可读(read)r可写(write)w可执行(execute)x 文件权限身份也有三种: 权限身份对应字符文件所有者(user)u文件所有者所在组(group)g其他(other),即除了文件所有者和其所在组的…

简明误差卡尔曼滤波器(ESKF)及其推导过程

文章目录1. 简明ESKF简介ESKF基本过程及优点ESKF参数含义连续时间上的 ESKF状态方程误差状态方程推导误差状态的旋转项误差状态的速度项完整误差变量的运动学方程离散时间上的ESKF运动学方程ESKF的运动过程ESKF的更新过程ESKF的误差状态后续处理小结1. 简明ESKF 简介 本文主要…

电商新趋势:Starday拿下黑色星期五的制胜法宝是物流速度

国内电商“双十一”购物狂欢季活动已经闭幕,“双十二”又将袭来,但更多人却将眼光放在蓬勃发展的跨境电商行业中。当下跨境电商卖家们正在各大跨境电商服务平台的带领下全力备战,在“黑色星期五”期间推出各类大促活动,奋力冲刺20…

灌区量测水监测系统解决方案 灌区量测水系统解决方案 农业水价综合改革解决方案

平升电子灌区量测水监测系统解决方案/灌区量测水系统解决方案/农业水价综合改革解决方案,对灌区的渠道水位、流量、水雨情、土壤墒情、气象等信息进行监测,同时对泵站、闸门进行远程控制,对重点区域进行视频监控,实现了信息的采集…

网络面试知识

客户端与服务端的网络通信 bind函数 把一个本地协议地址和套接口绑定,比如把本机的2222端口绑定到套接口。注意:为什么在上图中客户端不需要调用bind函数?这是因为如果没有调用bind函数绑定一个端口的话,当调用connect函数时&…

Kotlin高仿微信-第18篇-单聊-删除单条信息

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

FRED应用:激光二极管的模拟

简介 当提及模拟激光二极管时,FRED软件具有极大的灵活性。在这篇应用笔记中,将会描述简单到详细的激光光源模型。最基本的模型是高斯TEM0,0模。更高级的模型包括在束腰上偏移和发散中的像散光束。激光也可以使用其M2因子表示。最后,可以创…

【TeamViewer丨远程控制软件】上海道宁助您远程访问和即时远程支持,提高远程工作团队的生产力

TeamViewer是 全面的远程访问、远程控制 及远程支持解决方案 几乎适用于所有桌面和移动平台 包括Windows、macOS、Android及iOS 开发商介绍 TeamViewer诞生于2005年,办公地点遍布全球12个国家或地区,以基于云的技术为核心,致力于在全球…