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

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.lryc.cn/news/297454.html

相关文章:

  • 初始web服务器(并基于idea来实现无需下载的tomcat)
  • 软件文档测试
  • 从零开始手写mmo游戏从框架到爆炸(七)— 消息封装
  • 从Unity到Three.js(画线组件line)
  • LCP 30. 魔塔游戏 - 力扣(LeetCode)
  • 数据结构——单向链表和双向链表的实现(C语言版)
  • TCP和UDP相关问题(重点)(4)——4.使用TCP的协议有哪些?使用UDP的协议有哪些?
  • Python进阶--爬取美女图片壁纸(基于回车桌面网的爬虫程序)
  • [office] excel如何计算毛重和皮重的时间间隔 excel计算毛重和皮重时间间隔方法 #笔记#学习方法
  • Pandas 对带有 Multi-column(多列名称) 的数据排序并写入 Excel 中
  • 如何为Kafka加上账号密码(一)
  • Elasticsearch的Index Lifecycle Management(ILM)
  • 2、学习 Nacos 注册中心
  • Java 如何操作 nginx 服务器上的文件?
  • 时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测
  • 中创ET4410 台式LCR数字电桥 简单开箱测评
  • 格式化dingo返回内容
  • QGIS编译(跨平台编译)之四十六:minizip编译(Windows、Linux、MacOS环境下编译)
  • MySQL进阶查询篇(1)-索引的类型与创建
  • 【STL】list模拟实现
  • 常用的文件系统、存储类型小整理
  • Java写标准输出进度条
  • leetcode 算法 69.x的平方根(python版)
  • 【golang】24、go get 和 go mod:indrect 与 go mod tidy
  • AI算法工程师-非leetcode题目总结
  • 2.6:冒泡、简选、直插、快排,递归,宏
  • FastDFS安装并整合Openresty
  • 93 log4j-slf4j-impl 搭配上 log4j-to-slf4j 导致的 StackOverflow
  • 客户端会话技术-Cookie
  • rsa加密登录解决方案