virtio笔记

最近在看虚拟化相关的东西,以virtio-console为例,记录下。
此文只是学习笔记,文中肯定有不少错误,不要参考

devicemd侧:

virtio_console.c中,初始化会对port->cb赋值为
viritio_console_control_tx,此函数会根据后端不同,最终将log输出到标准输出/pty/file。

那么是谁调的port-cb?,是virtio_console_notify_tx,同样是初始化时,对这个console->queues[i].notify函数指针进行赋值为virtio_console_notify_tx。

那么是谁调的console->queues[i].notify函数指针呢?
是virtio.c中的virtio_set_iothread,这是一个callback handler,他是在virtio_set_iothread时被初始化赋值。

谁掉的virtio_set_iothread?他是vritio_pci_write的一个case,
virtio_pci_write会被virtio_console.c的.vdev_bar_write所引用。

而.vdev_bar_write 会被devicemodel/hw/pci/core.c.c中的pci_emul_io_handler和pci_emul_mem_handler调用。

再上的调用先不追,我们先看virtio_set_iothread:

此函数除了设置callback handler,还建立epoll做监听,检测上报来执行handler,
同时还会ioctl,把notify注册给内核驱动,
servervm的driver/virt/acrn/ioeventfd.c中的acrn_io_range_add会注册这个io range,如果有事件被监听到,将会signal上层,virtio_set_iothread注册的handler会被执行,如果是console事件,会调用port->cb做打印

那么内核里是如何监听并收集事件的呢?
先看看如何监听的:
当新一个vm被创建时ioctl->acrn_vm_create->acrn_ioeventfd_init->acrn_ioreq_client_create会创建内核线程ioreq_task,这个线程会做循环检测has_pending_request,如果有执行handler,这个handler是acrn_ioeventfd_handler,在上级传参进来被注册,acrn_ioeventfd_handler会查看事件addr size是否被注册,如果被注册,就上报上层。

那内核是如何收集事件的呢,也就是说has_pending_request如何检测到有pending_request?
在arch/x86/kernel/cpu/acrn.c中会HYPERVISOR_CALLBACK_VECTOR这个irq的callback,这个callback会调用acrn_intr_handler,这是个函数指针,他最后调用的是/drver/virt/acrn/ioreq.c 中的ioreq_intr_handler, 在hsm driver初始化时就被调用注册。
这个handler会执行工作队列ioreq_wq的handler:ioreq_dispatch->wake_up_interruptable,同时设置bitmap,这样刚才内核的has_pending_request就被检测到了。
说白了就是hypervisor会向servervm 注入中断,servervm收到中断后,会做些处理,同时唤醒一个循环检测的内核线程,一切条件符合内核线程把事件上报到上层。

hypervisor如何向server vm 注入总断的呢?
这个很好追,hypervisor中的get_hsm_notification_vector()会得到这个中断vector,acrn_fire_hsm_interrupt会向server vm 注入这个中断,
他的上级是acrn_insert_request,这个函数在emulate_io中进行调用,emulate_io的逻辑是会把捕获的io请求现在hybervisor里模拟,如果模拟不了,会发给server vm 进行模拟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3D学习之UI系统——UGUI

文章目录 1. 前言2 六大基础组件概述3 Canvas——渲染模式的控制3.1 Canvas作用3.2 Canvas的渲染模式3.2.1 Screen Space -Overlay 覆盖模式3.2.2 Screen Space - Camera 摄像机模式3.2.3 World Space 4 CanvasScaler ——画布缩放控制器4.1 Constant Pixel Size 恒定像素模式4…

考研数据结构笔记(5)

单链表的查找 按位查找(O(n))按值查找(O(n))单链表长度(O(n))小结 基于带头结点的代码 按位查找(O(n)) 按值查找(O(n)) 单链表长度(O(n)) 小结

五官行为检测(表情基)解决方案提供商

随着人工智能技术的日益成熟,情感识别与行为分析在企业界的应用逐渐广泛。美摄科技作为业内领先的五官行为检测(表情基)解决方案提供商,致力于为企业提供高效、精准的情感识别与行为分析服务。 美摄科技的五官行为检测&#xff0…

【lesson47】进程通信之system V(共享内存)补充知识

文章目录 补充知识 补充知识 进行通信的key值问题,进程要通信的对方进程怎么能保证对方能看到,并且看到的就是该进程创建的共享内存的。 所以就通过key值来标识共享内存,key值是几不重要,只要在系统里是唯一的即可。 这样server和…

【C语言】变量与常量

一、变量的定义与名称 变量定义的一般形式&#xff1a;<数据类型名称><变量名称>; int price0&#xff1b; •这一行&#xff0c;定义了一个变量。变量的名字是price&#xff0c;类型是int&#xff0c;初始值是0。 •变量是一个保存数据的地方&#xff0c;当我们需…

CentOS7集群配置免密登录

准备工作 提前开启三台虚拟机hadoop102、hadoop103,hadoop104,关于三台虚拟机的安装可以参考&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/136010108 配置免密登录 一、分别修改三台机器的hosts,配置主机映射关系 vim /etc/hosts 文件中输入以下内容&#xf…

