美妇喷潮在线视频通用的vhost缔造

  • 首页
  • 免费观 看成人网站
  • 将粗大挺进邻居人妻
  • 亚洲国产成人AV线
  • 伊人狼人大蕉香AV
  • 行房时间短怎么治
  • 美妇喷潮在线视频通用的vhost缔造
    发布日期:2022-09-23 06:55    点击次数:84
    口述嗯啊动态图浪货美妇喷潮在线视频 

    本文转载自微信公众号「LoyenWang」,作家LoyenWang。转载本文请规划LoyenWang公众号。

    配景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基

    证据:

    KVM版块:5.9.1 QEMU版块:5.0.0 用具:Source Insight 3.5, Visio 著述同步在博客园:https://www.cnblogs.com/LoyenWang/ 1. 详尽

    让咱们先来望望问题的引入,在之前的virtio系列著述中,收集诬捏化的框架如下图所示:

    Qemu中的virtio-net缔造数据包收发,通过用户态拜访tap缔造完成的; 收发过程波及Guest OS,KVM,Qemu中的virtio-net缔造,Host中的收集公约栈等的交互,旅途长而况波及的切换多,带来了性能的损耗; vhost-net的引入,即是将vitio-net后端缔造的数据处治模块下沉到Kernel中,从而普及举座的后果;

    vhost-net的框架图如下:

    从图中不错看出,Guest的收集数据交互平直不错通过vhost-net内核模块进行处治,而不再需要从内核态切换回用户态的Qemu程度中进行处治; 之前的著述分析过virtio缔造与驱动,针对数据传效能virtio公约,因此vhost-net中需要去已毕virtqueue的相关机制;

    本文将分析vhost-net的旨趣,只说重心,参加主题。

    2. 数据结构

    vhost-net内核模块的档次结构如下图:

    struct vhost_net:用于刻画Vhost-Net缔造。它包含几个要道字段:1)struct vhost_dev,通用的vhost缔造,不错类比struct device结构体内嵌在其他特定缔造的结构体中;2)struct vhost_net_virtqueue,推行上对struct vhost_virtqueue进行了封装,用于收集包的数据传输;3)struct vhost_poll,用于socket的poll,以便在数据包收受与发送时进行任务治疗; struct vhost_dev:刻画通用的vhost缔造,可内嵌在基于vhost机制的其他缔造结构体中,比如struct vhost_net,struct vhost_scsi等。要道字段如下:1)vqs指针,指向依然分拨好的struct vhost_virtqueue,对应数据传输;2)work_list,任务链表,用于舍弃需要在vhost_worker内核线程上施行的任务;3)worker,用于指向创建的内核线程,施行任务列表中的任务; struct vhost_virtqueue:用于刻画缔造对应的virtqueue,这部安分容不错参考之前virtqueue机制分析,推行上是将Qemu中virtqueue处治机制下沉到了Kernel中。要道字段如下:1)struct vhost_poll,用于poll eventfd对应的文献,当不称心处治苦求时会添加到eventfd对应的恭候队伍中, 免费而一朝被叫醒,该结构体中的struct vhost_work(施行函数被起始化为handle_tx_kick,以发送为例)将被舍弃到内核线程中去施行;

    结构体的中枢围绕着数据和奉告机制,其中数据在vhost_virtqueue中体现,而奉告主若是通过vhost_poll来已毕,具体的细节下文将进一步刻画。

    3. 历程分析

    3.1 起始化

    vhost-net为内核模块,注册为misc缔造,Qemu通过系统调用接口与内核交互,Qemu中的起始化如下图:

    Qemu中tap缔造起始化在net_init_tap中完成,其中net_init_tap_one翻开vhost-net缔造文献,用于与内核的vhost-net交互; vhost_set_backend_type:成立vhost的后端类型,以及vhost的操作函数集。现在有两种vhost后端,一种是在内核态已毕的virtio后端,一种是在用户态中已毕的virtio后端; kernel_ops:vhost的内核操作函数集,都是一些回调函数的已毕,最终默契过vhost_kernel_call-->ioctl-->vhost-net.ko旅途,进行配置;

    ioctl系统调用,与驱动交互通俗来说不错分为三大类,下边分手先容几个要道的成立:

    vhost net成立

    VHOST_SET_OWNER:底层会为调用者创建一个内核线程,亚洲欧美强伦一区二区对应到前文中数据结构中的vhost_worker,同期在vhost_dev结构体中还会保存调用者线程的内存空间数据结构; VHOST_NET_SET_BACKEND:成立vhost-net的后端缔造,比如Qemu往内核态传递的tap缔造对应的fd,从而让vhost-net平直与tap缔造进行通讯;

    vhost dev成立

    从Guest OS中的诬捏地址到最终的Host上的物理地址映射关系如上图所示,如果在Guest OS中要将数据发送出去,推行上只需要将Qemu中对于Guest OS的物理地址布局信息传递下去,此外再结合VHOST_SET_OWNER时传递的内存空间信息,就不错凭证映射关系找到Guest OS中的数据对应到Host之上的物理地址,完成临了搬运即可;

    VHOST_SET_MEM_TABLE:将Qemu中的诬捏机物理地址布局信息传递给内核,为了判辨清楚这个问题,不错转头一下之前内存诬捏化中的一张图:

    vhost vring成立

    VHOST_SET_VRING_KICK:成立vhost-net模块前端virtio驱动发送奉告时触发的eventfd,奉告机制,最终触发handle_kick函数的施行; VHOST_SET_VRING_CALL:成立vhost-net后端到诬捏机virtio前端的中断奉告,参考之前著述中的irqfd机制; 此外对于vring的缔造还包括vring的大小,地址信息等;

    上述的这些成立的历程旅途如下,只画出了要路阶梯:

    当Guest OS中的virtio-net驱动完成起始化后,默契过vp_set_status来成立情状,以奉告后端驱动依然ready,此时会触发VM的退出并参加KVM进行相配处治,最终路由给Qemu; Qemu中的vcpu线程监测相配,当检测到KVM_EXIT_MMIO时,去回调注册该IO区域的读写函数,比如virtio_pci_common_write函数,在该函数中逐级往下最终调用到vhost_net_start函数; 在vhost_net_start中最终去通过kernel_ops函数集去成立底层并交互;

    起始化完成后,接下来让咱们望望数据的发送与收受,为了能将统共历程抒发清楚,我会将完好的图拆分红几个才调来阐扬。

    3.2 数据发送

    1)

    发送前的框图如下:

    Guest OS中的virtio-net驱动中珍藏两个virtqueue,分手用于发送和收受; 图中的datagram暗意的是需要发送的数据; KVM模块提供了ioeventfd和irqfd用于奉告机制; vhost-net模块中创建好了vhost_worker内核线程,用于处治任务;

    2)

    当数据包准备好之后,通过往kick fd上触发信号,从而叫醒vhost_worker内核线程来调用handle_tx_kick进行数据的发送; 当Tap/Tun不具备发送条款时,vhost_worker会poll在socket上,恭候Tap/Tun的叫醒,一朝被叫醒后不错调用handle_tx_net发送; 最终的handle_tx完成具体的发送;

    3)

    vhost_get_vq_desc函数在vritqueue中查找可用的buffer,并将信息存储到iov中,以便更好的拜访; sock->ops->sendmsg()函数,推行调用的是tun_sendmsg函数,在该函数均分拨了skb结构体,并将iov[]中的信息传递过来,最终如图中所示完成数据的拷贝和发送,通过NIC发送出去;

    4)

    数据发送完结后,通过irqfd机制奉告vcpu; 3.3 数据收受

    数据的收受是发送的逆过程,历程一致:

    1)

    起始化部分与发送过程一致;

    Tap/Tun驱动从NIC收受到数据包,准备发送给vhost-net;

    2)

    vhost-net中的vhost_worker线程也poll在两个fd之上,与发送端近似; kick fd上触发信号时最终调用handle_rx_kick函数,Tap/Tun对应的socket上触发信号时,调用handle_rx_net函数; 最终通过handle_rx来完成推行的收受;

    3)

    收受过程中,vhost_get_vq_desc赢得virtqueue中的可用buffer,并将信息存储到iov[]中; sock->ops->recvmsg()函数推行指向tun_recvmsg函数,在该函数中最终完成数据的传递;

    4)

    数据收受完成后,通过irqfd机制通过vcpu,从而在Guest OS中进行处治;

    vhost-net的举座内容较多,从上到下波及到的细节很繁琐,短短的一篇著述难以涵盖一起,权当给个轮廓了。

    暂且告一段落吧。

    参考

    Introduction to virtio-networking and vhost-net

    Deep dive into Virtio-networking and vhost-net

    Vhost-net Device IOTLB