在使用virtio-blk的情况时,virtio notify使用的ioeventfd机制,原因是为了提高性能,能够较快速的回到guest中运行。具体是如何建立这个ioeventfd的呢?流程理出来了,细节没看:

1、在guest中,virtio-blk的初始化或者说是在探测virtio-blk之前

virtio_dev_probe|-->add_status|-->dev->config->set_status[vp_set_status]|-->iowrite8(status, vp_dev->ioaddr + VIRTIO_PCI_STATUS)

这里就产生VM exit到Qemu中了,而在Qemu中有如下的处理:

2、Qemu中建立ioeventfd的处理流程:

virtio_pci_config_write|-->virtio_ioport_write|-->virtio_pci_start_ioeventfd|-->virtio_pci_set_host_notifier_internal|-->virtio_queue_set_host_notifier_fd_handler|-->memory_region_add_eventfd|-->memory_region_transaction_commit|-->address_space_update_ioeventfds|-->address_space_add_del_ioeventfds|-->eventfd_add[kvm_mem_ioeventfd_add]|-->kvm_set_ioeventfd_mmio|-->kvm_vm_ioctl(...,KVM_IOEVENTFD,...)

最后这一步就切换到kvm内核模块中来通过KVM_IOEVENT来建立ioeventfd:

3、kvm内核模块中建立ioeventfd:

kvm_ioeventfd
|-->kvm_assign_ioeventfd

在这个流程中为某段区域建立了一个ioeventfd,这样的话guest在操作这块区域的时候就会触发ioeventfd(这是fs的eventfd机制),从而通知到Qemu,Qemu的main loop原先是阻塞的,现在有ioevent发生之后就可以得到运行了,也就可以做对virtio-blk相应的处理了。

那么当guest对该块区域内存区域进行写的时候,势必会先exit到kvm内核模块中,kvm内核模块又是怎么知道这块区域是注册了event的呢?是怎么个流程呢?

只使用EPT的情况下,guest对一块属于MMIO的区域进行读写操作引起的exit在kvm中对应的处理函数是handle_ept_misconfig,下面就看下具体的流程:

handle_ept_misconfig
|-->x86_emulate_instruction|-->x86_emulate_insn|-->writeback|-->segmented_write|-->write_emulated[emulator_write_emulated]|-->emulator_read_write|-->emulator_read_write_onepage|-->ops->read_write_mmio[write_mmio]|-->vcpu_mmio_write|-->kvm_io_bus_write|-->__kvm_io_bus_write|-->kvm_iodevice_write|-->ops->write[ioeventfd_write]

在ioeventfd_write函数中会调用文件系统eventfd机制的eventfd_signal函数来触发相应的事件。
上述就是整个ioeventfd从创建到触发的流程!!!!

原文链接:https://blog.csdn.net/LPSTC123/article/details/45111949

