一、virtio基础

参考文章:

Virtio: An I/O virtualization framework for Linux

virtio: Towards a De-Facto Standard For Virtual I/O Devices

Virtio on Linux

为什么需要virtio?

在半虚拟化技术问世之前,Hypervisor主要依赖于传统的全虚拟化技术来模拟硬件设备。在全虚拟化架构中,Hypervisor需要完整地模拟底层物理设备及其通信机制,也就是通过软件的方式完全模拟一个硬件[1]。虽然这种完全抽象的模拟方式能“欺骗”Guest,使其认为自己正在使用一个真正的硬件外设,但其实现复杂度高、性能开销大的固有缺陷也尤为明显。具体而言,每次Guest对设备的访问都需要经过多层的特权级切换和上下文转换,导致系统整体性能显著下降[2]。

Rusty Russell为了支持他的虚拟化方案Lguest,开发了virtio框架[3],该框架实现了一种新的虚拟化方案——半虚拟化。这种虚拟化技术不再需要Hypervisor 完全模拟硬件,而是由Guest与Hypervisor共同合作以提高设备模拟效率。



在半虚拟化环境中。Guest操作系统知道其运行在虚拟机之中,并且加入了作为前端的驱动程序【Para-drivers】。Hypervisor为特定设备模拟实现后端驱动程序。这里的前后端驱动就是virtio的架构的组成部分,为模拟设备的访问的开发提供标准化接口,以提高代码重用率及增加效率。

观察图一可以发现,Guest需要与Hypervisor协同完成设备模拟。在这种半虚拟化架构中,Guest能够明确感知自身处于虚拟化环境,因此不再直接使用特权指令,而是通过"Hypercall"机制主动向Hypervisor发起服务请求。这种机制的工作原理是:当Guest OS需要执行特权操作时,不再触发会引发VM Exit的敏感指令,而是直接调用预定义的Hypercall接口,通过寄存器传递参数,以类似于函数调用的方式将请求传递给Hypervisor。

virtio架构

除了前端驱动和后端驱动之外,virtio架构还专门定义了两个中间层,用于实现前后端之间的高效通信。这两层中的上层称之为virtio层,该为虚拟队列接口,它将前端驱动与后端驱动在逻辑上连接起来。驱动可以根据需要使用0-N条队列。例如,virtio网络驱动使用两条队列,分别用于收发数据,而virtio块设备驱动仅使用一条队列。虚拟队列作为虚拟化设施,在当前的virtio实现中采用环形缓冲区(rings)结构来跨越Guest和Hypervisor的边界。但是具体实现方式可以是任意的,只要Guest和Hypervisor保持一致的实现标准即可。



上图展示了virtio的架构,系统为五种设备类型提供了前端驱动支持,分别是块设备驱动,网络设备驱动,PCI模拟驱动balloon驱动(用于动态管理客户机内存使用)以及控制台驱动。

[1]: VM/370—A study of multiplicity and usefulness

[2]: What is server virtualization? The ultimate guide

[3]: virtio: towards a de-facto standard for virtual I/O devices

