X86体系早期没有在硬件设计上对虚拟化提供支持,因此虚拟化完全通过软件实现。一个典型的做法是通过优先级压缩(Ring Compression)和二进制代码翻译(Binary Translation)相结合,VMM在特权级ring 0, Guest操作系统在非特权级ring 1, Guest应用程序在ring 3。 由于Guest操作系统工作在非特权级ring 1中,这样当它执行特权指令时就会触发异常,由VMM截获异常并采用软件方式模拟指令并返回。 但由于X86体系在设计之初没有考虑虚拟化,所以一小部分特权指令在ring 1下没有引发异常,所以需要对操作系统的二进制代码进行扫描,一旦发现不友好的指令,将就其换成支持虚拟化的指令块,这些指令块与VMM合作访问受限的虚拟资源,或者显式地触发异常让VMM进一步处理。这种打补丁的方式很难在构架上保证其完整性。于是,下层的硬件加入了虚拟化功能,硬件截获操作系统对敏感指令的执行或者对敏感资源的访问后通过异常的方式报告给VMM,这样就解决了虚拟化的问题。Intel VTx技术是这一方向的代表,它引入了一个新的特殊执行模式用于运行虚拟机,这个模式会将特权指令统统截取并报告给VMM,VMM本身工作在正常模式下,在接收到处理的报告后,通过对目标指令的解码,找到相应的虚拟化模块进行模拟。

对于内存的虚拟化则需要用硬件实现从GVA(Guest Virtual Address)到GPA(Guest Physical Address)再到HPA(Host Physical Address)的两次地址转换。传统非虚拟化的操作系统只通过硬件MMU完成一次从GVA到GPA的虚拟化。

I/O的虚拟化方面,VTd技术在北桥引入DMA重映射硬件来提供设备重映射和设备直接分配的功能。设备所有的DMA传输都会被DMA重映射硬件截取,然后根据设备对应的I/O页表,对DMA中的地址进行转换,使设备只能访问特定的内存。这样,设备就可以直接分配给Guest机使用,驱动提供给设备的GPA经过重映射,变为HPA,使得DMA操作得以完成。

在网络虚拟化方面,VTd技术可以将一个物理网卡直接分配给一个虚机使用,但扩展性差,因为一台服务支持的PCI设备数是有限的,远远不能满足越来越来的Guest机数量。因此SRIOV(Single Root I/O Virtualization)被引入来解决这个问题。SRIOV是PCIe(PCI Express)规范的一个扩展,定义了本质上可以共享的设备。它允许一个PCIe设备,通过是网卡,为每个与其相连的客户机复制一份资源(例如内存资源、中断和DMA数据流),使得数据处理不再依赖VMM。

GPU虚拟化方面,如XenGT,它是由Intel在Xen基础上开发的GPU虚拟化开源方案。客户机操作系统不需要任何改动,特权操作会被Xen截获,并且转发到中介(Mediator),中介为每个客户机创建一个GPU上下文(Context),并且在其中模拟特权操作。

1、普通虚拟化

传统的KVM实现中,kvm.ko是内核的一个模块主要用来捕获虚机的是上述的针对CPU、内存MMU的特权指令然后负责模拟,对I/O的模拟则是再通过用户态的Qemu进程模拟的,Qemu负责解释I/O指令流,并通过系统调用让Host操作系统上的驱动去完成真正的I/O操作。这其中用户态与内核态切换了两次,数据也需要复制。

用户态的Qemu在启动Guest操作系统时,可以先通过KVM在用户态的字符接口/dev/kvm获取Guest的地址空间(fd_vm)和KVM本身(fd_kvm),然后通过fd_vm将Guest的物理空间mmap到Qemu进程的虚拟空间(虚机就是一个进程,虚机进程的用户虚拟空间就是Guest的物理空间,映射之后Qemu的虚拟设备就可以很方便的存取Guest地址空间里的数据了),并根据配置信息创建vcpu[N]线程(对虚机来说,虚机进程的线程对应着Guest的处理器),然后Qemu将操作fd_vcpu[N]在自己的进程空间mmap一块KVM的数据结构区域(即下图的shared,包括:Guest的IO信息,如端口号,读写方向,内存地址)。该数据结构用于Qemu和kvm.ko交互,Qemu通过它调用虚拟设备注册的回调函数来模拟设备的行为,并将Guest IO的请求换成系统请求发给Host系统。

