02月21, 2017

KVM QEMU中的virtio简单理解

今天我们聊聊KVM QEMU中的virtio。

Linux IO协议栈(虚拟机内

先看下linux IO协议栈,经过这么多年的发展,Linux IO的协议栈已经变的极为复杂。 alt

这里有一个简化版。我们可以从比较大的范围来看Linux IO协议栈。

Linux IO 协议栈分为以下几层:

  • 虚拟文件系统层:该层屏蔽了下层的具体操作,为上层提供统一的接口,如vfs_read,vfs_write等.vfs_read,vfs_write通过调用下层具体文件系统的接口来实现相应的功能.
  • 具体文件系统层:该层针对每一类文件系统都有相应的操作和实现了,包含了具体文件系统的处理逻辑.
  • page cache层:该层缓存了从块设备中获取的数据.引入该层的目的是避免频繁的块设备访问,如果在page cache中已经缓存了I/O请求的数据,则可以将数据直接返回,无需访问块设备.
  • 通用块层:接收上层的I/O请求,并最终发出I/O请求.该层向上层屏蔽了下层设备的特性. I/O调度层: 接收通用块层发出的 IO 请求,缓存请求并试图合并相邻的请求(如果这两个请求的数据在磁盘上是相邻的)。并根据设置好的调度算法,回调驱动层提供的请求处理函数,以处理具体的 IO 请求
  • 块设备驱动层:从上层取出请求,并根据参数,操作具体的设备.
  • 块设备层:真正的物理设备.

简单理解virtio

KVM 的 vitio 实现采用在 虚拟机内核中安装前端驱动 (Front-end driver)和在 QEMU 中实现后端驱动(Back-end)的方式。前后端驱动通过 vring 直接通信,这就绕过了经过 KVM 内核模块的过程,达到提高 I/O 性能的目的。

纯软件模拟的设备和 Virtio 设备的区别:virtio 省去了纯模拟模式下的异常捕获环节,Guest OS 可以和 QEMU 的 I/O 模块直接通信。

Host 数据发到 Guest:

  • KVM 通过中断的方式通知 QEMU 去获取数据,放到 virtio queue 中
  • KVM 再通知(hyper-call) Guest 去 virtio queue 中取数据。

扩展阅读:具体virtio的详细流程可以参考Virtio 基本概念和设备操作

本文链接:https://www.opsdev.cn/post/kvm-qemu-virtio.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。