1,QEMU如何模拟virtio设备

一个virtio设备被QEMU虚拟出来呈现给guest OS时,guest OS中的virtio driver是为前端,而QEMU中的virtio device是为后端。一个virtio前后端之间采用virtqueue通信,这是一种基于共享内存的通信方式。QEMU本身并不能将虚机报文发送至外部物理世界,这依赖于host OS里的物理网络设备,所以QEMU里的virtio device还需要绑定到一个host OS里的网卡。

2,QEMU中的前端设备与后端设备

在QEMU启动脚本里“qemu -device virtio-net,netdev=xxx0”这段参数用于向VM添加virtio网卡,这个设备对应着QEMU里的frontend device,它决定了设备如何呈现在VM里,比如MAC地址,queue数量,还有其他feature。前面说过QEMU模拟的virtio设备还依赖于host OS里的后端设备才能真正的往物理世界发送报文,“qemu -netdev tap,id=xxx0,vhost=on”这段参数添加一个数据面卸载至kernel vhost-net的后端virtio设备,“qemu -netdev vhost-user,id=xxx0,chardev=/var/run/tap0”这段参数添加一个数据面卸载至DPDK vhost-user的后端virtio设备,注意前后端的绑定是通过id进行的,前端使用netdev=xxx0来指定它所绑定的后端设备。

3,pci transport of virtio

virtio设备底层依赖于pci作为它的transport层。它在PCI BAR空间的寄存器布局主要靠virtio capability来描述,目前有common, notify, ISR, device specific, pci configuration access五种。每一种都由capability header内的bar/offset/length来指明在哪个PCI BAR空间以及其中的偏移和长度。QEMU为这里的每一段都注册了一个MMIO类型的MR,各有专门的响应函数。

common capability主要用于前后端交换feature,中断,队列数,每个队列的descriptor table/available ring/used ring基地址等信息,前端virtio driver分配好每个virtqueue的descriptor table/available ring/used ring,再将其内存起始地址写入上面的MMIO寄存器。每次guest OS virtio driver对它们的写都是一次MMIO写操作,都会导致vm-exit进而陷入QEMU响应MMIO操作。注意这里交换指定队列信息前guest OS virtio driver需要先设置queue_select。

前端通知后端:notification用于guest 通知(kick) host有新数据放入virtqueue,需要host来处理。如果device_status表明后端处于polling模式则guest OS virtio driver无需通过写queue x notification寄存器来通知后端,只需使用写屏障确保2端看到的内容的一致性。当后端处于interrupt模式则需要guest OS里virtio driver写PCI BAR空间里的notification寄存器来通知后端,这俗称为敲doorbell,virtio里俗称kick。kick是一个相对频繁的操作,它的处理并不像common capability那样每次都陷入QEMU处理。MMIO写导致EPT page fault进而发生vm-exit陷入host KVM,此时KVM会根据MMIO地址查找得到其关联的ioeventfd并将其置为可读。取决于virtio数据面被卸载至何处,持有ioeventfd另一端的可能是QEMU/vhost-user/vhost-net/vhost-vdpa,它们被唤醒后进一步处理virtqueu里的描述符。

后端通知前端:ISR status capability原本用于后端通知前端有新数据到达virtqueue,但这种方式仅在MSI-X中断没有启用时才使用,最新的linux一般使用MSIX,所以此capability一般未使用。后端通知前端一般是向guest OS注入一个MSIX中断,这是通过irqeventfd实现的,它的一端是virtio数据面QEMU/vhost-user/vhost-net/vhost-vdpa,另一端是host KVM,注入的中断被记录在VMCS内,下一次vm-entry就会触发guest OS里的中断处理。

device specific capability用于配置特定于设备的属性,比如virtio-net的mac地址,mtu,speed, duplex等。

PCI configuration access capability是virtio提供的另一种访问PCI配置空间的方式,最新的linux一般使用ECAM方式访问PCI配置空间,所以此capability一般不使用。

学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂
更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,久学习,或点击这里加qun免费
领取,关注我持续更新哦! !

3,QEMU中的前端设备

static const TypeInfo virtio_net_info = {.name = TYPE_VIRTIO_NET,.parent = TYPE_VIRTIO_DEVICE,.instance_size = sizeof(VirtIONet),.instance_init = virtio_net_instance_init,.class_init = virtio_net_class_init,
};static void virtio_register_types(void) { type_register_static(&virtio_net_info); }
type_init(virtio_register_types)

