rust-vmm 学习(二)
eventfd
virtio中,guest和vhost通过evnetfd通知对方,见(Virtio ring and virtio-net)。
REF:
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:
关于Linux虚拟化技术KVM的科普 科普二(KVM虚拟机代码揭秘) (一共写了5个科普)
KVM中断虚拟化主要依赖于VT-x技术,VT-x主要提供了两种中断事件机制,分别是中断退出>
和中断注入。
中断退出:指虚拟机发生中断时,主动式的客户机发生VM-Exit,这样能够在主机中实现对>
客户机中断的注入。
中断注入:是指将中断写入VMCS对应的中断信息位,来实现中断的注入,当中断完成后通过
读取中断的返回信息来分析中断是否正确。
中断注入的标志性函数kvm_set_irq,是中断注入的最开始。
qemu-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)
rust-vmm 学习(二)的更多相关文章
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- Hbase深入学习(二) 安装hbase
Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- Quartz学习--二 Hello Quartz! 和源码分析
Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...
- SpringCloud学习(二):微服务入门实战项目搭建
一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...
- DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer
DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...
- SpringMVC入门学习(二)
SpringMVC入门学习(二) ssm框架 springMVC 在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...
随机推荐
- linux服务器同时运行两个或多个tomcat
第一步:条件:配置好jdk,如果没有配置好请看:https://www.cnblogs.com/weibanggang/p/11460537.html 第二步:下载安装tomcat 下载tomcat到 ...
- MVC Filter的使用方法
相信对权限过滤大家伙都不陌生 用户要访问一个页面时 先对其权限进行判断并进行相应的处理动作 在webform中 最直接也是最原始的办法就是 在page_load事件中所有代码之前 先执行一个权限判断的 ...
- 【WEB基础】HTML & CSS 基础入门(2)选取工具:VS2019安装使用
前面 子曰“工欲善其事,必先利其器”.开始编写HTML代码前,我们该选择一款编辑工具,实际上,HTML作为标记语言,我们甚至可以直接用记事本来编写HTML代码,但记事本实在弱爆了.这里推荐使用Visu ...
- Linux系统怎么分区
linux分区方法,不同的人有不同的方法,反正没有统一的方法.在分区方面,我觉得根据自己的实际情况来分是最好的.玩linux也有好几年了,下面说一下,我在分区方面的一些经验. 一,个人用 如果是个人用 ...
- docker安装mysql5.6(win10家庭版)
闲话不多说,打开之前已经安装好的客户端Docker Quickstart Terminal,安装方法请看上一篇,链接地址:https://www.cnblogs.com/jimmyshan-study ...
- 8 个 Python 实用脚本,赶紧收藏备用!
脚本写的好,下班下得早!程序员的日常工作除了编写程序代码,还不可避免地需要处理相关的测试和验证工作. 例如,访问某个网站一直不通,需要确定此地址是否可访问,服务器返回什么,进而确定问题在于什么.完成这 ...
- A quick introduction to Source Insight for seamless development platform between Linux and Windows
前言 Source Insight是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++, C#和Java等程序的分析.能分析源代码并在工作的同时动态维护它自己的符号数据库,并自动显示有 ...
- c风格的字符串
c风格的字符串的标注库 #include <cstring> 使用c 风格的字符串,牢记,其必须以null为结束标志 如 char ca[]={'c','+','='}; cout< ...
- spring cloud (八) Config client 和项目公共配置
1 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- rhce 考试题目总结
rhce 考试题目总结归类 开机需要做的事: 检查系统版本 配置yum源 修改selinux的模式 ping一下server机器 1.分区类题目 1.1 rhcsa 第十五题 添加swap分区 要点: ...