0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

系统虚拟化技术virtio总体设计思想

Linux阅码场 来源:Linux阅码场 作者:孙雷 2021-05-07 15:40 次阅读

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所表示。

ceb1c860-aa73-11eb-9728-12bb97331649.png

图[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所示。

cecad90e-aa73-11eb-9728-12bb97331649.png

图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的缓存,只能让后端写,前端读;

cede38dc-aa73-11eb-9728-12bb97331649.png

图3. Virtio规范中虚拟队列的定义

cf135292-aa73-11eb-9728-12bb97331649.png

cf1af182-aa73-11eb-9728-12bb97331649.png

图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中。

cf2a1bb2-aa73-11eb-9728-12bb97331649.png

图5. virtio设备发送数据报文

cf3a4c26-aa73-11eb-9728-12bb97331649.png

图6. virtio前端驱动通知QEMU

cf4d8746-aa73-11eb-9728-12bb97331649.png

图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等通信机制,因限于篇幅在这里不详细描述了。

cf5f0a20-aa73-11eb-9728-12bb97331649.png

图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前端。

cf7473f6-aa73-11eb-9728-12bb97331649.png

图9. virtio后端设备接收通知后的处理

cf86599a-aa73-11eb-9728-12bb97331649.png

图10. virtio-net预先注册的数据报接收函数

cf974a52-aa73-11eb-9728-12bb97331649.png

原文标题:孙雷: 虚拟化之——virtio-net基础篇

文章出处:【微信公众号:Linuxer】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 云计算
    +关注

    关注

    39

    文章

    7856

    浏览量

    138031
  • 虚拟化
    +关注

    关注

    1

    文章

    387

    浏览量

    29878

原文标题:孙雷: 虚拟化之——virtio-net基础篇

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    hyper v 虚拟,Hyper-V 虚拟:Hyper-V虚拟的最佳实践

    :Hyper-V虚拟的最佳实践。    在当今的IT环境中,Hyper-V虚拟技术被广泛应用于企业级和数据中心环境中,以实现资源的高效利
    的头像 发表于 02-07 10:24 89次阅读
    hyper v <b class='flag-5'>虚拟</b><b class='flag-5'>化</b>,Hyper-V <b class='flag-5'>虚拟</b><b class='flag-5'>化</b>:Hyper-V<b class='flag-5'>虚拟</b><b class='flag-5'>化</b>的最佳实践

    中科曙光服务器虚拟系统通过国家认证

    近日,中科曙光自主研发的多款“服务器虚拟系统”产品成功获得国家保密科技测评中心的产品检测证书,成为首批符合新虚拟
    的头像 发表于 01-09 10:20 208次阅读

    RAID 5 在虚拟环境中的应用

    随着信息技术的飞速发展,虚拟技术已经成为数据中心和企业IT基础设施的重要组成部分。虚拟
    的头像 发表于 12-27 17:18 446次阅读

    深入KVM虚拟之构建高效、可扩展的虚拟环境

    的计算机,而且每个逻辑计算机 它可以是不同操作系统 虚拟技术:可以扩大硬件容量,单个cpu模拟出多个cpu并行, 允许一个平台上同时运行多个操作
    的头像 发表于 11-26 17:22 599次阅读
    深入KVM<b class='flag-5'>虚拟</b><b class='flag-5'>化</b>之构建高效、可扩展的<b class='flag-5'>虚拟</b><b class='flag-5'>化</b>环境

    eBPF技术实践之virtio-net网卡队列可观测

    系统领域中,最具挑战性的问题通常是组件之间的边界定位。其中,virtio-net前后端的定界尤为困难。当网络报文从内核发送到virtio-net后端,或者从virtio-net后端发
    的头像 发表于 11-14 11:18 293次阅读
    eBPF<b class='flag-5'>技术</b>实践之<b class='flag-5'>virtio</b>-net网卡队列可观测

    虚拟数据恢复—UFS2文件系统数据恢复案例

    虚拟数据恢复环境: SAN环境下通过iSCSI实现FreeNAS,FreeNAS采用的UFS2文件系统。物理存储架构在一台服务器上,另外两台服务器上安装ESXi虚拟
    的头像 发表于 11-11 11:02 238次阅读

    虚拟数据恢复—XenServer虚拟机数据恢复案例

    Server操作系统虚拟机,该虚拟机有2块虚拟磁盘(系统盘+数据盘),当作网站服务器使用。 服务器
    的头像 发表于 11-08 10:32 205次阅读
    <b class='flag-5'>虚拟</b><b class='flag-5'>化</b>数据恢复—XenServer<b class='flag-5'>虚拟</b>机数据恢复案例

    emc虚拟技术的应用场景

    在当今的数字化时代,企业面临着数据爆炸式增长和业务需求不断变化的挑战。为了应对这些挑战,企业需要灵活、高效且可扩展的IT基础设施。EMC虚拟技术正是在这样的背景下应运而生,它通过将物理资源抽象
    的头像 发表于 11-01 15:26 456次阅读

    云计算中的虚拟技术应用

    云计算中的虚拟技术是一种将计算机物理实体(如服务器、存储设备、网络设备)通过软件技术划分为多个虚拟实体的
    的头像 发表于 10-24 09:22 966次阅读

    什么是虚拟机?什么是虚拟

    在日新月异的科技世界中,虚拟技术如同一座桥梁,连接着现实与数字的鸿沟,为我们打开了全新的计算维度。虚拟机,这一概念,自其诞生以来,就以其独特的魅力和强大的功能,深深地影响了软件开发、
    的头像 发表于 09-04 14:55 1255次阅读

    虚拟数据恢复—XenServer虚拟平台数据恢复案例

    虚拟数据恢复环境: 某品牌R720服务器,4块STAT硬盘通过H710P阵列卡组建了一组raid10磁盘阵列。服务器上部署XenServer虚拟平台,
    的头像 发表于 07-30 13:18 313次阅读
    <b class='flag-5'>虚拟</b><b class='flag-5'>化</b>数据恢复—XenServer<b class='flag-5'>虚拟</b><b class='flag-5'>化</b>平台数据恢复案例

    讯维数字孪生可视系统:开启智慧医疗虚拟手术训练新纪元

    讯维数字孪生可视系统在智慧医疗虚拟手术训练领域的应用,标志着该领域进入了全新的纪元。该系统通过集成先进的数字孪生技术和可视
    的头像 发表于 05-07 16:30 536次阅读

    水电站闸门远程控制系统建设方案介绍

    国科ZK4000系列水电站闸门远程控制系统,采用了计算机、光纤网络通讯和现场总线、现地控制单元、传感器、测控软件等多种现代技术,遵循“技术先进、安全可靠、经济适用”等原则,以计算机监
    的头像 发表于 04-15 11:37 451次阅读
    水电站闸门远程控制<b class='flag-5'>系统</b>建设方案介绍

    水电站闸门远程智能控制系统解决方案概述

    国科ZK4000系列水电站闸门远程控制系统,采用了计算机、光纤网络通讯和现场总线、现地控制单元、传感器、测控软件等多种现代技术,遵循“技术先进、安全可靠、经济适用”等原则,以计算机监
    的头像 发表于 04-15 11:33 832次阅读
    水电站闸门远程智能控制<b class='flag-5'>系统</b>解决方案概述

    配电系统实施总体综合设计方案

    配电系统实施总体思路:根据屏体用电量,现场施工要求,以及配电柜所带负荷情况,总体综合设计配电系统
    发表于 03-06 10:31 493次阅读
    配电<b class='flag-5'>系统</b>实施<b class='flag-5'>总体</b>综合设计方案