假如我们加个参数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...
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 9 10 staticconststructfile_operations vhost_net_fops = { ....
假如我们加个参数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...
首先看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...
故在vhost-net/virtio-net体系中,vhost-net是在hostkernelspace中运行的backend,virtio-net是在guest kernel space中运行的frontend。 在Linux 3.0中,vhost代码存放在drivers / vhost /中。 所有设备使用的通用代码在drivers / vhost / vhost.c中。 这包括virtio vring访问功能,所有virtio设备需要为了与客户进行通信。
vhost-net的引入,就是将vitio-net后端设备的数据处理模块下沉到Kernel中,从而提高整体的效率; vhost-net的框架图如下: 从图中可以看出,Guest的网络数据交互直接可以通过vhost-net内核模块进行处理,而不再需要从内核态切换回用户态的Qemu进程中进行处理;
struct vhost_virtqueue:用于描述vhost设备对应的virtqueue,这部分内容可以参考之前virtqueue机制分析,本质上是将Qemu中virtqueue处理机制下沉到了Kernel中。 一个VM即一个qemu进程可以有多个vhost_net和vhost_dev,而一个vhost_dev对应一对收发队列以及一个vhost内核线程,站在vm的角度,一个vm接口可能包含多个vhost_net和vho...
vhost-net的引入,就是将vitio-net后端设备的数据处理模块下沉到Kernel中,从而提高整体的效率; vhost-net的框架图如下: 从图中可以看出,Guest的网络数据交互直接可以通过vhost-net内核模块进行处理,而不再需要从内核态切换回用户态的Qemu进程中进行处理;
KVM - Kernel-based Virtual Machine(基于内核的虚拟机),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor。因此 Host 可以运行多个彼此隔离的 Guest 虚拟机环境。Linux 内核提供作为一个 hypervisor 应该具有的诸如:内存管理、进程调度、网络协议栈等能力,这些 VM 在 Host 看来只不过是...
vhost-net的引入,就是将vitio-net后端设备的数据处理模块下沉到Kernel中,从而提高整体的效率; vhost-net的框架图如下: 从图中可以看出,Guest的网络数据交互直接可以通过vhost-net内核模块进行处理,而不再需要从内核态切换回用户态的Qemu进程中进行处理;