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. HTML学习——标签

    1.</hr>效果: 2.<q>简短文本引用, <blockquote>长文本引用, 表象:为文本添加一个双引号,实:一个语义,引用别人的话语. 3.&nb ...

  2. MySql-5.7.17-20解压缩版安装配置

    MySql-5.7.XXX解压缩版安装配置   1.mysql-5.7.20是解压版免安装的,版本下载地址:http://dev.mysql.com/downloads/mysql/ 如下图 2.解压 ...

  3. docker命令行学习

    docker命令行学习 docker run docker run --help:老实说这条最管用了 docker run -it:交互模式,允许控制台输出 docker run -d:detach, ...

  4. Spring MVC的DispatcherServlet

    Spring MVC提供了一个名为org.springframework.web.servlet.DispatcherServlet的Selvet充当前端控制器,所有的请求驱动都围绕这个Dispatc ...

  5. MonogoDB 查询小结

    MonogoDB是一种NoSQL数据库 优点: 1.数据的存储以json的文档进行存储(面向文档存储) 2.聚合框架查询速度快 3.高效存储二进制大对象 缺点: 1.不支持事务 2.文件存储空间占用过 ...

  6. 使用webpack、babel、react、antdesign配置单页面应用开发环境

    这是Webpack+React系列配置过程记录的第一篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  7. HDU [P2819] swap

    二分图行列匹配+输出路径 经典题,当且仅当一行匹配一列的时候,符合题意. 本题的难点在于如何输出路径,我们发现这个移动的过程就是将所有匹配选择排序,在选择排序时输出路径即可 #include < ...

  8. BZOJ 2683: 简单题 [CDQ分治]

    同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...

  9. 【转】 C/C++程序员必须熟练应用的开源项目

    作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应 ...

  10. ASM字节码框架学习之动态代理

    ASM字节码操纵框架,可以直接以二进制的形式来来修改已经存在的类或者创建新的类.ASM封装了操作字节码的大部分细节,并提供了非常方便的接口来对字节码进行操作.ASM框架是全功能的,使用ASM字节码框架 ...