商业网站 技术,东莞数据线厂家东莞网站建设,男女做微电影网站,wordpress端口一、virtio的介绍
在一篇文章中对virtio进行了简单的说明。在早期的虚拟化的过程中#xff0c;无论是KVM还是Vmware亦或是Xen#xff0c;每个平台想当然的是自己搞自己的IO接口。这就和现在国内的互联各个平台都是大而全一样#xff0c;怎么可能我用你的支付接口呢#xf…一、virtio的介绍
在一篇文章中对virtio进行了简单的说明。在早期的虚拟化的过程中无论是KVM还是Vmware亦或是Xen每个平台想当然的是自己搞自己的IO接口。这就和现在国内的互联各个平台都是大而全一样怎么可能我用你的支付接口呢而这样做的结果就是应用方感到非常难受特别是维护升级以及想改变应用目标的话这需要的成本不断增加。 而实际上不管IO如何发展除非出现一种完全崭新的接口设备否则它们应用基本逻辑应用没有多大差异这也为统一设备的接口和提高兼容性打开了大门。 而virtio可以说因时而动它提供了通用的抽象接口它是一种半虚拟化的设备抽象接口规范它在QEMU和KVM中被广泛应用。它分为两部分即virtio前端和vhost后端。virtio的数据流交互其实就是通过两个VRing来进行转发的。
二、virtio的框架流程
其主要架构如下 从图上可以看出其共分为了四层前端驱动和后端驱动以及中间层的virtio 和virtio ring层。 前端驱动和后端设备通过传输层中间层两层来实现数据的通信其主要的流程图如下 前端驱动virtio中主要是虚拟机对virtio模拟设备的驱动程序用来管理virtio设备接收虚拟机的请求并根据协议连接virtio设备。在Linux内核中基本已经实现了一系列的此类前端驱动如virtio-ballon、virtio-net、virtio-blk和virtio-scsi等等。同时在DPDK中实现了对网络设备的用户态virtio-pmd驱动。 传输层顾名思义就是用前后端的数据通信它主要是支持虚拟机和VMMHypervisor之间。正如图上所讲利用共享内在实现两个虚拟队列来完成数据的传输。前端虚拟队列用于前端动态数据的传输后端虚拟队列用于前端设备提交的IO请求处理。 后端设备主要承担两类功能一个是对virtio后端设备的模拟第二是依据协议处理虚拟机传过来的请求。不过随着技术的进步又出现了前面提到的vhost,vhost-user、vDPA等等加速方案。
三、DPDK的virtio的应用
在Linux内核中对virtio的抽象实现如下 1、底层PCI-e设备抽象层管理检测PCI-e设备初始化相应设备驱动程序,其通过两个抽象类即virtio_driver和virtio_device来负责此工作 2、中间virio虚拟队列层其主要是virtqueue其主要由vring_virtqueue和vring等类来实现 3、上层网络设备抽象层通过实现底层抽象类virtio_net_driver和dev来提供普通的网络接口使用 而在DPDK基本上也是沿袭了这个路线。 DPDK中对virtio设备的优化 1、单帧mbuf的网络包收发优化固定了环表表项和描述符表项的映射 2、Indirect特性在网络发送包中的支持即发送包只需要一个描述符普通的包至少需要两个 这要归功于DPDK中并没有完全实现virtio中对所有相关IO的实现只是实现了对网卡设备的支持这样就可以针对其进行具体的上述优化了。
四、源码
DPDK中对相关虚拟化virtio的实现代码主有以下几部分DPDK主目录/drviers/net/virtio或vhost 其主要内容包括 1、从整体上讲在net路径下有vhost和virtio两块在virtio中有virtio-user及相关抽象实现而在wirtio-user中又有用户态的vhost等 2、在virtio文件夹中通过文件名也基本可以判断出其功能virtio_ethdev.c是上层设备的抽象即前端驱动而virtio_pci.c是底层抽象即后端的驱动而virtio_rxtx.c等含有rxtx源码文件都负责传输的而virtio_ring.h,virtqueue.c又是传输的抽象层 3、virtio_user中又提供了相关用户态的实现它实现DPDK对容器对virtio的支持并且可以用于与Kernel通信。
把整体的框架框住下来就可以从头按顺序进行分析不要着急。
五、总结
virtio一个完整的协议抽象不可能在一两篇文章中分析介绍完成所以大家先有一个印象然后再后面遇到具体的问题再具体的分析。同时会根据在DPDK的应用情况对相关的源码和流程以及相关的体系结构进行整理分析。每天进步一点点吧不断前行不断积累就会有量变到质变的过程。