在vhost-kernel方案中,QEMU使用ioctl系统调用和内核的vhost-scsi模块建立联系,从而把QEMU中模拟的SCSI设备部分传递到了内核态,即内核态对该SCSI设备不是完全模拟的,仅仅负责对virtqueue进行处理,因此这个ioctl的消息主要负责3部分的内容传递:Guest内存映射;Guest Kick Event、vhost-kernel驱动用来接收Guest的消息,当接收到该...
virtio-net device通过sendmsg系统调用将数据包写入到内核tun设备上,在host kernel看来,网络协议栈从tun设备上收到一个来自VM的报文。进一步的host kernel网络协议栈可以使用OVS等转发机制转发这个报文。 Qemu 中的virtio-net device通知guest缓冲区操作(读取或写入)已完成,它通过将数据放入虚拟队列并发送used ring notifi...
此字符设备作为配置vhost-net实例的接口。 当使用-netdev tap启动QEMU时,vhost = on将打开/ dev / vhost-net并使用几个ioctl调用初始化vhost-net实例。 这些必须将QEMU进程与vhost-net实例关联,准备virtio功能协商,并将guest虚拟机物理内存映射传递到vhost-net驱动程序。 在初始化期间,vhost驱动程序创建一个名为vhos...
在这套实现中,QEMU和vhost-net内核驱动使用ioctl来交换vhost消息,并且用eventfd来实现前后端的通知。当vhost-net内核驱动加载后,它会暴露一个字符设备在/dev/vhost-net。而QEMU会打开并初始化这个字符设备,并调用ioctl来与vhost-net进行控制面通信,其内容包含virtio的特性协商、将虚拟机内存映射传递给vhost-net等。对比...
vhost-user 基于 C/S 的模式,采用 UNIX 域套接字(UNIX domain socket)来完成进程间的事件通知和数据交互,相比 vhost_net 中采用 ioctl 的方式,vhost-user 采用 socket 的方式大大简化了操作。 vhost-user 基于 vring 这套通用的共享内存通信方案,只要 client 和 server 按照 vring 提供的接口实现所需功能即可,...
内核态部分 - 由负责数据路径转发的 ovs kernel 模块组成。 OVS 控制器与 ovsdb-server 和内核转发面进行通信。在我们的例子中,我们用一个 port 把 OVS 内核转发面连接到物理网卡,而另一个 port 将 OVS 内核转发面连接到 vhost-net 后端。在实际应用中将会有多个物理网卡通过多个 port 连接到 OVS,同时还有多个...
首先看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...
kernel_ops:vhost的内核操作函数集,都是一些回调函数的实现,最终会通过vhost_kernel_call-->ioctl-->vhost-net.ko路径,进行配置; 系统调用,与驱动交互简单来说可以分为三大类,下边分别介绍几个关键的设置: vhost net设置 VHOST_SET_OWNER:底层会为调用者创建一个内核线程,对应到前文中数据结构中的vhost_worker,...
vhost-user 基于 C/S 的模式,采用 UNIX 域套接字(UNIX domain socket)来完成进程间的事件通知和数据交互,相比 vhost_net 中采用 ioctl 的方式,vhost-user 采用 socket 的方式大大简化了操作。 vhost-user 基于 vring 这套通用的共享内存通信方案,只要 client 和 server 按照 vring 提供的接口实现所需功能即可,...
vhost-user库和vhost-net内核驱动程序之间的主要区别是通信通道。vhost-net内核驱动程序使用ioctl实现此通道,vhost-user库定义了通过unix套接字发送的消息结构。 可以将DPDK应用程序配置为提供unix套接字(服务器模式)并使QEMU连接到它(客户端模式),但是相反的情况也是可能的,这允许DPDK重新启动而无需重新启动VM。