PF 驱动是一个专门管理SR-IOV设备全局功能驱动,而且还要配置相关共享资源。PF 驱动 随着Hypervisor 的不同而不同,一般需要具有比普通虚拟机更高的权限才能对其进行操作。PF驱动包含了所有传统驱动的功能,使得Hypervisor能够访问设备I/O资源。也可以通过调用PF驱动执行相关操作从而影响整个设备。PF驱动必须在VF驱动之前加载,而且需要等VF驱动卸载之后才能卸载。

     
     Intel SR-IOV 驱动包含了所有 Intel 以太网卡的功能,并且还有下面使用SR-IOV时拥有的特殊功能:
     ·给每个VF生成一个MAC 地址
     ·通过信箱系统与VF驱动通信:
          ·通过VF驱动配置VLAN过滤器
          ·通过VF驱动配置多播地址
          ·通过VF驱动配置最大包长
          ·处理VF驱动资源复位请求
 
 
Virutal Function Driver
 
     标准设备驱动(驱动不会意识到自己所处的虚拟化环境)期望获知如何控制设备和设备是如何工作的。在虚拟化环境下,一个标准的驱动一般与一个软件间接层进行交互,这个软件间接层模拟了底层的物理硬件设备。大多数情况下,该驱动不会意识到这个间接层的存在。
 
     通过直接赋值,我们期望改变本地共享设备的功能。VF 接口并没有包含完整的PCIe控制功能,而且一般不能直接控制共享设备和资源,比如设置以太网连接速率。这时候有必要告知VF 驱动,使其意识到自己所处的虚拟环境。当VF驱动意识到自己所处的虚拟化环境之后,就能够直接与硬件进行数据交互。同时这些VF驱动也能够知道这些设备都是共享设备,依赖于PF驱动提供的服务来进行操作,这些操作都具有全局效果,比如初始化和下一级结构的控制。
 
PF Driver - VF Driver Communication
 
     设备共享需要一个功能就是VF驱动与PF驱动通信,这样VF驱动就能够请求具有全局功能的操作。这个信道需要具有传递信息和产生中断的能力。
 
     SR-IOV标准并没有定义这条通信线路的实现机制。Intel 选择了通过使用一系列硬件信箱和门铃寄存器来为每个VF实现这个通信信道。
     
     Intel选择使用一件信箱的根本原因是为了确保实现一个独立于Hypervisor且持久可靠的通信机制。然而, 基于软件的信道也能够用来实现该通信功能,这个功能需要由Hypervisor子系统提供。这些信道的实现各个生产商并不相同,需要客户自己启动这些支持。硬件信道则不同,总是能够工作,除非被Hypervisor禁用。现在看来,并不是所用Hypervisor生产商都提供基于软件的消息机制,因此Intel 相关度去哦那个提供了利用硬件信道的API。
 
 
Example Receive Flow
 
     一个包是如何被一个虚拟机接收和发送的:

 
第一、二步:包到达,被送往L2 进行分类和交换
第三步:       根据目的MAC地址进行分类,这时候,改包与 缓冲池1匹配
第四步:       网卡发起DMA操作,将一个包传递给一个VM
第五步:       DMA操作到达Intel 芯片集,在这里VT-d(由Hypervisor 配置)进行DMA操作所需的地址翻译;结果使得该包     
                    被直接送入到虚拟机的VF驱动缓冲里面
第六步:       网卡发起了MSI-X中断,表明该接收操作已经完成。该中断由Hypervisor接收。
第七步:       Hypervisor向虚拟机注入一个虚拟中断表明传输已经结束,这时候虚拟机的VF驱动就开始处理该包。
 
 
Mailbox Communication System
 
     有时候VF驱动必须与PF驱动通信,以便完成一些工作,这些工作在VF提供的PCI资源基础上是无法完成的。
     
     例如:当VF驱动想要定义一个VLAN过滤器。这个功能在VF中并没有暴露,因此VF驱动也不能直接配置VLAN过滤器。
 
     VF驱动能够代替VF 向PF驱动发起这种类型的配置请求。
 

 
 
Virtual Function Mailbox
 
     当一个虚拟机获得访问VF的权限后,VF 资源中的信箱功能就会暴露给该虚拟机。这个功能相当简单,这是一系列的缓冲区,可以从这些缓冲区中读取或者写入信息,并增加一个寄存器(VFMailbox)用于提供PF和VF之间的同步功能。
 
      
     VF和PF都可以访问该缓冲区,可以通过这个缓冲区来传递信息。因为信箱缓冲和VFMailbox寄存器是VF资源的一部分,因此这些资源对于特定的VF来说是独占的。这意味着针对特定VF的VF驱动不能对分配给其他虚拟机的信箱进行写入。
 
     更多的关于信箱缓冲的信息可以参见:Intel ®82559 10Gigabit Ethernet Controller Datasheet。
 
 
