当前位置: 首页 > article >正文

存储虚拟化的写入过程

存储虚拟化的场景下,整个写入的过程。

  • 在虚拟机里面,应用层调用 write 系统调用写入文件。
  • write 系统调用进入虚拟机里面的内核,经过 VFS,通用块设备层,I/O 调度层,到达块设备驱动。
  • 虚拟机里面的块设备驱动是 virtio_blk,它和通用的块设备驱动一样,有一个 request  queue,另外有一个函数 make_request_fn 会被设置为 blk_mq_make_request,这个函数用于将请求放入队列。
  • 虚拟机里面的块设备驱动是 virtio_blk 会注册一个中断处理函数 vp_interrupt。当 qemu 写入完成之后,它会通知虚拟机里面的块设备驱动。
  • blk_mq_make_request 最终调用 virtqueue_add,将请求添加到传输队列 virtqueue 中,然后调用 virtqueue_notify 通知 qemu。
  • 在 qemu 中,本来虚拟机正处于 KVM_RUN 的状态,也即处于客户机状态。
  • qemu 收到通知后,通过 VM exit 指令退出客户机状态,进入宿主机状态,根据退出原因,得知有 I/O 需要处理。
  • qemu 调用 virtio_blk_handle_output,最终调用 virtio_blk_handle_vq。
  • virtio_blk_handle_vq 里面有一个循环,在循环中,virtio_blk_get_request 函数从传输队列中拿出请求,然后调用 virtio_blk_handle_request 处理请求。
  • virtio_blk_handle_request 会调用 blk_aio_pwritev,通过 BlockBackend 驱动写入 qcow2 文件。
  • 写入完毕之后,virtio_blk_req_complete 会调用 virtio_notify 通知虚拟机里面的驱动。数据写入完成,刚才注册的中断处理函数 vp_interrupt 会收到这个通知。

此文章为12月Day1学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。


http://www.kler.cn/a/153015.html

相关文章:

  • jsoup登录日志平台后调企业微信机器人自动发送错误日志告警
  • 基于数据挖掘的智能停车场运营数据分析系统(毕业论文)
  • 前向与反向过程的全连接与链式求导法则
  • SAP 使用STVARV维护选择条件
  • jdk8、jdk9中,接口的新特性
  • js数组方法大全(开发必会)
  • 3-docker-基于ubuntu镜像构建redis镜像
  • 【2】基于多设计模式下的同步异步日志系统
  • Redis 如何批量删除指定前缀的Key
  • js数组排序方法
  • [Firefly-Linux] RK3568 Ubuntu固件分区详解
  • RISCV汇编与Linux内核传参
  • Open3D 点对点的ICP配准算法
  • 【Unity入门】脚本生命周期简介及MonoBehaviour常用方法
  • logback-spring.xml的内容格式
  • PyQt基础_012_对话框类控件QInputDialog
  • Android 13.0 修改Android系统的通知自动成组的数量
  • 语音信号处理:librosa
  • Springboot 集成Redis
  • 分布式架构demo