KVM中ioeventfd创建与触发的大致流程(十四)相关推荐

  1. setitimer 创建两个定时器_JavaScript第二十四篇 高级定时器(下)

    数组分块 所谓数组分块,就是当你发现某个循环占用了大量时间,同时对于上述两个问题,你的回答都是"否",那么你就可以使用定时器分割这个循环. 思路是结合定时器进行递归调用定时器 基本 ...

  2. kernel 3.10代码分析--KVM相关--虚拟机创建\VCPU创建\虚拟机运行

    分三部分:一是KVM虚拟机创建.二是VCPU创建.三是KVM虚拟机运行 第一部分: 1.基本原理 如之前分析,kvm虚拟机通过对/dev/kvm字符设备的ioctl的System指令KVM_CREAT ...

  3. KVM中virtio实现(九)

    一.什么是 vhost vhost 是 virtio 的一种后端实现方案,在 virtio 简介中,我们已经提到 virtio 是一种半虚拟化的实现方案,需要虚拟机端和主机端都提供驱动才能完成通信,通 ...

  4. vscode设置templates_Vscode中快速创建自定义代码模板的方法

    Vscode中快速创建自定义代码模板 一招鲜,吃遍天,学会了这个在Vscode中快速创建自定义代码模板的教程,我相信创建其它代码模板的方法你也就通个七七八八了. 我就以Vue的创建为例,不过我这个Vu ...

  5. KVM中Virtio网络的演化之路

    作为一个开放的标准接口,virtio一直在云计算与虚拟化中扮演着重要的角色.而virtio网络接口,作为virtio标准支持下最复杂的接口之一,在虚拟机/容器网络加速.混合云加速中一直扮演着重要角色. ...

  6. vscode vue解决跨域_在vs code 中如何创建一个自己的 Vue 模板代码

    首先,在vs code 中打开定义模板代码的地方 第一步,点击"设置"图标按钮,在弹出的菜单中点击的"用户代码片段"(也就是模板) 第二步,在弹出的框中选择新建 ...

  7. 在KVM中部署嵌套版本的VMware ESXi 6.7

    在KVM中部署嵌套版本的VMware ESXi 6.7 如果您在Ubuntu服务器上运行KVM,则您已经拥有出色的Type 1虚拟化引擎.幸运的是,如果您需要测试特定于VMware的产品,则始终可以运 ...

  8. GIC/ITS代码分析(13)LPI中断虚拟化之KVM中ITS设备的模拟

    1 ITS设备的注册 ITS设备和GIC设备通过函数kvm_register_device_ops()注册不同的操作函数,如下所示: 2 系统调用KVM_CREATE_DEVICE 在QEMU中会调用 ...

  9. kvm中支持SCSI硬盘接口

    在KVM中安装ubuntu14(硬盘接口采用SCSI),可以正常安装,但是安装centos7却不行,原因是Centos7中没有SCSI驱动. 在ubuntu中用lsmod命令查看,可以发现ubuntu ...

最新文章

  1. Java 日志体系详解
  2. 【MPI编程】任意节点数的蝶形求和(高性能计算)
  3. 第2章:Maven的安装/2.2 Linux下的安装
  4. C语言system函数(C语言程序中执行命令行)
  5. 2020-05-02 自动控制原理常用术语
  6. Windows 7 BitLocker 体验
  7. 机器学习实战 Tricks —— 训练数据均值标准差标准化测试样本
  8. Json 转换 1 转成 true 0 转成false
  9. 微信小程序:wx.getUserInfo 接口的变动与使用
  10. whey some page need header when your fetch that page and some don't need
  11. Android textwatcher监听文本框输入变化
  12. 2022-2027年(新版)中国石油化工行业发展建议及投资前景展望报告
  13. 编1加到100的代码用C语言,用C语言编写一个程序,计算从1加到100的和,并将结果输出。跪求代码,急!...
  14. c++ 去除字符串首尾的空白字符
  15. ROS2探索(五)intra-process的内部原理
  16. 初学Java(三)——学习准备
  17. 使用思博伦Avalanche进行HTTP双向吞吐量测试 _双极未来
  18. 决胜经典算法之冒泡排序
  19. 这5个app一定能让你的生活变得五颜六色!有趣的人手机上都装有哦
  20. 七种水果不能空腹食用

热门文章

  1. python有哪些作用-你都用Python来做什么,它对你来说有什么作用?
  2. python教程是用什么博客写的-Python 有哪些好的学习资料或者博客?
  3. python笔记本-如何用Python在笔记本电脑上分析100GB数据(上)
  4. 如何自学python爬虫-Python初学者如何从网络爬虫到机器学习?
  5. python爬虫实例100-Python 练习实例1
  6. anaconda怎么运行python程序-致Python初学者 Anaconda入门使用指南完整版
  7. python基础知识面试题-基础篇--【python】面试题汇总
  8. Jetson nano安装JupyterLab
  9. feign框架设计与实现
  10. mybatis中的mapper设计与原理