图中vm-exit代表处理器进入host模式,执行kvm和Qemu的逻辑。vm-entry代表处理器进入Guest模式,执行整个Guest系统的逻辑。Qemu通过三个文件描述符同kvm.ko交互,然后kvm.ko通过vmcs这个数据结构同处理器交互,最终达到控制Guest系统的效果。其中fd_kvm主要用于Qemu同KVM本身的交互,比如获取KVM的版本号,创建地址空间、vcpu等。fd_vcpu主要用于控制处理器的模式切换,设置进入Guest mode前的处理器状态等等(内存寻址模式,段寄存器、控制寄存器、指令指针等),同时Qemu需要通过fd_vcpu来mmap一块KVM的数据结构区域。fd_vm主要用于Qemu控制Guest的地址空间,向Guest注入虚拟中断等。

2、VirtIO

VirtIO通过共享内存的方式为Guest和Qemu提供了高速的硬盘与网络I/O通道(因为Guest的地址空间早就mmap到Qemu的进程空间)。VirtIO只需要增加VirtIO Driver和VirtIO Device即可直接读写共享内存。如下图,Guest VirtIO驱动通过访问port地址空间向Qemu的VirtIO设备发送IO发起消息。而设备通过读写irqfd或者IOCTL fd_vm将I/O的完成情况通知给Guest的驱动。irqfd和ioeventfd是KVM为用户程序基于内核eventfd机制提供的通知机制,以实现异步的IO处理(这样发起IO请求的vcpu将不会阻塞)。之所以使用PIO而不是MMIO,是因为KVM处理PIO的速度快于MMIO。

3、vhost

VirtIO通过共享内存减小了Guest与Qemu之间数据复制的开销,但Qemu到内核的系统调用还是跑不了。有必要将模拟I/O的逻辑将VirtIO Device挪到内核空间避免系统调用。

vhost在内核态再增加一个vhost-net.ko模块, vhost client与vhost backend通过共享内存(virtqueues, unit socket), 文件描述符(ioeventfds), (中断号)irqfds实现快速交换数据的机制。

4、vhost-user

vhost使用了内核态TCP/IP栈导致从Guest到kvm.ko仍然有一个用户态内核态的切换以及数据的拷贝。一些用户态栈议栈如openonload直接在用户态实现网卡驱动再实现BSD兼容的socket接口供上层应用使用,vhost-user(需要将vhost-backend移到用户态)的共享内存技术用于将这些用户态网络设备(又如snabb switch)和用户态的Guest连接起来

5、DPDK support for vhost-user [3]

DPDK便是一个在用户态可以直接操作物理网卡的库函数,它和vhost-user结合便可以实现类似于snabb switch一样性能强劲的用户态交换机了。2015年6月16日dpdk vhost-user ports特性合并到了ovs社区[1], dpdkvhostuser port将创建unix socket将虚机的virtio-net虚拟网卡的网卡缓冲区共享给物理机上的ovs port设备。

原文链接:https://blog.csdn.net/quqi99/article/details/47321023?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159379937319725219931004%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159379937319725219931004&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_blog_default-2-47321023.pc_v2_rank_blog_default&utm_term=dpdk

