eventfd

virtio中,guest和vhost通过evnetfd通知对方,见(Virtio ring and virtio-net)。

REF:

Qemu-kvm的ioeventfd创建与触发的大致流程

virtio的eventfd机制浅析 ( ioctl(KVM_IOEVENTFD, struct kvm_ioeventfd)  )

QEMU下的EVENTFD机制及源代码分析 (huatong写的,还写了很多不错的文章)

代码分析(Rng为例)

1. Rng的activate会启动一个thread,run RngEpollHandler

queue_evts 会通过activate 传给 RngEpollHandler

2. RngEpollHandler run, 实现了epool QUEUE_AVAIL_EVENT 和 KILL_EVENT, 进行处理。

queue处理完成后,还会通知signal_used_queue

3. write_bar的时候会 activate

4. rust-vmm/kvm-ioctls 的VmFd通过register_ioevent注册event

/// Registers an event to be signaled whenever a certain address is written to.
///
/// See the documentation for `KVM_IOEVENTFD`.

5.  ioeventfds 会遍历queue_evts

6. vm初始化,add_virtio_pci_device会register_ioevent

irqfd

VHOST通过irqfd通知guest。irqfd需要绑定一个eventfd.

rust-vmm/kvm-ioctls 的VmFd通过register_irqfd注册irqfd

REF:

KVM VHOST中irqfd的使用

关于Linux虚拟化技术KVM的科普 科普二(KVM虚拟机代码揭秘)  (一共写了5个科普)

KVM中断虚拟化主要依赖于VT-x技术,VT-x主要提供了两种中断事件机制,分别是中断退出>
和中断注入。

中断退出:指虚拟机发生中断时,主动式的客户机发生VM-Exit,这样能够在主机中实现对>
客户机中断的注入。

中断注入:是指将中断写入VMCS对应的中断信息位,来实现中断的注入,当中断完成后通过
读取中断的返回信息来分析中断是否正确。

中断注入的标志性函数kvm_set_irq,是中断注入的最开始。

Qemu-kvm模拟APIC Timer中断

qemu-kvm 中斷虛擬化代碼分析

qemu-kvm 中断虚拟化 (qemu-kvm 中断虚拟化)

KVM中断虚拟化浅析

kvm 中断以及io虚拟化

KVM 中断系统结构关系

qemu-kvm 中断虚拟化代码分析

代码分析(Rng为例子)

1. VirtioPciDevice 有个 interrupt_cb   field

2. assign_pin_irq 和 assign_msix用来设置interrupt_cb

assign_msix 注入中断 (msi_cb)(InterruptParameters { msix: Some(entry) })

// In case the vector control register associated with the entry
// has its first bit set, this means the vector is masked and the
// device should not inject the interrupt.
// Instead, the Pending Bit Array table is updated to reflect there
// is a pending interrupt for this specific vector.

3. vm初始化,add_virtio_pci_device是会 assign_pin_irq 和 assign_msix ,register_irqfd

4. msi_cb 和 irq_cb 的参数都是 InterruptParameters 类型,就是一个MsixTableEntry

signal_msi返回msi_cb

irq_cb会调用service_irq来注入中断

service_irq 调用rust-vmm/kvm-ioctls 的VmFd的signal_msi方法注入中断

5. MsixConfig 实现了 read_table 和 write_table,

MsixConfig包括table_entries, pba_entries, interrupt_cb和masked字段。

write_table会调用inject_msix_and_clear_pba注入中断

5.1 write_config_register 也会调用 set_msg_ctl 注入中断

6.  VirtioPciDevice new的时候会new msix_config

7.  read_bar的时候会read_table, write_bar的时候会write_table

8. 对于VFIO来说,会设置中断路由, update_msi_interrupt_routes(调用了set_kvm_routes)

Interrupt.update_msi -> VfioMsix.update  -> set_msg_ctl -> inject_msix_and_clear_pba

vmm-sys-util

rust-vmm 的 vmm-sys-util 实现了很多utilities, 包括eventfd,ioctrl,poll,signal.

实现了eventfd的new, write, read, clone等基本操作。

https://github.com/rust-vmm/vmm-sys-util/tree/master/src

FYI:

PBA (Pending Bit Array)

MSI-HOWTO.txt

rust-vmm 学习(二)的更多相关文章

  1. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  2. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  3. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  4. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  5. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  6. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  7. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  8. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

  9. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

  10. SpringMVC入门学习(二)

    SpringMVC入门学习(二) ssm框架 springMVC  在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...

随机推荐

  1. 新安装jenkins要记录的点。

    突然很早之前部署的jenkins 由于版本低存在漏洞,被人搞了,在docker中新安装jenkins出现了各种问题,避免跳坑. 不能正确安装插件, Jenkins -> Plugin Manag ...

  2. java之spring mvc之拦截器

    1. springmvc 中的拦截器是由实现 HandlerInterceptor 或者继承 HandlerInterceptorAdapter 来实现的. 2. 自定义实现一个拦截器的步骤: a). ...

  3. 利用jQuery-Word-Export导出word (含ECharts)

      写在前面的话:写博客的初衷是想把自己学到的知识总结下来,在写的过程中,相当于又把知识梳理了一遍.我坚信有输入,有输出,技术才会进步.我一般都会自己写一个小demo,测试没有问题,再进行整理. 在实 ...

  4. PS利用蒙版抠图

    扣图除了用锁套工具外,用蒙版时一个比较快的方法. 前期准备 首先准备一个PS CS6和一个神仙姐姐,一定要先Ctrl+J复制一份图层(不然待会神仙姐姐就找不到了). 使用色阶及反相获取轮廓 使用色阶使 ...

  5. 【i.MX6UL/i.MX6ULL开发常见问题】单独编译内核,uboot生成很多文件,具体用哪一个?

    [i.MX6UL/i.MX6ULL开发常见问题]2.3单独编译内核,uboot生成很多文件,具体用哪一个? 答:内核编译出来的文件是~/MYiR-imx-Linux/arch/arm/boot/目录下 ...

  6. Web网站实现facebook登录

    一.登录facebook开发者中心:https://developers.facebook.com 二.创建应用编号,如下图: 三.添加产品选择Facebook登录,如下图: 四.facebbok登录 ...

  7. 创建Spring boot project报错:Project build error: Non-resolvable parent POM for xxx:0.0.1-SNAPSHOT: Could not transfer artifact org.springframework.boot:spring-boot-starter-parent

    刚开始创建Spring boot项目时,pom.xml文件时报如下图错误: 在网上百度的说让更新下Maven的update project,我试了没用,最后将version版本改了就行了,我原来版本是 ...

  8. scrapy 图片管道学习笔记

    使用scrapy首先需要安装 python环境使用3.6 windows下激活进入python3.6环境 activate python36 mac下 mac@macdeMacBook-Pro:~$ ...

  9. static 关键字在java语言中的特性

    ​ 一,将自己注入到一个静态变量中实现静态类,如下写法 以上方法的目的是要实现一个静态类,方便用类名获取对象实例,一般情况下调用普通方法需要对象实例.这对象要么new出来,要么spring的注入如下是 ...

  10. HTML+Css+JavaScript知识点汇总

    HTML 部分 HTML基础知识 1. HTML简介 HTML(Hypertext Markup Language),超文本标记语言,HTML利用各种标记来标识文档的结构以及标识超链接的信息.它是从S ...