vhost-net 与 virtio-net 均运行在 host 与 guest 的内核空间,因此我们有时也称其为 vhost-net/virtio-net 驱动。 我们在前端和后端之间拥有独立的控制面和数据面。vhost-net 使用 vhost 协议为数据面建立转发框架,该转发框架通过共享内存在 host 与 guest 之间转发数据包。 对于每个 guest 我们可以分配一些 vCP...
Vhost 协议能够 bypass 掉 QEMU 进程,让数据包从 Host 直接转发到 Guest。Vhost 协议本身只是描述了如何建立数据面,具体的数据面的实现还需要按照 Virtio 规范中所描述的那样。 Vhost 协议可以在内核态(vhost-net)或者用户态(vhost-user)中实现, 本文主要描述 virtio 数据面在内核中的实现方式,也被称为 vhost-net...
在vhost-net/virtio-net 架构中组件如下所示: virtio-net 是前端组件,运行在 guest 的内核空间。 vhost-net 是后端组件,运行在 host 的内核空间。 需要注意几点: vhost-net 与 virtio-net 均运行在 host 与 guest 的内核空间,因此我们有时也称其为 vhost-net/virtio-net 驱动。 我们在前端和后端之间拥有独立...
Vhost 协议能够 bypass 掉 QEMU 进程,让数据包从 Host 直接转发到 Guest。Vhost 协议本身只是描述了如何建立数据面,具体的数据面的实现还需要按照 Virtio 规范中所描述的那样。 Vhost 协议可以在内核态(vhost-net)或者用户态(vhost-user)中实现, 本文主要描述 virtio 数据面在内核中的实现方式,也被称为 vhost-net...
特性位用于device和driver间同步设备特性,例如VIRTIO_NET_F_CSUM表示网卡是否支持checksum offload。driver读取特性位来获取网卡后端支持的特性,driver写入特性位来通知网卡后端需要使用的特性。 2. 读写配置 配置是一个表示设备配置信息的数据结构。driver和device间通过这个结构来获取和设置设备的配置,例如网卡的MAC地址等...
首先看vhost-net模块注册,主要使用linux内核提供的内存注册机制,这部分开发过linux kernel的人都应该很了解啦1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 static struct miscdevice vhost_net_misc = { .minor = VHOST_NET_MINOR, .name = "vhost-net", .fops...
MODULE_DESCRIPTION("Host kernel accelerator for virtio net"); MODULE_ALIAS_MISCDEV(VHOST_NET_MINOR); MODULE_ALIAS("devname:vhost-net"); 其中vhost_net_fops代表字符设备支持的用户态接口。字符设备为/dev/vhost-net 1 2 3 4 5 6 7 8
假如我们加个参数vhost=on,vhost定义了一堆api,qemu把virtio收发包和用于通知收发包的功能offload给kernel vhost-net了,这包就不用从kernel到用户态的qemu,再从qemu共享给guest,直接从kernel共享给guest,减少一次kernel到用户态qemu的复制开销。 qemu对vhost-net初始化,重点关注qemu把address_space发给kernel vhost-net...
5.2. virtio 和 vhost_net下图显示了在 Virtio 和 vhost_net 构架中对内核的参与。 图5.1. virtio 和 vhost_net 架构 vhost_net 将 Virtio 驱动程序的一部分从用户空间移至内核。这可减少复制操作,从而减少延迟和 CPU 用量。 前一个...
在描述了"vhost-user"实现方式中,涉及的"ioeventfd"机制用于在guest和host之间进行通信,通过vm-exit实现数据交换。KVM作为代理,利用eventfd进行进程间的通信,使QEMU进程等待并响应来自guest的kick信号。同时,文中介绍了"irqfd"机制,作为通知guest的另一种方式。进一步讨论了"vhost-net"模块,它在内核态...