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

news/2024/4/26 19:10:54/文章来源:https://blog.csdn.net/m0_74282605/article/details/128114108

一、背景

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.luyixian.cn/news_show_39169.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ProcessDB实时/时序数据库——ODBC之连接数据库

目录 前言 一、安装ProcessDB-ODBC驱动 1.下载ProcessDB-ODBC驱动 2.安装ProcessDB-ODBC驱动 二、配置ProcessDB数据源 三、JAVA连接ProcessDB数据库 前言 ProcessDB实时/时序数据库支持ODBC连接数据库,接下来将和大家分享下如何使用ODBC操作ProcessDB实时/时…

基于Java Web的传智播客crm企业管理系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

tinymce富文本编辑器做评论区

今天分享一下tinymce富文本编辑器做评论区的全过程。 文章目录一、介绍1.最终效果2.功能介绍3.主要项目包版本介绍:二、每个功能的实现1.自定义toolbar的功能区①对应的样式以及意义②对应的代码实现【忽略了一切非实现该功能的代码】2.展示、收起评论区①对应的样式…

软件测试面试技巧:如何提高面试通过率?这3点一定要做到

对于想要进入到软件测试岗的新手人员来说,面试这一关是非常重要的,它直接关系着你的去留,也关系后续的期待遇问题,那么,有没有什么技巧可以帮忙提高面试通过率呢? 关于这一问题答案,我从这几个方…

Java自动化测试调试中遇到的问题

前言:记录下遇到的问题 Java自动化测试在调试中遇到的问题总结 1、遇到的Waring:must be unique [WARNING] dependencies.dependency.(groupId:artifactId:type:classifier) must be unique: com.vertica.jdbc:vertica-jdbc:jar -> duplicate declaration of version 10.…

数商云供应链管理系统助力化工行业企业实现客户订单管理可视化

订单管理是现代企业商务业务的重要组成部分,可以帮助企业解决订单管理低效、混乱等问题。随着产业互联网时代的到来,越来越多企业放弃传统费时费力的手动操作,开始应用数字化的管理工具来提高企业订单管理的水平。这里以化工行业企业为例&…

RabbitMQ 快速入门七种简单模式

RabbitMQ 快速入门七种简单模式起步七种模式项目依赖1、"Hello World!"(1) Connection 方式(2) RabbitTemplate 方式2、Work Queues生产者消费者3、Publish/Subscribe关系绑定生产者消费者4、Routing消费者生产者5. Topics消费者生产者6、RPC7、Publisher Confirms起…

09 更真实的云原生:Kubeadm实际搭建多节点的Kubernetes集群

文章目录1. 前言2. 什么是 kubeadm?2.1 kubeadm 介绍2.2 kubeadm 原理3. kubeadm 实验环境的架构是什么样的?3.1 Master 节点3.2 Worker 节点3.3 辅助节点3.4 安装前的准备工作3.4.1 修改主机名3.4.2 修改 Docker 配置3.4.3 修改网络设置3.4.4 修改交换分区4. 安装…

Android -- 每日一问:如何理解 Android 中的 Context,它有什么用?

经典回答 官方文档对于 Context 的解释: Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and cla…

Anaconda、Conda、pip、Virtualenv的区别

一、Anaconda 1.1 简介 Anaconda是一个包含180的科学包及其依赖项的发行版本。其包含的科学包包括:conda, numpy, scipy, ipython notebook等。 二、Conda 2.1 简述 conda是包及其依赖项和环境的管理工具。 适用语言:Python, R, Ruby, Lua, Scala, …

iOS 图标和文字自定按钮

在项目开发中,经常需要用到按钮,系统默认的按钮是图标在左边,标题在右边。但往往实际情况是多变的,有时候图标在右边、有时候图标在上面,这个时候系统的按钮往往无法满足需求,所以我们需要自定义按钮来满足…

装在笔记本里的私有云环境:K8s 集群准备

本篇是系列中的第六篇内容,继续聊聊如何把一个简化过的私有云环境部署在笔记本里,以满足低成本、低功耗、低延时的实验环境。 在前几篇内容中,我们聊过了:虚拟化、监控、基础的存储、持续集成等内容,接下来的内容中&a…

Javaweb的AJAX及Axios框架使用(封装AJAX)

概念: AJAX(Asynchronous JavaScript And XML):异步的JS和XML。 作用: 与服务器进行数据交换 :通过AJAX可以给服务器发送请求。使用AJAX和服务器进行通信,就可以使用HTMLAJAX来替换JSP页面。异步交互 :可以在不重新加载整个页面的情况下,与服务器交互…

自己搭建网站【搭建网站】

现在搭建网站也不只是企业公司商家的专利,很多个人用户都想拥有属于自己的一个网站。那么怎么自己搭建网站呢?下面给大家简单说说。 一、申请域名 域名是访问网站的地址,这是必须要有的,可以在域名服务商网站上申请。申请域名需要…

jupyter中配置多种虚拟环境

Microsoft Windows [版本 10.0.19044.2251] © Microsoft Corporation。保留所有权利。 C:\Users\ThinkStation>conda activate pytorch(pytorch) C:\Users\ThinkStation>conda install ipykernelCollecting package metadata (current_repodata.json): done Solvin…

机械硬盘HDD

硬盘(英语:Hard Disk Drive,缩写:HDD,有时为了与固态硬盘相区分称“机械硬盘”或“传统硬盘”)是电脑上使用坚硬的旋转盘片为基础的非易失性存储器,它在平整的磁性表面存储和检索数字数据&#…

【强化学习论文合集 | 2020年合集】一. ICML-2020 强化学习论文

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

SpringCloud_第1章_入门到精通()

SpringCloud_第1章_入门到精通 文章目录SpringCloud_第1章_入门到精通1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程2.3.实现远程调用案例2…

间隔不到一年开两店,温州鸿雁全屋智能经销商透露了他的生意经

作者 | 牧之 编辑 | 小沐 出品 | 智哪儿 zhinaer.cn编者按:间隔不到一年,连续开设了两家全屋智能体验店。这是发生在温州的渠道商故事。本期专访,「智哪儿」对话浙江林上智能科技有限公司总经理朱飞隆先生。他为何做智能家居?为何…

History、Location

History、Location 学习路线:JavaScript_BOM->Window对象->confirm()、setInterval()、setTimeout()->History、Location->闪烁的灯泡 History History 对象是 JavaScript 对历史记录进行封装的对象。 History 对象的获取 使用 window.history获取&a…