QEMU源码全解析 —— virtio(2)

接前一篇文章:

本文内容参考:

《趣谈Linux操作系统》 —— 刘超,极客时间

QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社

特此致谢!

上一回对于virtio进行了简介,并说明了其基本原理以及框架。对于virtio框架,再来回顾一下。

virtio框架如下图所示:

virtio是一种利用半虚拟化技术提供I/O性能的框架,其是一种前后端架构,包括前端驱动(Front-End Driver)后端设备(Back-End Device)以及自身定义的传输协议

  • 前端驱动

前端驱动为虚拟机内部的virtio模拟设备对应的驱动,每一种前端设备都需要有对应的驱动才能正常运行。前端驱动的主要作用是:1)接收用户态的请求;2)然后按照传输协议将这些请求进行封装;3)再写I/O端口;4)发送一个通知到QEMU的后端设备。

  • 后端设备

后端设备则是在QEMU中,用来接收前端驱动发过来的I/O请求,然后从接收的数据中按照传输协议的格式进行解析。对于网卡等需要实际物理设备交互的请求,后端驱动会对物理设备进行操作,从而完成请求,并且会通过中断机制通知前端驱动。

  • virtio队列

virtio前端和后端驱动的数据传输通过virtio队列(virtio queue,virtqueue)完成,一个设备会注册若干个virtio队列,每个队列负责处理不同的数据传输。这些队列有的是控制层面的队列、有的是数据层面的队列。virtqueue是通过vring实现的。vring是虚拟机和QEMU之间共享的一段环形缓冲区。当虚拟机需要发送请求到QEMU的时候就准备好数据,将数据描述放到vring中,写一个I/O端口。然后QEMU就能够从vring中读取数据信息,进而从内存中读出数据。QEMU完成请求之后,也将数据结构存放在vring中,前端驱动也就可以从vring中得到数据。

此处也有另外一种观点和视角,将virtio架构分为四层:

  • 前端驱动

首先,在虚拟机里面的virtio前端,针对不同类型的设备有不同的驱动程序,但是接口都是统一的。例如,硬盘就是virtio_blk,网络就是virtio_net。

  • 后端设备

其次,在宿主机的QEMU里边,实现virtio后端的逻辑,主要就是操作硬件的设备。例如,通过写一个物理机硬盘上的文件来完成虚拟机写入硬盘的操作。再如,向内核协议栈发送一个网络包完成虚拟机对于网络的操作。

  • virtio层与virtio-ring层

在virtio的前端和后端之间,有一个通信层,里边包括virtio层和virtio-ring层。virtio这一层实现的是虚拟队列接口,算作前后端通信的桥梁;而virtio-ring则是该桥梁的具体实现。

virtio使用virtqueue进行前端与后端的高速通信。不同类型的设备队列数目不同。virtio-net使用两个队列,一个用于接收、另一个用于发送;而virtio-blk仅使用一个队列。

如果客户机要向宿主机发送数据,则它会将数据的buffer添加到virtqueue中,然后通过写入寄存器通知宿主机。这样宿主机就可以从virtqueue中收到buffer里边的数据了(与前述机制一个意思:当虚拟机需要发送请求到QEMU的时候就准备好数据,将数据描述放到vring中,写一个I/O端口。然后QEMU就能够从vring中读取数据信息,进而从内存中读出数据。QEMU完成请求之后,也将数据结构存放在vring中,前端驱动也就可以从vring中得到数据)。

欲知后事如何,且看下回分解。

相关推荐

  1. QEMU解析 —— virtio(6)

    2023-12-13 08:44:04       71 阅读
  2. QEMU解析 —— virtio(8)

    2023-12-13 08:44:04       49 阅读
  3. QEMU解析 —— virtio(12)

    2023-12-13 08:44:04       49 阅读
  4. QEMU解析 —— virtio(10)

    2023-12-13 08:44:04       64 阅读
  5. QEMU解析 —— virtio(27)

    2023-12-13 08:44:04       37 阅读
  6. QEMU解析 —— PCI设备模拟(6)

    2023-12-13 08:44:04       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-13 08:44:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-13 08:44:04       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-13 08:44:04       87 阅读
  4. Python语言-面向对象

    2023-12-13 08:44:04       96 阅读

热门阅读

  1. scala---03

    2023-12-13 08:44:04       57 阅读
  2. TrustGeo论文问题理解

    2023-12-13 08:44:04       70 阅读
  3. 常见的设计模式-简述

    2023-12-13 08:44:04       61 阅读
  4. PHP中GET和POST方法的区别是什么?

    2023-12-13 08:44:04       57 阅读
  5. 机器学习---KNN案例

    2023-12-13 08:44:04       61 阅读
  6. 使用 Vue 3 框架编写的简单日历组件

    2023-12-13 08:44:04       60 阅读
  7. CSS学习

    CSS学习

    2023-12-13 08:44:04      49 阅读
  8. Halcon 深度学习语义分割

    2023-12-13 08:44:04       51 阅读
  9. 影视泛目录如何快速提升百度,搜狗权重?

    2023-12-13 08:44:04       58 阅读
  10. StyleSync 开源部分总结

    2023-12-13 08:44:04       55 阅读
  11. vscode 常用 Emmet Abbreviation 快捷方式

    2023-12-13 08:44:04       63 阅读