Physical Function Mailbox
     
     PF 驱动能够访问所有的VF信箱,通过VF信箱的信箱内(VFMBMEM:VF Mailbox Mailbox Memory)存和PF信箱(Physical Function Mailbox)寄存器阵列.
     

     当一个VF驱动向VFMBMEM缓冲写入信息并在VFMailbox寄存器中设置适当的比特位之后,就向给PF产生一个中断。PF驱动获取这些信息,并给予这条消息进行回复。
 
     这时候,PF驱动会使用信箱发送一个异步消息给VF,这就是IXGBE_PF_CONTORL_MSG 消息。
 
 
Virtual Function Driver
     
     Intel VF驱动实例代码是标准 Intel ixgbe 10 Gigabit Ethernet 驱动的一个修改后的版本。通过设备ID来加载。Intel VF有一个设备ID表明它们是一个VF, 这样祥光的驱动就可以被加载。
 
     Intel VF 驱动可以被分割为三个部分:
     ·操作系统界面——虚拟机操作系统可以通过该界面调用各种API
     ·I/O操作——使用SR-IOV 功能来进行I/O操作,而避免Hypervisor的干预
     ·配置任务——配置像VLAN过滤器等需要与PF驱动进行通信的任务
 
注:PF & VF 有时候只实际的PCIe 物理功能模块,有时候就是泛指,注意区别

高性能网络 SR-IOV机制--VF与PF的通信的更多相关文章

  1. 可靠通信的保障 —— 使用ACK机制发送自定义信息——ESFramework 通信框架4.0 快速上手(12)

    使用ESPlus.Application.CustomizeInfo.Passive.ICustomizeInfoOutter接口的Send方法,我们已经可以给服务端或其它在线客户端发送自定义信息了, ...

  2. Android中的常见通信机制和Linux中的通信机制

    Handler Handler是Android系统中的一种消息传递机制,起作用是应对多线程场景.将A进程的消息传递给B线程,实现异步消息处理.很多情况是将工作线程中需要更新UI的操作消息传递给UI主线 ...

  3. java之等待唤醒机制(线程之间的通信)

    线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同.比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消 ...

  4. java-等待唤醒机制(线程中的通信)-线程池

    为什么需要线程间的通信 多个线程并发执行时,在默认情况下CPU时随机切换线程的,当我们需要多个线程共同完成一件任务,并且 希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共 ...

  5. android学习-IPC机制之ACtivity绑定Service通信

    bindService获得Service的binder对象对服务进行操作 Binder通信过程类似于TCP/IP服务连接过程binder四大架构Server(服务器),Client(客户端),Serv ...

  6. HTTPS协议机制

    转载:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html 一.作用 不使用SSL/TLS的HTTP通信,就是不加密的通信.所有信息明文传播,带来了三 ...

  7. SSL/TLS协议运行机制的概述

    互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...

  8. SSL/TLS协议运行机制

      转载自http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html 互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行 ...

  9. 【转】SSL/TLS协议运行机制的概述

    互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...

随机推荐

  1. apache编译安装参数说明

    apache编译安装参数说明 ./configure //配置源代码树--prefix=/usr/local/apache2 //体系无关文件的顶级安装目录prefix ,也就apache的安装目录. ...

  2. rsync命令解释

    -v, --verbose 详细模式输出-q, --quiet 精简输出模式-c, --checksum 打开校验开关,强制对文件传输进行校验-a, --archive 归档模式,表示以递归方式传输文 ...

  3. MySQL数据库中实现对中文字段按照首字字母排序

    转载自网络! 1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都存在. 如果这个问题不解决, ...

  4. PyCharm运行Nosetests并导出测试报告

    1. Pycharm运行Nosetests PyCharm可以使用两种方法,运行Nosetests测试文件: 1) 图形用户界面GUI a) 在PyCharm中,选中测试文件,如Tests/test_ ...

  5. bootstrap---treeview使用方法

    1.html部分: <div id="tree"></div> 2.css设置展开/收缩按钮图片: .tree_arrows_down:before{ co ...

  6. Selenium UI自动化解决iframe定位问题

      更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...

  7. ABP官方文档翻译 2.3 缓存

    缓存 介绍 ICacheManager 警告:GetCache方法 ICache ITypedCache 配置 实体缓存 实体缓存如何工作 Redis缓存集成 介绍 ABP为缓存提供了一个抽象接口,它 ...

  8. 2017年总结的前端文章——一劳永逸的搞定 flex 布局

    flex 基本概念 使用 flex 布局首先要设置父容器 display: flex,然后再设置 justify-content: center 实现水平居中,最后设置 align-items: ce ...

  9. Appium的iOS环境搭建

    操作系统的名称:Mac OS X操作系统的版本:10.13.3 xcode 版本:9.2 java 版本:java8_161 appium destop版本:1.7.3 接下来我们开始踏上搭建Appi ...

  10. springMvc+swagger整合例子

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集成到服 ...