virtio 学习随笔 —— 一、virtio基础的更多相关文章

  1. Python基础知识学习随笔

    Python学习随笔:PyCharm的错误检测使用及调整配置减少错误数量 Python学习随笔:获取当前主机名和用户名的方法 博客地址:https://blog.csdn.net/LaoYuanPyt ...

  2. (转)深度学习word2vec笔记之基础篇

    深度学习word2vec笔记之基础篇 声明: 1)该博文是多位博主以及多位文档资料的主人所无私奉献的论文资料整理的.具体引用的资料请看参考文献.具体的版本声明也参考原文献 2)本文仅供学术交流,非商用 ...

  3. Python学习一:序列基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...

  4. 深度学习word2vec笔记之基础篇

    作者为falao_beiliu. 作者:杨超链接:http://www.zhihu.com/question/21661274/answer/19331979来源:知乎著作权归作者所有.商业转载请联系 ...

  5. Hive入门学习随笔(一)

    Hive入门学习随笔(一) ===什么是Hive? 它可以来保存我们的数据,Hive的数据仓库与传统意义上的数据仓库还有区别. Hive跟传统方式是不一样的,Hive是建立在Hadoop HDFS基础 ...

  6. typeScript学习随笔(一)

    TypeScript学习随笔(一) 这么久了还不没好好学习哈这么火的ts,边学边练边记吧! 啥子是TypeScript  TypeScript 是 JavaScript 的一个超集,支持 es6 标准 ...

  7. PyQt学习随笔:QTextEdit和QTextBrowser删除光标所在行内容的方法

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在使用QTextBrowser用于记录输出日志,并 ...

  8. PyQt(Python+Qt)学习随笔:QDial刻度盘部件功能简介

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 Designer中的Dial刻度盘输入部 ...

  9. PyQt(Python+Qt)学习随笔:QSlider滑动条部件功能简介

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 Designer输入部件中的Horizo ...

  10. PyQt(Python+Qt)学习随笔: QDoubleSpinBox浮点数字设定部件简介

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在<PyQt(Python+Qt)学习随笔: ...

随机推荐

  1. Java集合--HashMap底层原理可视化,秒懂扩容、链化、树化

    文章内容较长,带着疑问慢慢读. 文章对应的视频连接:https://www.bilibili.com/video/BV1wM3KzaE3d/ 哈希冲突问题如何高效解决? 1. 什么是冲突? 准确的说是 ...

  2. .NET Core如何通过认证机制访问Kafka?

    大家好,我是Edison. 最近有一个ASP.NET Core使用认证机制访问Kafka的需求,加之我们又使用了CAP这个开源项目使用的Kafka,于是网上寻找了一番发现对应资料太少,于是调查了一番, ...

  3. 【深入理解 volatile】内存可见性与同步机制详解

    1. 引言 在多线程编程中,共享变量的可见性和同步问题一直是开发者面临的挑战.Java 提供了 volatile 关键字来确保变量的可见性和有序性,但它并不保证原子性.本文将深入探讨 volatile ...

  4. github action的使用

    近年来,我一直在使用jenkins 来部署自己的项目,发现太耗内存了, 因此将自动化部迁的操作改为使用github action. 初始化action配置 选择一个合适的action类型,比如webp ...

  5. 开发工具系列002-Webstorm常用快捷键

    command + C 复制 command + V 粘贴 command + X 剪切 command + D 复制当前行或选中的区块 command + F 在当前文档执行搜索(查找) comma ...

  6. API服务平台,系统架构无状态设计

    RestCloud API服务编排平台系统架构采用无状态设计,支持Docker容器化部署,特别适用于大型企业的业务中台以及数据中台的API服务聚合层,把企业各业务中心或服务聚合.编排后的API发布成为 ...

  7. Linux 给文件夹或者文件增加权限-九五小庞

    chmod -R 777 文件夹 参数-R是递归的意思 777表示开放所有权限   chmod 777 test.sh chmod +x 某文件 如果给所有人添加可执行权限:chmod a+x 文件名 ...

  8. REPO 命令大全

    repo forall -c 'echo $REPO_PROJECT':得到所有仓库的名称 repo forall -c 'echo $REPO_PATH': 得到所有仓库的本地路径 repo for ...

  9. 【InnoDB优化的两大法器】内存池与后台线程解析

    InnoDB 存储引擎的体系架构是其高性能.事务安全性和崩溃恢复能力的核心,主要围绕内存池(In-Memory Structures) 和后台线程(Background Threads) 两大组件进行 ...

  10. HelpSteer2 与 StackExchange 谁是偏好建模的 “最佳拍档”?

    1.数据基础对比 对比纬度 StackExchange HelpSteer2 数据来源 基于 Stack Overflow.Server Fault 等多个问答社区的真实用户互动内容. 主要来自客户支 ...