admin 管理员组

文章数量: 887021

VIRTIO

        也无风雨也无晴。- 苏轼(宋)

        为了快速能够访问VIRTIO相关文章,这里设置穿越门:

VIRTIO-BLK代码分析(0)概述

VIRTIO-BLK代码分析(1)VIRTIO设备的模拟

VIRTIO-BLK代码分析(2)VIRTIO驱动分析

VIRTIO-BLK代码分析(3)数据流处理

VIRTIO-BLK代码分析(4)VIRTIO设备中断的注入

VIRTIO-BLK代码分析(5)virtqueue通信

VIRTIO-SCSI代码分析(1)VIRTIO SCSI设备模拟

VIRTIO-SCSI代码分析(2)VIRTIO 驱动分析

VIRTIO-SCSI代码分析(3)VIRTIO SCSI数据流处理

 VHOST-SCSI代码分析(0)VHOST概述

VHOST-SCSI代码分析(1)VHOST SCSI设备模拟

VHOST-SCSI代码分析(2)VHOST SCSI驱动分析

VHOST-SCSI代码分析(3)数据流处理

VHOST-SCSI代码分析(4)VHOST KICK机制

VHOST-SCSI代码分析(5)VHOST CALL机制

         接下来介绍VIRTIO相关内容。首先从VIRTIO-BLK开始分析,VIRTIO-BLK各部分交互图如下所示:

这里包含以下几个部分:

  1. Guest UserSpace:虚拟机用户空间,如虚拟机中运行fio等;
  2. Guest KernelSpace:虚拟机内核空间,它包含IO存储软件栈以及virtio-blk驱动;
  3. QEMU:作为Host UserSpace,负责为虚拟机模拟virtio设备;
  4. Host Kernel Space:KVM用于虚拟机中MMIO处理以及中断注入;IO栈和block驱动用于将IO下发给硬件或硬件处理完成后向上传递;
  5. Virtqueue:用于VIRTIO驱动与VIRTIO设备之间通信;

首先对图中IO请求下发过程(蓝色箭头)作介绍。

  1. 步骤1,虚拟机中用户态应用如fio进行IO下发;
  2. 步骤2,这里IO栈包含VFS,文件系统,通用block层,block调度层,它建立硬盘和内存数据的映射,存储和组织数据,作IO请求的下发,在block调度层作IO的合并和切分(详细见之前博文);
  3. 步骤3,virtio-blk驱动,在准备好数据并加入到virtioqueue后,虚拟机中访问MMIO(类似doorbell寄存器)陷入到KVM中;
  4. 步骤4,KVM将上述异常操作分发给QEMU;
  5. 步骤5,QEMU中模拟virtio device根据支持的io类型作IO下发;
  6. 步骤6,类似于步骤2,只不过当前是host上,建立硬盘和内存数据的映射,存储和组织数据,作IO请求的下发,在block调度层作IO的合并和切分;
  7. 步骤7,BLOCK驱动将IO请求真正下发给硬件;

在硬件完成数据处理后,IO请求完成过程(红色箭头)如下:

  1. 步骤1,硬件完成数据处理后以中断或其他方式(轮询)通知BLOCK层驱动;
  2. 步骤2,IO完成信息经过IO栈各层传递;
  3. 步骤3,IO完成信息返回到QEMU进程,经过处理并传递给virtio device;
  4. 步骤4,QEMU调用virtio_notify(),当MSIX中断时写对应内存访问到KVM;
  5. 步骤5,KVM对虚拟机注入中断,通知虚拟机数据处理完成;
  6. 步骤6和7作IO完成信息在各层逐步传递,最终返回给虚拟机中fio;

本文标签: VIRTIO