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

    文章

    8043

    浏览量

    144770
  • 虚拟化
    +关注

    关注

    1

    文章

    405

    浏览量

    30981

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    虚拟数据恢复】ESXI虚拟机还原快照致数据丢失?完整恢复方案解析

    虚拟技术作为虚拟技术的一种,在现代信息技术领域扮演着重要角色。
    的头像 发表于 03-12 15:17 215次阅读
    【<b class='flag-5'>虚拟</b><b class='flag-5'>化</b>数据恢复】ESXI<b class='flag-5'>虚拟</b>机还原快照致数据丢失?完整恢复方案解析

    高精度云台马达驱动板总体设计手册-艾毕胜

    高精度云台是视觉采集、光电跟踪、机载稳定系统的核心执行机构,马达驱动板作为云台的动力与控制核心,直接决定系统的定位精度、低速平稳性、响应速度与抗扰动能力。本手册针对高精度云台应用,明确驱动板总体设计
    的头像 发表于 03-04 14:15 262次阅读
    高精度云台马达驱动板<b class='flag-5'>总体设计</b>手册-艾毕胜

    机载系统智能的基石:分布式网络控制系统与容器虚拟技术的深度融合实践

    随着航空技术的飞速发展,机载系统正经历从传统分立式架构向高度综合、智能、自动方向的深刻变革。传统的
    的头像 发表于 01-27 09:13 790次阅读
    机载<b class='flag-5'>系统</b>智能<b class='flag-5'>化</b>的基石:分布式网络控制<b class='flag-5'>系统</b>与容器<b class='flag-5'>虚拟</b><b class='flag-5'>化</b><b class='flag-5'>技术</b>的深度融合实践

    开源鸿蒙技术大会2025丨虚拟与容器分论坛:构筑开源鸿蒙虚拟技术高地

    随着开源鸿蒙技术的快速发展,各行各业、各品类的生态设备加速融入生态,当数字世界的边界不断拓宽,我们正站在操作系统革命的十字路口。虚拟技术
    的头像 发表于 11-20 17:35 1065次阅读
    开源鸿蒙<b class='flag-5'>技术</b>大会2025丨<b class='flag-5'>虚拟</b><b class='flag-5'>化</b>与容器分论坛:构筑开源鸿蒙<b class='flag-5'>虚拟</b><b class='flag-5'>化</b><b class='flag-5'>技术</b>高地

    车载软件vECU虚拟测试解决方案

    虚拟测试:利用虚拟技术,实现将真实域控制器转化为虚拟域控制器,运行在PC或服务器环境中运行,
    的头像 发表于 10-30 09:34 1812次阅读
    车载软件vECU<b class='flag-5'>虚拟</b><b class='flag-5'>化</b>测试解决方案

    KVM虚拟环境部署与性能优化教程

    在云计算时代,虚拟技术已经成为企业IT基础设施的核心组件。作为一名在生产环境管理过上千台虚拟机的运维工程师,我深知选择正确的虚拟
    的头像 发表于 09-08 17:13 1780次阅读

    什么是服务器虚拟?一文读懂原理、优势与实战部署

    什么是服务器虚拟?当企业服务器CPU利用率长期低于15%,却仍需不断采购新硬件应对业务增长时,一场基础设施领域的革命早已悄然发生——服务器虚拟。这项
    的头像 发表于 08-25 10:52 1418次阅读
    什么是服务器<b class='flag-5'>虚拟</b><b class='flag-5'>化</b>?一文读懂原理、优势与实战部署

    RISC-V 虚拟堆栈和硬件的最新进展

    运行实时操作系统(RTOS)、高可靠性任务以及 Linux 等通用系统。   在云计算场景中,虚拟更是 “入场券”。它为云计算提供了高可用性,例如传统 CPU 遇到硬件故障、断电,操
    发表于 07-18 16:00 4049次阅读

    车用虚拟技术:域控融合的必经之路

    本文阐述了汽车电子架构从分布式向集中演进的趋势,黑芝麻智能分析了集中带来的安全隔离、实时性等关键挑战,并指出车用虚拟技术是实现域控融合
    的头像 发表于 07-05 16:14 1429次阅读

    智慧闸门远程控制系统的主要功能有哪些?

    ,辅以现地控制的指导思想,进行总体设计系统配置,保证系统投运后可实现“无人值班,少人值守”的要求。本系统具有自动
    的头像 发表于 06-11 15:36 835次阅读
    智慧闸门远程控制<b class='flag-5'>系统</b>的主要功能有哪些?

    虚拟数据恢复—XenServer虚拟平台上VPS不可用的数据恢复案例

    系统,运行Web服务器。有系统盘 + 数据盘两个虚拟机磁盘。 虚拟故障: 机房断电导致XenServer服务器中一台VPS(Xen
    的头像 发表于 05-30 11:35 813次阅读
    <b class='flag-5'>虚拟</b><b class='flag-5'>化</b>数据恢复—XenServer<b class='flag-5'>虚拟</b><b class='flag-5'>化</b>平台上VPS不可用的数据恢复案例

    虚拟电厂接入新型电力微电网管理系统

    虚拟电厂的基本概念 技术支持 安科瑞 程瑜 187 0211 2087 虚拟电厂是一种基于现代信息技术和能源互联网的能源管理模式,它将分散的、可再生能源和储能设备通过
    的头像 发表于 05-26 13:42 671次阅读
    <b class='flag-5'>虚拟</b>电厂接入新型电力微电网管理<b class='flag-5'>系统</b>

    鸿道Intewell操作系统实时虚拟技术的优势

    实时虚拟技术结合了实时性与虚拟的优势,通过硬实时调度算法和辅助隔离机制,广泛应用于工业控制、嵌入式
    的头像 发表于 05-15 15:13 559次阅读
    鸿道Intewell操作<b class='flag-5'>系统</b>实时<b class='flag-5'>虚拟</b><b class='flag-5'>化</b><b class='flag-5'>技术</b>的优势

    如何在Centos系统中部署KVM虚拟平台

    KVM 通过将 Linux 内核转换为一个裸机(bare-metal)管理程序(hypervisor),使得用户可以在单一物理主机上运行多个虚拟机(VM),每个虚拟机都拥有独立的操作系统和资源。这样的架构不仅提高了硬件资源的利用
    的头像 发表于 05-09 13:40 1031次阅读
    如何在Centos<b class='flag-5'>系统</b>中部署KVM<b class='flag-5'>虚拟</b><b class='flag-5'>化</b>平台

    基于云端虚拟技术云手机解决方案

    云手机解决方案基于云端虚拟技术,通过整合软硬件资源实现多设备集群化管理与智能操作,以下是针对不同应用场景的核心要素与技术架构解析: 一、
    的头像 发表于 05-09 08:04 983次阅读
    基于云端<b class='flag-5'>虚拟</b><b class='flag-5'>化</b><b class='flag-5'>技术</b>云手机解决方案