网络IO的虚拟化模型小结

网络IO的虚拟化模型随着技术发展,出现了多种方式,例如emulationpara-virtualizationpass-throughSR-IOV等,本文试图对其做一个简单的总结。

  • Emulation(仿真):

    全虚拟化是最早出现的IO虚拟化方式,效率也最低。以接收网络报文为例,其处理步骤可以简单描述如下:

    • 数据包到达主机物理网卡,向host CPU发出中断。QEMU创建的网桥(br0)它会分析报文目的地。如果目的地是host,调用host的中断处理函数;如果目的地是虚拟机的话将报文转发至TAP设备。之前初始化时qemu进程已经打开了TAP的字符设备。
    • TAP设备由两部分组成,一侧是网络驱动,另一侧是字符设备驱动,前者负责接受来自物理网卡的数据报,后者则将报文转发至qemu进程。过程为:TAP 将字符设备的文件描述符置位,qemu进程通过select调用接收。
    • qemu调用tap_send函数,将网络数据报通过e1000_receive函数写入网卡的缓存区,依次会调用pci_dma_write,最后是qemu_get_ram_ptr,做一次内存拷贝。在虚拟机中,网卡缓存可以通过DMA方式访问,但虚拟机的物理内存映射到qemu的虚拟内存区,因此虚拟机的OS读取的实际是qemu进程的缓存。最后调用set_ics向虚拟机注入中断。
    • 虚拟机读取中断后引发VM-Exit,停止VM进程执行,进入root操作状态。KVM要根据KVM_EXIT_REASON判断原因。对于IO请求,其标志为KVM_EXIT_IO。因为kvm无法处理此操作,需要重新回到qemu的用户态,调用kvm_handle_io进行处理。

         

         

         

  • Para-virtualization(半虚拟化)

    可以认为是一种改进后的仿真模型,由各厂商提供虚拟网卡驱动,并加入Guest OSvhost driver创建了一个字符设备 /dev/vhost-net,这个设备可以被用户空间打开,并可以被ioctl命令操作。当给一个Qemu进程传递了参数-netdev tap,vhost=on 的时候,QEMU会通过调用几个ioctl命令对这个文件描述符进行一些初始化的工作,然后进行特性的协商,从而宿主机跟客户机的vhost-net driver建立关系。与此同时,kernel中要创建一个kernel thread 用于处理I/O事件和设备的模拟。 kernel代码 drivers/vhost/vhost.c:在vhost_dev_set_owner中,调用了这个函数用于创建worker线程(线程名字为vhost-qemu+进程pid)。这个内核线程被称为"vhost worker thread",该worker thread的任务即为处理virtioI/O事件。而在Guest中,会打开virtio设备,将virtiovring映射到host kernelvhostkvm的事件通信通过eventfd机制来实现,主要包括两个方向的event,一个是GuestVhost方向的kick event,通过ioeventfd承载;另一个是VhostGuest方向的call event,通过irqfd承载。

    guest_notifier的使用:

    • vhost在处理完请求(收到数据包),将buffer放到used ring上面之后,往call fd里面写入;
    • 如果成功设置了irqfd,则kvm会直接中断guest。如果没有成功设置,则走以下的路径:

      Qemu通过select调用监听到该事件(因为vhostcallfd就是qemu里面对应vqguest_notifier,它已经被加入到selectablefd列表)

    • 调用virtio_pci_guest_notifier_read通知guest
    • guestused ring上获取相关的数据。

    host_notifier的使用:

    • Guest中的virtio设备将数据放入avail ring上面后,写发送命令至virtio pci配置空间;
    • Qemu截获寄存器的访问,调用注册的kvm_memory_listener中的eventfd_add回调函数kvm_eventfd_add()
    • 通过kvm_vm_ioctl(kvm_state, KVM_IOEVENTFD, &kick)进入kvm中;
    • kvm唤醒挂载在ioeventfdvhost worker thread
    • vhost worker threadavail ring上获取相关数据。

       

       

  • Pass-through

    VMM直接将一个PCI设备分配给VM,通过iommu保证VM间内存访问不冲突。这种方式性能最快,但是一个设备只能给一个VM使用,灵活性差,而且不支持迁移。

       

       

  • SR-IOV

    SR-IOV主要用来解决pass-through只能被一台虚拟子机访问的问题。SR-IOV标准由PCI-SIG,这个标准实现需要CPU芯片组和PCI设备(主要是网卡等I/O资源)协同在硬件层面实现。支持SR-IOV功能的网卡可以在Hypervior里面注册成多个网卡(每个网卡都独立的中断ID、收发队列、QOS管理机制)。每个设备可以通过pass-through方式分配给虚拟子机。Intel公司的82599 10G网卡以PF/VF的形式提供了对SR-IOV的支持。

转载于:https://www.cnblogs.com/CodeComposer/p/4722904.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值