欣赏网站,怎么做网页才能置顶,怎样做交互式网站,穆棱建设局网站接前一篇文章#xff1a; 本文内容参考#xff1a;
《趣谈Linux操作系统》 —— 刘超#xff0c;极客时间
《QEMU/KVM》源码解析与应用 —— 李强#xff0c;机械工业出版社
特此致谢#xff01; virtio简介
对于一台虚拟机而言#xff0c;除了要虚拟化CPU和内存 本文内容参考
《趣谈Linux操作系统》 —— 刘超极客时间
《QEMU/KVM》源码解析与应用 —— 李强机械工业出版社
特此致谢 virtio简介
对于一台虚拟机而言除了要虚拟化CPU和内存当然也要虚拟化外部设备这其中最为典型和关键的是存储和网络。那么这些外部设备应该如何虚拟化呢
全虚拟化 当然一种方式方案还是完全虚拟化。使用QEMU完全模拟设备比如有什么样的硬盘或网卡设备就使用QEMU模拟一个一模一样的软件的硬盘和网卡设备。这样在虚拟机里边的操作系统看来使用这些设备和使用物理设备是一样的。传统的设备模拟中虚拟机内部设备驱动完全不知道自己处在虚拟化环境中。对于网络和存储等I/O操作会走完整的“虚拟机内核栈 - QEMU - 宿主机内核栈”。虽然在这种方式下做到了完全而真正的虚拟化但QEMU又充当了翻译官的角色每个指令都需要与翻译在此过程“虚拟机内核栈 - QEMU - 宿主机内核栈”中会产生很多的VM Exit和VM Entry性能很差实在是太慢了。
半虚拟化 另一种方式方案是半虚拟化。虚拟机里边的操作系统不是一个通用的操作系统它知道自己是运行在虚拟机里边的也清楚使用的硬盘和网络等设备都是虚拟的应该加载特殊的驱动才能运行。这些特殊的驱动往往要通过虚拟机里外配合工作的模式来加速对于物理存储设备和网络设备等的使用。而本段的主角——virtio就是采用的此种方式。
virtio方案是旨在提高性能的一种优化方案在该方案中虚拟机能够感知到自己处于虚拟化环境并且会加载相应的virtio总线驱动和virtio设备驱动。 virtio基本原理
在虚拟化技术的早期不同的虚拟化技术会针对不同硬盘物理存储和网络等设备实现不同的驱动。虚拟机里边的操作系统也要根据不同的虚拟化技术及物理存储和网络设备选择加载不同的驱动。但是由于硬盘设备和网络设备太多了驱动纷繁芜杂。
后来就慢慢形成了一定的标准这就是virtio。顾名思义virtio就是virtual io的缩写也即虚拟化I/O设备的意思。virtio负责对于虚拟机提供统一的接口。也就是说在虚拟机里边的操作系统加载的驱动以后都统一加载virtio就可以了。
半虚拟化的基本原理如下图所示 上图主要包括两部分内容一个是VMM创建出模拟的设备另一个是操作系统内部安装好该模拟设备的驱动这个驱动和设备之间使用对应的接口进行通信。
以e1000网卡为例在传统的全虚拟化方式下虚拟机内核中的网卡驱动还是与具体的硬件设备相同也就是说QEMU模拟的是e1000的网卡。虚拟机操作系统还是通过传统的方式进行包的收发。e1000以及其它模拟设备网卡的驱动在收发包的时候会有很多次的写网卡寄存器或者IO端口的操作这会导致VM Exit使得网卡的性能比较差与上边提到的一致。
而在半虚拟化环境下设备和驱动都是新的、专门用来适应虚拟化环境的。虚拟机中的设备驱动与QEMU中的虚拟网卡设备定义一套自己的协议进行数据传输通过自己约定的接口可以很方便地进行通信。
virtio即是这样一种利用半虚拟化技术提供I/O性能的框架。virtio框架如下图所示 virtio是一种前后端架构包括前端驱动Front-End Driver和后端设备Back-End Device以及自身定义的传输协议。通过传输协议virtio不仅可以用于QEMU/KVM方案也可以用于其它的虚拟化方案。如虚拟机可以不必是QEMU而也可以是其它类型的虚拟机后端不一定要在QEMU中实现也可以在内核中实现这实际上就是vhost方案。
接下来对以上三个组件做简单介绍
前端驱动
前端驱动为虚拟机内部的virtio模拟设备对应的驱动每一种前端设备都需要有对应的驱动才能正常运行。前端驱动的主要作用是1接收用户态的请求2然后按照传输协议将这些请求进行封装3再写I/O端口4发送一个通知到QEMU的后端设备。
后端设备
后端设备则是在QEMU中用来接收前端驱动发过来的I/O请求然后从接收的数据中按照传输协议的格式进行解析。对于网卡等需要实际物理设备交互的请求后端驱动会对物理设备进行操作从而完成请求并且会通过中断机制通知前端驱动。
virtio队列
virtio前端和后端驱动的数据传输通过virtio队列virtio queuevirtqueue完成一个设备会注册若干个virtio队列每个队列负责处理不同的数据传输。这些队列有的是控制层面的队列、有的是数据层面的队列。virtqueue是通过vring实现的。vring是虚拟机和QEMU之间共享的一段环形缓冲区。当虚拟机需要发送请求到QEMU的时候就准备好数据将数据描述放到vring中写一个I/O端口。然后QEMU就能够从vring中读取数据信息进而从内存中读出数据。QEMU完成请求之后也将数据结构存放在vring中前端驱动也就可以从vring中得到数据。
vring的基本原理如下图所示 vring包含三个部分
第一部分是描述符表Descriptor Table用来描述I/O请求的传输数据信息包括地址、长度等信息
第二部分是可用的vringAvailable Vring这是前端驱动设置的表示后端设备可用的描述符表中的索引
第三部分是已经使用的vringUsed Vring这是后端设备在使用完描述符表后设置的索引这样前端驱动可以知道哪些描述符已经被用了。 欲知后事如何且看下回分解。