利用Pybind11封装Python版的WiringPi!

原版的WiringPi是一个用于树莓派的GPIO库&#xff0c;用C语言开发&#xff0c;仓库地址&#xff1a;https://github.com/WiringPi/WiringPi。该库允许用户以编程方式访问和控制树莓派的GPIO引脚。而随着Python在嵌入式设备上的快速发展&#xff0c;其对底层引脚的操作也变得越来…

【人工智能】聊聊Transformer,深度学习的一股清流(13)

嘿&#xff0c;大家好&#xff01;今天我们来聊一聊深度学习领域的一位“大明星”——Transformer模型。这个模型的提出可不得了&#xff0c;让自然语言处理领域焕发了新生。 在深度学习领域&#xff0c;Transformer模型架构的引入标志着一场革命&#xff0c;它改变了自然语言处…

linux系统定时任务管理

crontab使用 一、crontab简介 crontab 这个指令所设置的工作将会循环的一直进行下去&#xff01;可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外&#xff0c;亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生效的服务则是 crond 这个服…

【开源】基于JAVA+Vue+SpringBoot的假日旅社管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统介绍2.2 QA 问答 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿评论4.3 查询民宿新闻4.4 新建民宿预订单4.5 查询我的民宿预订单 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的假日旅社…

《小狗钱钱》读书笔记——如何看待金钱

目录 前言 作者 经典摘录 1、 了解致富的规律&#xff0c;一开始&#xff0c;必须明确金钱对你的意义 2、 梦想储蓄罐和梦想相册 3、认真去找机会 4、主人公吉娅的财富路径 5、注意财富积累本质 写在最后 前言 尽管[ 智慧是无法传授的], 但读书可以启发思路&#xff0…

30岁还一事无成,怎么办?

前些日子&#xff0c;知乎有一个话题&#xff0c;特别火。 原话是&#xff1a;30岁&#xff0c;如果你还没当上管理层&#xff0c;或者在某个领域取得成就&#xff0c;那你一辈子基本也就这样了。 这句话一出&#xff0c;戳中了许多人的软肋&#xff0c;一时间群情哗然。 理由是…

Electron基本介绍

Electron基本介绍 Electron 官方网站&#xff1a;https://www.electronjs.org/zh/ Electron安装方法&#xff1a;npm install electron -g 全局安装 Electron简介&#xff1a;Electron提供了丰富的本地&#xff08;操作系统&#xff09;API&#xff0c;使你能够使用纯JavaScr…

golang设置

golangci-lint 代码检查工具的集合&#xff0c;聚集了多种 Go 代码检查工具&#xff0c;如 golint 会自动查找项目中的 .golangci.yml 配置文件 会检查代码中潜在常见问题以及代码风格问题 # 文档&#xff1a;https://golangci-lint.run/ # https://github.com/golangci/golang…

leetcode——滑动窗口题目汇总

本章总结一下滑动窗口的解题思路&#xff1a; 在字符串中使用双指针 left 和 right 围成的一个左闭右开的区域作为一个窗口。不断将 right 向右滑动&#xff0c;直到窗口中的字符串符合条件。此时将 left 向右滑动&#xff0c;直到窗口中的字符串不符合条件&#xff0c;期间需…

Django中的SQL注入攻击防御策略

Django中的SQL注入攻击防御策略 SQL注入是一种常见的网络安全威胁&#xff0c;可以导致数据库被非法访问和数据泄露。本文将介绍在Django框架中防止SQL注入攻击的关键方法&#xff0c;包括使用参数化查询、使用ORM、进行输入验证和使用安全的编码实践。 SQL注入是一种利用应用程…

SpringBoot:多环境配置

多环境配置demo代码&#xff1a;点击查看LearnSpringBoot02 点击查看更多的SpringBoot教程 方式一、多个properties文件配置 注意&#xff1a;创建properties文件,命名规则&#xff1a;application-&#xff08;环境名称&#xff09; 示例&#xff1a;application-dev.proper…

循环神经网络(RNN)简介与应用

循环神经网络&#xff08;RNN&#xff09;简介与应用 一、RNN基本概念二、RNN原理解析2.1 RNN网络结构RNN网络主要组件输入层(Input)&#xff0c;隐藏层(Hidden State)&#xff0c;输出层(Output)循环单元(Recurrent Unit)权重参数(Weights)和偏置项(Bias) RNN的数据流向时间步…

算法刷题day10

目录 引言一、最长上升子序列二、地宫取宝三、波动数列 引言 今天是大年三十&#xff0c;提前祝大家新的一年天天开心&#xff0c;事事如意&#xff0c;过年把身体精神修养好后&#xff0c;年后继续朝着目标奋斗&#xff0c;然后加油吧&#xff01; 一、最长上升子序列 标签&…

Android截屏方法

// 截屏方法private void getSnapshot() {wView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));wView.layout(0, 0, wView.getMeasuredWidth(), wView.getMeasuredHeight(…