virtio frontend and backend
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相关推荐
- web前端渲染和后端渲染(web front-end and back-end rendering)
在网上查找了很久的前端渲染和后端渲染的区别,最后总算在知乎上看到了一个比较清楚的解释,感谢万分! 作者:iakul 链接:https://www.zhihu.com/question/28725977 ...
- KVM 虚拟化原理探究--启动过程及各部分虚拟化原理
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- KVM 虚拟化原理探究(5)— 网络IO虚拟化
2019独角兽企业重金招聘Python工程师标准>>> IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输入 ...
- virtio+ovs转发原理和性能分析
女主宣言 virtio 是一种 I/O 半虚拟化解决方案,ovs是一个虚拟交换机,利用软件的方式实现交换功能.本文将对virtio+ovs的转发原理进行介绍和并对其性能展开分析. PS:丰富的一线技术 ...
- Virtio: An I/O virtualization framework for Linux | 原文
<Virtio: An I/O virtualization framework for Linux> <KVM Virtio: An I/O virtualization fram ...
- Linux虚拟化:Virtio: 一个 I/O 虚拟化框架
<Virtio: An I/O virtualization framework for Linux> 目录 什么是 virtio# 为什么是 virtio# virtio 的架构# vi ...
- VIRTIO后端框架QEMU与VHOST分析
VIRTIO设备的前端是GUEST的内核驱动,后端由QEMU或者DPU实现.不论是原来的QEMU-VIRTIO框架还是现在的DPU,VIRTIO的控制面和数据面都是相对独立的设计.本文主要针对QEMU ...
- [Cinder] 存储 Qos
目录 文章目录 目录 前言 操作步骤 参考文章 前言 Cinder 支持 front-end 和 back-end 两种类型的存储 QoS,前者由 Hypervisor 端实现(e.g. 通过 Lib ...
- 【重识云原生】第六章容器6.4.2.3节——Pod使用(下)
<重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...
最新文章
- Oracle系统的定义
- 微型计算机系统采用三级存储器组织结构,微型计算机原理07级试卷B.doc
- tomcat配置相关总结
- Xamarin Forms启动自带模拟器缓慢
- mega_[MEGA DEAL]完整的Java捆绑包(96%折扣)
- airpods pro是按压还是触摸_AirPods 与 AirPods Pro 哪个好?如何正确选购华强北版本...
- RabbitMq入门以及使用教程
- mysql binlo 抽取_使用mysqlbinlog根据时间点提取SQL简单方法
- 七月算法--12月机器学习在线班-第五次课笔记—回归
- vscode写python爬虫_如何在vscode中调试python scrapy爬虫
- Linux多网卡配置高级策略路由---从哪里来就回哪里去~!
- Maven中DependencyManagement和Dependencies区别
- C#强化系列文章七:序列化和反序列化
- mysql 优化配置 大批量数据插入_MySQL数据库插入100w条数据要花多久?
- 数据库基础 新手入门(一)
- mysql学生管理系统背景_学生基本系统管理
- JVM——字节码指令(转)
- servlet制作过滤器
- 应用程序dll文件缺失,以及无法正常启动0xc000007b
- SDOI2015寻宝游戏
热门文章
- 应用系统部署注意事项
- Python基础之day05-强化练习
- 单片机在微型计算机系统中的作用,单片机原理及应用习题及答案
- 上采样 介绍 + Bilinear pytorch代码解析
- 江苏盐城发生5.0级地震——海中地震如何定位地震发生位置
- 共识算法11:Raft的GO实现
- 计算机在水产养殖学中的应用,计算机视觉技术在水产养殖中的应用与展望-农业工程学报.PDF...
- 第二次团队作业——预则立他山之石
- nginx配置ws wss 和http https和访问实例
- [NewLife.XCode]增删改查入门