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. 八大排序算法Java实现

    本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...

  2. Bom部分

    Bom部分  browser object model(浏览器对象模型)将浏览器中的各个组件封装成对象,我们可以使用这些对象来操作浏览器的一些动作.封装的规则基于ECMAScriptBom的组成--— ...

  3. absort函数和exit函数

    1. exit()函数会结束并退出程序. 1. abosrt()函数会触发程序的异常,然后程序后面的语句就不会执行了.用来提示错误.会出现:  

  4. svn一整套使用,从下载到整个服务器搭建完成的详细说明

    SVN服务器的本地搭建和使用 Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

  5. java之静态代理和动态代理

    我们以几个问题,来开始我们今天的学习,如果下面几个问题,你都能说出个一二,那么恭喜你,你已经掌握了这方面的知识.1,什么是代理模式?2,Java中,静态代理与动态代理的区别?3,Spring使用的是J ...

  6. iOS-CYLTabBarController【好用的TabbarController】

    用TabbarController进行模块分类和管理,这里推荐一个CYLTabBarController,只需两个数组就可以使用和管理: 1.导入CYLTabBarController 使用cocoa ...

  7. 在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?

    在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在Oracle 12c之前,当Oracle表数据量上亿时,对表执行“ALTER TABLE XXX ADD COLUMN_XX VA ...

  8. Python基础篇(二)

    Python最基本的数据结构是序列(sequence),序列中的每个元素被分以以0开头的唯一的一个id号. Python中有6种内建的序列:列表,元组,字符串,Unicode字符串,buffer对象和 ...

  9. POJ 2826 An Easy Problem?![线段]

    An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12970   Accepted: 199 ...

  10. linux使用i/o内存访问外设

    一.linux中访问外设的方法. 1.IO端口(IO port) linux系统给外设分配不同的端口号,linux利用端口号来访问设备(驱动) (cpu x86) cpu访问外设通过端号,访问通过地址 ...