DPDK support for vhost-user(十四)相关推荐

  1. 《深入浅出DPDK》读书笔记(十四):DPDK应用篇(DPDK与网络功能虚拟化:NFV、VNF、IVSHMEM、Virtual BRAS“商业案例”)

    Table of Contents DPDK应用篇 DPDK与网络功能虚拟化 157.网络功能虚拟化 13.1.1起源 158.发展 159.OPNFV与DPDK NFV的部署 160.NFV的部署 ...

  2. 《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)

    Table of Contents Open vSwitch(OVS)中的DPDK性能加速 174.虚拟交换机简介 175.OVS简介 176.DPDK加速的OVS 177.OVS的数据通路 178. ...

  3. 《深入浅出DPDK》读书笔记(十六):DPDK应用篇(基于DPDK的存储软件优化:SPDK)

    Table of Contents 基于DPDK的存储软件优化 180.基于以太网的存储系统 181.以太网存储系统的优化 SPDK介绍 182.SPDK介绍 (1)兼容性 (2)性能 183.用户态 ...

  4. SVM 支持向量机算法(Support Vector Machine )【Python机器学习系列(十四)】

    SVM 支持向量机算法(Support Vector Machine )[Python机器学习系列(十四)] 文章目录 1.SVM简介 2. SVM 逻辑推导 2.1 Part1 化简限制条件 2.2 ...

  5. 《深入浅出DPDK》读书笔记(十二):DPDK虚拟化技术篇(半虚拟化Virtio)

    Table of Contents 半虚拟化Virtio 132.Virtio使用场景 133.Virtio规范和原理 11.2.1 设备的配置 1. 设备的初始化 2. 设备的发现 3. 传统模式v ...

  6. 《深入浅出DPDK》读书笔记(十):硬件加速与功能卸载(VLAN、IEEE1588、IP TCP/UDP/SCTP checksum、Tunnel)

    Table of Contents 109.硬件卸载简介 110.网卡硬件卸载功能 111.DPDK软件接口 接收侧: 发送侧: 112.硬件与软件功能实现 113.VLAN硬件卸载 1. 收包时VL ...

  7. 鸟哥的Linux私房菜(基础篇)- 第二十四章、 X Window 配置介绍

    第二十四章. X Window 配置介绍 最近升级日期:2009/08/07 在 Linux 上头的图形介面我们称之为 X Window System,简称为 X 或 X11 罗!为何称之为系统呢?这 ...

  8. 《Linux内核设计与实现》读书笔记(十四)- 块I/O层

    最近太忙,居然过了2个月才更新第十四章.... 主要内容: 块设备简介 内核访问块设备的方法 内核I/O调度程序 1. 块设备简介 I/O设备主要有2类: 字符设备:只能顺序读写设备中的内容,比如 串 ...

  9. [转]Windows Shell 编程 第十四章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988010】...

    第十四章 设计Shell集成应用 有一些工具可以使应用程序更紧密地与Shell和底层系统进行集成.也就是说,用户可以象处理系统文档和程序那样处理你的文档和程序.例如,右击文件来显示可用功能列表等.Wi ...

最新文章

  1. SecureCRT自动化脚本
  2. matlab温度数据怎么滤波_卡尔曼滤波算法思想理解 Kalman filter 第一篇
  3. 物联网平台构架系列 (四):Amazon, Microsoft, IBM IoT 解决方案导论 之 平台
  4. linux系统python 2.6 安装pip_详解CentOS升级Python2.6到Python2.7并安装pip
  5. 万万没想到,枯燥的“机器学习”还可以这样学!
  6. java学习(151):字节输出流
  7. 【Python】输入两个字符串,在第一字符串中删除第二个字符串中所包含的所有字符...
  8. 不用归一化,深度学习模型也可以很优秀!
  9. noip2010乌龟棋解题报告
  10. TIOBE 12 月排行榜:古老的 C 和后起之秀 Kotlin,谁是年度编程语言之王?
  11. C++之STL种类及实现
  12. 超全蓝牙芯片原厂总结(含芯片型号)
  13. BankNext 微服务:案例研究
  14. python就业方向-目前最全的Python的就业方向
  15. 外贸电子商务常见VISA信用卡或MasterCard等测试信用卡卡号一览
  16. 从空空狐谈信用卡套利
  17. 问request.getRequestDispatcher(“url“).forward(request.response)是什么意思
  18. 12306网站 =≈=泄露用户信息解读之撞库
  19. Animated详解
  20. 恕我直言:你可能一直用错了 kafka 的重试机制

热门文章

  1. python在线课程-开始网上在线深度学习python课程
  2. python自带的shell是什么-python shell是什么东西?
  3. 以下哪一个不属于python语言的特点-Python语言的特点有哪些
  4. python中if错误-Python中错误和异常
  5. python语法基础知识-python基础必学的语法知识
  6. python界面颜色-给Python点颜色——青少年学编程
  7. 学python用什么系统好-初次接触python,怎么样系统的自学呢?
  8. python毕业设计开题报告-基于Python图书管理系统开题报告
  9. 安装tensorflow-gpu2.0 报错:ERROR: Cannot uninstall 'wrapt'
  10. Opengl-基本概念-可编程的渲染管线(僵硬啊)