QEMU对于前端设备有几个层级的抽象:virtio-pci,virtio,virtio-net。每一层关注的内容都不一样,这里先说virtio-net:在设备初始化时它主要调用virtio_init/virtio_add_queue/qemu_new_nic等API向QEMU注册virtio设备,初始化完成后需要响应guest OS对device specific capability区域的读写(vdc->get/set_config),特别是virtio网卡被guest OS link up之后需要调用vhost_net_start启动QEMU中的后端设备。

4,后端设备

5,前后端的桥接

struct NetClientState 是前后端设备之间的桥梁。

原文链接:https://zhuanlan.zhihu.com/p/538167117

virtio frontend and backend相关推荐

  1. web前端渲染和后端渲染(web front-end and back-end rendering)

    在网上查找了很久的前端渲染和后端渲染的区别,最后总算在知乎上看到了一个比较清楚的解释,感谢万分! 作者:iakul 链接:https://www.zhihu.com/question/28725977 ...

  2. KVM 虚拟化原理探究--启动过程及各部分虚拟化原理

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  3. KVM 虚拟化原理探究(5)— 网络IO虚拟化

    2019独角兽企业重金招聘Python工程师标准>>> IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输入 ...

  4. virtio+ovs转发原理和性能分析

    女主宣言 virtio 是一种 I/O 半虚拟化解决方案,ovs是一个虚拟交换机,利用软件的方式实现交换功能.本文将对virtio+ovs的转发原理进行介绍和并对其性能展开分析. PS:丰富的一线技术 ...

  5. Virtio: An I/O virtualization framework for Linux | 原文

    <Virtio: An I/O virtualization framework for Linux> <KVM Virtio: An I/O virtualization fram ...

  6. Linux虚拟化:Virtio: 一个 I/O 虚拟化框架

    <Virtio: An I/O virtualization framework for Linux> 目录 什么是 virtio# 为什么是 virtio# virtio 的架构# vi ...

  7. VIRTIO后端框架QEMU与VHOST分析

    VIRTIO设备的前端是GUEST的内核驱动,后端由QEMU或者DPU实现.不论是原来的QEMU-VIRTIO框架还是现在的DPU,VIRTIO的控制面和数据面都是相对独立的设计.本文主要针对QEMU ...

  8. [Cinder] 存储 Qos

    目录 文章目录 目录 前言 操作步骤 参考文章 前言 Cinder 支持 front-end 和 back-end 两种类型的存储 QoS,前者由 Hypervisor 端实现(e.g. 通过 Lib ...

  9. 【重识云原生】第六章容器6.4.2.3节——Pod使用(下)

    <重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...

最新文章

  1. Oracle系统的定义
  2. 微型计算机系统采用三级存储器组织结构,微型计算机原理07级试卷B.doc
  3. tomcat配置相关总结
  4. Xamarin Forms启动自带模拟器缓慢
  5. mega_[MEGA DEAL]完整的Java捆绑包(96%折扣)
  6. airpods pro是按压还是触摸_AirPods 与 AirPods Pro 哪个好?如何正确选购华强北版本...
  7. RabbitMq入门以及使用教程
  8. mysql binlo 抽取_使用mysqlbinlog根据时间点提取SQL简单方法
  9. 七月算法--12月机器学习在线班-第五次课笔记—回归
  10. vscode写python爬虫_如何在vscode中调试python scrapy爬虫
  11. Linux多网卡配置高级策略路由---从哪里来就回哪里去~!
  12. Maven中DependencyManagement和Dependencies区别
  13. C#强化系列文章七:序列化和反序列化
  14. mysql 优化配置 大批量数据插入_MySQL数据库插入100w条数据要花多久?
  15. 数据库基础 新手入门(一)
  16. mysql学生管理系统背景_学生基本系统管理
  17. JVM——字节码指令(转)
  18. servlet制作过滤器
  19. 应用程序dll文件缺失,以及无法正常启动0xc000007b
  20. SDOI2015寻宝游戏

热门文章

  1. 应用系统部署注意事项
  2. Python基础之day05-强化练习
  3. 单片机在微型计算机系统中的作用,单片机原理及应用习题及答案
  4. 上采样 介绍 + Bilinear pytorch代码解析
  5. 江苏盐城发生5.0级地震——海中地震如何定位地震发生位置
  6. 共识算法11:Raft的GO实现
  7. 计算机在水产养殖学中的应用,计算机视觉技术在水产养殖中的应用与展望-农业工程学报.PDF...
  8. 第二次团队作业——预则立他山之石
  9. nginx配置ws wss 和http https和访问实例
  10. [NewLife.XCode]增删改查入门