成年无码Av片在线观如果后端模拟确立升级了

  • 首页
  • 免费观 看成人网站
  • 将粗大挺进邻居人妻
  • 亚洲国产成人AV线
  • 伊人狼人大蕉香AV
  • 行房时间短怎么治
  • 成年无码Av片在线观如果后端模拟确立升级了
    发布日期:2022-09-23 07:05    点击次数:105
    纪录片免费下载网站成年无码Av片在线观 virtio基础篇

    1. virtio的建议

    系统编造化技巧是云议论最紧迫的中枢技巧之一。云议论平台的资源池化,资源斡旋科罚以及后续的动态分拨都是基于系统编造化技巧才得以终局的。在议论机系统中,主要有议论资源,存储资源和收集资源。是以,系统编造化技巧又不错细分为议论编造化,存储编造化和收集编造化。其中存储确立和收集确立一般都是除外设的姿色和CPU通过I/O总线勾通起来的,是以存储编造化和收集编造化又不错斡旋归类为I/O编造化技巧。咱们这里先容的virtio等于现时最流行的I/O编造化技巧。

    I/O编造化技巧不错分红两种,一种是全编造化,另外一种是半编造化。

    全编造化:Guest OS不表露我方是编造机,是以也就不需要修改Guest OS的驱动姿色。这么Guest OS移植性好,可是编造机的I/O性能不高。 半编造化:Guest OS表露我方是编造机,通过前端驱动和后端模拟确立彼此合营终局IO编造化。和全编造化比拟,半编造化技巧不错匡助大幅度进步编造机I/O的性能。当今在云议论场景中鄙俗使用的等于virtio在Linux上的具体终局,而且virtio照旧成为编造化I/O技巧的抽象接口范例和事实程序,即使非Linux系统也不错适用。

    2. virtio总体想象思惟

    virtio的总体想象思惟不错详细为以下四点:直觉,高效,程序化,可扩张。

    1) 直觉:virtio确立被想象的和之前的硬件确立同样,撑持常用的总线机制,比如中断和DMA。这么的想象使得驱动斥地人员简略快速上手,完成virtio确立驱动的斥地。

    2) 高效:virtio确立能撑持单独的输入和输出通道,在无数数据传送的时间也能保持高效。

    3) 程序化:对硬件架构和操作系统环境莫得依赖,撑持多种不同总线的传输机制(在virtio范例1.1中撑持PCI, MMIO和Channel I/O总线。比如在那些不撑持PCI的镶嵌式确立还不错通过使用MMIO的边幅使用virtio)。

    4) 可扩张:在virtio确立发现和确立开动化的时间通过引入特质位(Feature Bits)象征符终局动态适配的协商机制,简略保证virtio前端驱动和后端模拟确立之间的兼容性。

    3. virtio基甘心趣

    接下来,咱们以当今使用最鄙俗的QEMU/KVM场景为例子进一步讲明注解virtio的基甘心趣。编造机在物理主机上是一个QEMU的程度,运行在用户态。编造机里面的virtio前端驱动所央求的缓存被映射到确立空间中,也在QEMU的地址空间里,这么QEMU就不错通过分享内存的边幅对这些缓存进行读写操作。通过这么的边幅,终局了virtio前端驱动姿色(编造机Linux内核的驱动)和后端模拟确立(QEMU后端确立模拟姿色)之间数据传输的零复制,进而大幅度进步了编造机的I/O性能。

    virtio前后端在QEMU/KVM中的终局

    virtio在虚QEMU拟机内核中终局了前端驱动,在QEMU中终局了后端模拟确立,前后端之间通过编造部队(Virtqueue)通讯交换数据。针对不同的总线机制,virtio确立有不同的终局边幅,因为PCI确立是最鄙俗使用委果立,是以咱们以virtio的PCI网卡为例子进行汲引。virtio-net前后端的终局如图2所暗示。

    图[1]. virtio-net前后端在QEMU/KVM中的终局

    virtio确立发现和开动化

    在编造机启动之后, 熟妇virtio前端驱动会把我方象征成一个PCI确立,其中包括PCI厂家象征符,PCI确立象征符。这么编造机的内核不错基于这个象征符判断使用哪种驱动姿色。因为编造机中的Linux内核照旧包括了virtio驱动姿色,是以virtio驱动会被调用去开动化这个virtio确立。除了完成PCI确立频繁的开动化操作之外,virtio前端驱动还在开动化的流程中庸后端确立模拟姿色协商特质位(Feature Bits),并把最终的效果记载在确立状况(Device Status)中。具体的终局代码不错参考内核代码在linux-3.10.0-957.1.3.el7/drivers/virtio/virtio.c中的virtio_dev_probe()函数,如图2所示。

    图2. virtio确立开动化,协商特质并最终成立确立状况位

    这里有两个比较紧迫的数据结构需要先容一下。

    特质位(Feature Bits),用来暗示确立所能撑持的特质。在virtio确立开动化的时间,驱动会去读取特质位,何况告诉确立哪些是它能给与特质。如果后端模拟确立升级了,使能了某个新特质,可是编造机里面的驱动还不成识别的话,那么两者等于通过特质进行协商。 确立状况位(Device Status),用来暗示确立确现时状况。在virtio确立发现,开动化和特质协商的流程中,都不错张望确立状况位的边幅张望virtio确立的状况。比如,人妻少妇偷人精品视频virtio_CONFIG_S_FEATURES_OK暗示特质协商班师,virtio_CONFIG_S_DRIVER_OK暗示驱动照旧确立班师。 virtio网卡发送数据处理流程

    编造部队(Virtqueue)是被用来在virtio前端驱动和virtio后端模拟确立之间双向数据传输的数据结构。每个virtio确立都调度着一个或者多个编造部队。以virtio收集确立为例,它至少调度两个编造部队,一个用来存储要发送的数据,一个用来存储招揽的收条。每个编造部队数据结构都由三部分构成,分裂是descriptor table,available ring和used ring。

    descriptor table用来描述一组缓存,是virtio前端驱动创建的。仁爱存关系的信息主若是物理地址和长度;缓存数组的数目是有部队大小(Queue Size)决定的; available ring是给virtio前端驱动给virtio后端模拟确立传输数据时使用的,比如编造机用virtio-net确立发送数据的时间,所发送的数据就会先缓存在这里,再会告virtio后端模拟确立来读取;也等于说available ring的缓存,只可让前端写,后端读; used ring是给virtio后端模拟确立给virtio前端驱动传输数据时使用的,比如virtio后端模拟确立从tap收集接口收到数据之后,会把收到的数据缓存到这里,再会告virtio前端驱动姿色;也等于说used ring的缓存,只可让后端写,前端读;

    图3. Virtio范例中编造部队的界说

    图4. used ring和available ring在virtio范例中的界说

    底下咱们以编造机发送数据为例,结合Linux 3.10和QEMU1.5的代码终局,细心讲明一下在QEMU/KVM场景下具体的终局流程。

    virtio前端驱动填凑数据包,并发出见告

    QEMU编造机内的virtio网卡驱动在开动化的时间,会和其他的收集驱动同样注册发送函数xmit_skb()。具体的终局如图5,6所示,是以编造机内的virtio网卡发送数据的时间,会调用事前注册的函数xmit_skb()。要发送的数据会调用virtqueue_add_outbuf()扬弃在available ring中。最终在virtqueue_add_outbuf()函数中,会调用virtqueue_kick()函数,并进一步调用virtqueue_notify()函数。在virtqueue_notify()函数中,如图7所暗示的virtio前端通过I/O写寄存器的边幅见告virtio后端模拟确立。这部分前端驱动的代码在drivers/virtio/virtio_ring.c中。

    图5. virtio确立发送数据报文

    图6. virtio前端驱动见告QEMU

    图7. virtio见告函数最终会写寄存器

    KVM截获I/O后见告后端

    编造机virtio前端驱动姿色发送见告的函数最终是奉行I/O写教唆。在QEMU/KVM环境中,编造机奉行I/O教唆,会触发VMExit。在KVM的VMExit代码中会判断退出的原因,I/O操作对应的处理函数是handle_io(),具体的代码在linux-3.10.0-957.1.3.el7/arch/x86/kvm/vmx.c,如图8所示。最终再经由KVM见告到QEMU中的virtio-net后端模拟确立,其中还波及到KVM和eventfd等通讯机制,因限于篇幅在这里不细心描述了。

    图8. KVM中处理I/O操作导致的VMExit代码

    virtio后端模拟确立处理见告

    如图8所暗示的,在招揽到来自KVM的见告之后,QEMU后端确立模拟姿色会调用virtio_queue_host_notifier_read()函数,进而调用事前注册的函数virtio_ioprt_write()处理来自前端驱动的I/O写操作。在招揽到前端发来的见告之后,会调用virtio_queue_notify()函数进行处理。在招揽收集数据包的时间,virtio_queue_notify()会再进一步调用virtio-net收集确立注册的数据包招揽函数virtio_net_handle_rx()。如图9所暗示的,在qemu_flush_queued_packets()中,QEMU会把数据复制到对应的部队中(QEMU中对应后端的不同tap都调度着不同的部队),之后再调用qemu_notify_event()见告virtio前端,最终会调用kvm_set_irq()触发vCPU的中断的边幅见告virtio前端。

    图9. virtio后端确立招揽见告后的处理

    图10. virtio-net事前注册的数据报招揽函数

    图11. virtio后端确立处理前端发送的数据包

    参考荟萃:

    【1】Deep dive into Virtio-networking and vhost-net(https://www.redhat.com/en/blog/deep-dive-virtio-networking-and-vhost-net)

    本文转载自微信公众号「Linux阅码场」,不错通过以下二维码暖和。转载本文请推敲Linux阅码场公众号。

    孙雷,曾在梦想询查院和NEC询查院职责10年,任资深询查员,研发司理。

    精致云议论底层技巧,包括软件界说收集(SDN),云收集(OpenStack),

    数据面加快等等。

    2020年起脱手创业,北京守节科技有限公司首创人。