在实际应用中将会有多个物理网卡通过多个 port 连接到 OVS,同时还有多个虚拟机运行,因此将会有多个 port 将 OVS 连接到多个 vhost-net 后端。 下图展示了如何通过 OVS 连接到 virtio: 3、深入理解 Virtio 与 vhost-net 本章,我们将带您深入理解 Virtio 与 vhost-net架构。 Part I:背景知识 1)TUN/TAP TUN/TA...
vhost-net模块中创建好了vhost_worker内核线程,用于处理任务; 2) 当数据包准备好之后,通过往kick fd上触发信号,从而唤醒vhost_worker内核线程来调用handle_tx_kick进行数据的发送; 当Tap/Tun不具备发送条件时,vhost_worker会poll在socket上,等待Tap/Tun的唤醒,一旦被唤醒后可以调用handle_tx_net发送; 最终的handle_...
vhost-net本质为将 qemu 中的 io 线程(负责 tap 读写) offload 给了 vhost-net内核线程。 qemu 在将 tap 读写 offload 给 vhost-net 之前,需要帮virtio-net与 vhost-net 建立前后端通知机制(基于 eventfd)。 前端kick(notification) 后端,利用 eventfd 的同步效应;后端 kick 前端,通过 eventfd 最终走 ioctl ...
virtio-net 为运行在 guest kernel 中的驱动前端。 vhost-net 为运行在 host kernel 中的设备后端。 vhost-net 本质为将 qemu 中的 io 线程(负责 tap 读写) offload 给了 vhost-net 内核线程。 qemu 在将 tap 读写 offload 给 vhost-net 之前,需要帮 virtio-net 与vhost-net 建立前后端通知机制(基于 ev...
vhost-net网卡的后端默认使用linux的虚拟网桥tap设备,qemu和虚拟机内部使用virtio-net虚拟网卡。 步骤1: 创建linux网桥和tap设备(对于fedora,centos,redhat等默认有创建好的虚拟网卡) brctl addbr virbr0 brctl stp virbr0 on ip tuntap add name virbr0-nic mode tap ...
TAP(network tap)设备的操作很像 TUN 设备,但是 TAP 设备工作在 L2 层,因此 TAP 设备可以接收和发送原始的以太报文。 当TUN/TAP 内核模块被加载时,它会创建一个特殊的设备/dev/net/tun。用户进程可以创建一个 tap 设备,打开该设备并向它发送特定的 ioctl 命令。新的 tap 设备在文件系统中有一个名称,另一个...
static int vhost_net_init(void) { if (experimental_zcopytx) vhost_net_enable_zcopy(VHOST_NET_VQ_TX); return misc_register(&vhost_net_misc); } module_init(vhost_net_init); static void vhost_net_exit(void) { misc_deregister(&vhost_net_misc); } module_exit(vhost_net_exit); MODULE...
vhost_net_init中会去初始化网卡后端,使用net->backend去记录backend fd。 qemu使用vhost_net_set_backend函数把fd传入到内核vhost中。 我们qemu或是vhost都是把数据发给tap设备就完了。 也就是vhost只管把读写这个fd就好了。 ovs的处理会复杂一点,当tap收到数据的时候会被OVS hook,在netdev_frame_hook中对数据...
vhost-net的工作原理可以概括为以下几个步骤: 初始化:当QEMU启动虚拟机并配置vhost-net时,它会通过ioctl系统调用与vhost-net内核模块进行交互,完成vhost-net实例的初始化。这一步包括设置vhost-net的后端设备(如tap设备)、配置virtio功能、映射虚拟机物理内存等。 数据接收:当tap设备接收到数据包时,vhost-net内核模块...
理解vhost_poll是理解vhost_net的工作机制很重要的一环。其代表vhost poll机制中的一个等待实体。 poll,字面意思轮询,可以理解为,当某一事件发生的时候(tap收到报文),轮询遍历关心此事件的所有对象(tap socket遍历socket等待列表中的所有等待实体 vhost_poll.wait),唤醒此对象的工作线程/进程(调用vhost_poll.wait.fu...