vhost-net 是一个实现了 vhost 协议 handler 侧的内核驱动,旨在实现高效的数据面,也就是 packet 转发。该实现下,qemu 与 vhost-net 内核驱动(handler)通过 ioctl 交换 vhost 信息,以及一组类似 eventfd 的 fd,被称为 irqfd 以及 ioeventfd,这些 fd 用来在 handler 和 guest 之间交换 notification。 当vhost-ne...
3.4 vhost-net基本运作原理 在这套实现中,QEMU和vhost-net内核驱动使用ioctl来交换vhost消息,并且用eventfd来实现前后端的通知。当vhost-net内核驱动加载后,它会暴露一个字符设备在/dev/vhost-net。而QEMU会打开并初始化这个字符设备,并调用ioctl来与vhost-net进行控制面通信,其内容包含virtio的特性协商、将虚拟机内存...
简述了 virtio spec 及 vhost 协议,纵览了实现 virtio 接口的前后端架构,以及 vhost-net(host kernel) 与 virtio-net(guest kernel) 之间通信的 vhost-net/virtio-net 架构。 行文最大的挑战是本文所涉及概念、术语其背后的历史包袱。举例来说,virtio-net 既包含 virtio 标准中所定义的 virtio networking 设备实...
vhost-net 悄然成为 qemu-kvm 虚拟化架构下标准 virtio 网络接口所默认采用的流量传输 offloading 机制。该机制通过内核模块(而非 qemu 进程)来做网络处理,极大提升了网络性能。 《vhost-net 简介》一文从高维度视角解构了此架构的各组件,《深入 virtio-networking 及 vhost-net》一文解释了这些组件具体是怎么揉在一...
然后,vhost-net会通知虚拟机(通过ioeventfd机制)有新的数据包可供读取。 数据发送:虚拟机准备好要发送的数据包后,会将其放入virtqueue中,并通过ioeventfd机制通知vhost-net内核模块。vhost-net从virtqueue中读取数据包,并通过tap设备将其发送出去。 通知机制:vhost-net使用ioeventfd和irqfd机制来实现与虚拟机的通知和...
vhost-net的引入,就是将vitio-net后端设备的数据处理模块下沉到Kernel中,从而提高整体的效率; vhost-net的框架图如下: 从图中可以看出,Guest的网络数据交互直接可以通过vhost-net内核模块进行处理,而不再需要从内核态切换回用户态的Qemu进程中进行处理;
vhost-net的框架图如下: 从图中可以看出,Guest的网络数据交互直接可以通过vhost-net内核模块进行处理,而不再需要从内核态切换回用户态的Qemu进程中进行处理; 之前的文章分析过virtio设备与驱动,针对数据传遵循virtio协议,因此vhost-net中需要去实现virtqueue的相关机制; ...
virtio-net 是前端组件,运行在 guest 的内核空间。 vhost-net 是后端组件,运行在 host 的内核空间。 需要注意几点: vhost-net 与 virtio-net 均运行在 host 与 guest 的内核空间,因此我们有时也称其为 vhost-net/virtio-net 驱动。 我们在前端和后端之间拥有独立的控制面和数据面。vhost-net 使用 vhost 协议...
vhost-net驱动程序在主机上创建一个/ dev / vhost-net字符设备。 此字符设备作为配置vhost-net实例的接口。 当使用-netdev tap启动QEMU时,vhost = on将打开/ dev / vhost-net并使用几个ioctl调用初始化vhost-net实例。 这些必须将QEMU进程与vhost-net实例关联,准备virtio功能协商,并将guest虚拟机物理内存映射传递...
open = vhost_net_open, .llseek = noop_llseek, }; 另一方面,当qemu创建tap设备时会调用到net_init_tap()函数。net_init_tap()其中会检查选项是否指定vhost=on,如果指定,则会调用到vhost_net_init()进行初始化,其中通过open(“/dev/vhost-net”, O_RDWR)打开了vhost-net driver;并通过ioctl(vhost_fd...