说明:
-
KVM版本:5.9.1
-
QEMU版本:5.0.0
-
工具:Source Insight 3.5, Visio
1. 概述
让我们先来看看问题的引入,在之前的virtio系列文章中,网络虚拟化的框架如下图所示:
-
Qemu中的virtio-net设备数据包收发,通过用户态访问tap设备完成的;
-
收发过程涉及Guest OS,KVM,Qemu中的virtio-net设备,Host中的网络协议栈等的交互,路径长并且涉及的切换多,带来了性能的损耗;
-
vhost-net的引入,就是将vitio-net后端设备的数据处理模块下沉到Kernel中,从而提高整体的效率;
vhost-net的框架图如下:
-
从图中可以看出,Guest的网络数据交互直接可以通过vhost-net内核模块进行处理,而不再需要从内核态切换回用户态的Qemu进程中进行处理;
-
之前的文章分析过virtio设备与驱动,针对数据传遵循virtio协议,因此vhost-net中需要去实现virtqueue的相关机制;
本文将分析vhost-net的原理,只说重点,进入主题。
2. 数据结构
vhost-net内核模块的层次结构如下图:
-
struct vhost_net:用于描述Vhost-Net设备。它包含几个关键字段:1)struct vhost_dev,通用的vhost设备,可以类比struct device结构体内嵌在其他特定设备的结构体中;2)struct vhost_net_virtqueue,实际上对struct vhost_virtqueue进行了封装,用于网络包的数据传输;3)struct vhost_poll,用于socket的poll,以便在数据包接收与发送时进行任务调度;
-
struct vhost_dev