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各部分交互图如下所示:
这里包含以下几个部分:
- Guest UserSpace:虚拟机用户空间,如虚拟机中运行fio等;
- Guest KernelSpace:虚拟机内核空间,它包含IO存储软件栈以及virtio-blk驱动;
- QEMU:作为Host UserSpace,负责为虚拟机模拟virtio设备;
- Host Kernel Space:KVM用于虚拟机中MMIO处理以及中断注入;IO栈和block驱动用于将IO下发给硬件或硬件处理完成后向上传递;
- Virtqueue:用于VIRTIO驱动与VIRTIO设备之间通信;
首先对图中IO请求下发过程(蓝色箭头)作介绍。
- 步骤1,虚拟机中用户态应用如fio进行IO下发;
- 步骤2,这里IO栈包含VFS,文件系统,通用block层,block调度层,它建立硬盘和内存数据的映射,存储和组织数据,作IO请求的下发,在block调度层作IO的合并和切分(详细见之前博文);
- 步骤3,virtio-blk驱动,在准备好数据并加入到virtioqueue后,虚拟机中访问MMIO(类似doorbell寄存器)陷入到KVM中;
- 步骤4,KVM将上述异常操作分发给QEMU;
- 步骤5,QEMU中模拟virtio device根据支持的io类型作IO下发;
- 步骤6,类似于步骤2,只不过当前是host上,建立硬盘和内存数据的映射,存储和组织数据,作IO请求的下发,在block调度层作IO的合并和切分;
- 步骤7,BLOCK驱动将IO请求真正下发给硬件;
在硬件完成数据处理后,IO请求完成过程(红色箭头)如下:
- 步骤1,硬件完成数据处理后以中断或其他方式(轮询)通知BLOCK层驱动;
- 步骤2,IO完成信息经过IO栈各层传递;
- 步骤3,IO完成信息返回到QEMU进程,经过处理并传递给virtio device;
- 步骤4,QEMU调用virtio_notify(),当MSIX中断时写对应内存访问到KVM;
- 步骤5,KVM对虚拟机注入中断,通知虚拟机数据处理完成;
- 步骤6和7作IO完成信息在各层逐步传递,最终返回给虚拟机中fio;
本文标签: VIRTIO
版权声明:本文标题:VIRTIO 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1698470667h302654.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论