ARM64内存虚拟化分析(8)coalesed MMIO处理

news2024/9/28 19:16:53

        从前面MMIO的处理可以看到,每次访问MMIO都会导致虚拟机退了到QEMU中。很多时候多个MMIO操作,这个时候可以先将前面的MMIO操作保存起来,等到最后一个MMIO的时候,再一起退出到QEMU中处理,这就是coalesced MMIO。目前只支持对写操作的coalesced MMIO。

1 coalesced MMIO相关的API

        首先介绍QEMU中部分Coalesced MMIO相关的API。

        函数memory_region_add_coalescing()将MR中偏移为offset大小为size的内存区域设置为coalesced mmio区域。

void memory_region_add_coalescing(MemoryRegion *mr,
                                  hwaddr offset,
                                  uint64_t size)

        函数memory_region_clear_coalescing()清除掉MR中的coalesced mmio区域。

void memory_region_clear_coalescing(MemoryRegion *mr)

        函数memory_region_set_flush_coalesced()将mr->flush_coalesced_mmio设置为true。

void memory_region_set_flush_coalesced(MemoryRegion *mr)

        函数memory_region_clear_flush_coalesced()首先会flush掉之前保存起来还未完成的MMIO操作,然后将mr->flush_coalesced_mmio设置为false。

void memory_region_clear_flush_coalesced(MemoryRegion *mr)

        函数memory_region_set_coalescing()首先将之前可能创建的coalesced MMIO去掉,然后再对整个MR区域设置为coalesced mmio区域。

void memory_region_set_coalescing(MemoryRegion *mr)

2 coalesced MMIO的实现

        在实现coalesced MMIO之前,虚拟机中对MMIO的每次访问,会立即陷入到EL2,最终通过QEMU中定义读写操作函数进行模拟。

        通常需要将MR的某段内存区域设置为coalesced MMIO后,后续对该段内存区域中的一个或多个连续写会被保存到ring中,不会对每个写都立即陷入到EL2,而是在下一次读或对其他区域写之前将保存在ring中的MMIO操作flush完成。

2.1 调用coalesced MMIO API设置coalesced MMIO

        以调用函数memory_region_add_calescing()将MR中一段内存区域设置为coalesced MMIO为例,讲述此过程。

  1. 分配CoalescedMemoryRange区域,并将其加和到mr->coalesced中;
  2. 依次遍历flatview中每个flatrange,若flatrange对应的MR与当前MR相符,进行下一步;
  3. 找到地址范围,若为增加coalesced MMIO时,通过系统调用KVM_REGISTER_COALESED_MMIO向KVM注册coalesced MMIO;
  4. 若为删除coalesced MMIO时,通过系统调用KVM_UNREGISTER_COALECED_MMIO向KVM注销coalesced MMIO;

2.2 往KVM注册/注销coalesced MMIO

        通过系统调用KVM_REGISTER_COALESCED_MMIO往KVM注册coalesced MMIO,过程如下:

(1)分配kvm_coalesced_mmio_dev;

(2)初始化该设备的操作回调,对于coalesced MMIO,仅定义write回调;

对于写回调coalesced_mmio_wirte(),当对coalesced MMIO写时,将数据缓存到ring中;

(3)将coalesced MMIO设备注册到系统中,类似于GIC/ITS;

(4)将设备添加到kvm->coalesced_zones中;

2.3 对coalesced MMIO的访问

        当对coalesced MMIO作写访问时,仍然会陷入到EL2 host上,调用coalesced_mmio_write()将数据缓存到ring中。

        当对coalesced MMIO作读访问时,仍然会陷入到EL2 host上(不作任何操作),返回到EL2 QEMU中,首先会flush掉之前缓存的coalesced MMIO操作,然后再执行QEMU中对应的读操作;

        对其他MMIO区域的读写访问时,首先陷入到EL2 host上,然后返回到EL2 QEMU中,先flush掉之前缓存coalesced MMIO操作,再执行QEMU中对应的读写操作。

        因此对于coalesced MMIO区域的真正写操作,是在对coalesced MMIO区域读操作或对其他MMIO域的读写访问时发生的,它会依次将ring中缓存的coalesced MMIO进行处理,过程如下:

 

 

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

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

相关文章

新概念1 课文和单词(2022/12/28)

前言: 学了多年的英语,在交流或写作中或多或少有用错的地方。估计看这篇博客的你,或许也和我遇到同样的问题。 为此找新概念系列书籍4本,作为系统性查漏补缺的工具。每天更新10课内容,从基础到提升。从简单到深入,循序…

CSS 特殊字符 ‘#‘ 、‘.’ 、‘*’、‘:’、空格“ ”、 ‘>’ , ‘,’

# 号&#xff1a; #号的作用是对应html中的标签的id属性&#xff0c;写法为#name。如#p1{...}会给<p id"p1">ID is p1</p>增加样式。具体事例如下&#xff1a; HTML代码&#xff1a; <div id"p1"> </div><!-- CSS代码&#…

How to use template

1. 模板变量 注意&#xff1a;在manage.py路径下启动shell My name is hjb 我们可以调用Template类中的render方法来对模板进行一个渲染&#xff0c;这时需要用一个Context来传递它&#xff0c;这个Context是一系列变量和他们值得一个集合得字典 首先建立&#xff0c;然后再vie…

IT运维工单高效协同,助力打造一站式运维方案

随着经济全球化的发展趋势&#xff0c;信息系统在企业运营中占据着愈发重要的位置。业务系统越来越多&#xff0c;用户对信息系统的依赖性越来越强&#xff0c;关键业务系统的中断都将导致企业业务、服务的中断&#xff0c;极大的影响了企业业务稳定运行和持续发展。因此企业需…

使用Visual Studio Installer打包Unity的exe应用

前言 Unity在PC端更新软件的方法。 一、下图是Unity发布出来的应用 二、安装Microsoft Visual Studio Installer Projects插件 &#xff08;1&#xff09;打开vs&#xff0c;我这里用的是vs2019 &#xff08;2&#xff09;点击扩展->管理扩展&#xff0c;如果没有安装过&…

注册 openAI 与 ChatGPT 一起对话

文章目录1. 背景2. 注册短信接受平台3. 注册 OpenAI 账号3.1 邮箱注册3.2 手机验证4. 登陆并对话5. 场景预备条件&#xff1a;科学上网 1. 背景 ChatGPT 是有史以来向公众发布的最好的人工智能聊天机器人。它由旧金山人工智能公司 OpenAI 构建&#xff0c;该公司还负责 GPT-3 …

坚鹏:中国邮政储蓄银行银行业同业竞争策略分析培训圆满结束

数字化转型背景下&#xff0c;中国邮政储蓄银行厦门市分行为了更好地落实总行十四五战略&#xff0c;特别举办了2022年管理干部赋能培训班。 银行业的竞争越来越激烈&#xff0c;银行数字化转型成为实现银行高质量发展的重要突破口&#xff0c;中国邮政储蓄银行厦门市分行充分认…

塔望3W消费战略案丨聚焦川崎火锅料,回归赛道一梯队

川崎 火锅料 客户&#xff1a;上海新川崎食品有限公司 品牌&#xff1a;川崎 服务&#xff1a;3W消费战略 品牌全案 项目背景 上世纪90年代&#xff0c;一句“吃火锅&#xff0c;没川崎怎么行”&#xff0c;响彻大江南北&#xff0c;让川崎走进千家万户&#xff0c;成为当时…

体育锻炼与饮食相结合:调节肠道菌群来预防治疗代谢性疾病

谷禾健康 久坐不动的生活方式已逐渐成为现代社会很多人的一种常态&#xff0c;因此导致2型糖尿病 、肥胖、心血管疾病和非酒精性脂肪肝等代谢性疾病的发病率上升。 ★ 代谢性疾病严重危害人体健康 根据世界卫生组织数据库&#xff0c;2019年&#xff0c;代谢风险&#xff08;即…

ubantu 配置及解决问题

1、安装GCC出现等待缓存锁 需要将其冲突的删除&#xff0c;利用下面三个代码后重新输入下载即可。 sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock2、开启共享文件夹&#xff1a; 参考以下链接&#xff0c;在进行的…

【KubeEdge】V-1.12.1 使用helm安装,并启用kubectl log/exec高级特性

内容提要&#xff1a; 云端使用helm安装cloudcore边缘端使用keadm join纳管到云端修改边缘端配置使其支持IptableManger把服务部署到边缘端&#xff0c;并体验kubeclt logs/exec ------------------------------------------------------------------------------------------…

基于MicroPython的ESP32开发

很久前入手了一块ESP32 DEVKIT V1&#xff0c;当时基于C_SDK开发。最近想搞下MicroPython&#xff0c;就又把这块板子找出来了。 一、先下载支持MicroPython的ESP32固件 去MicroPython官网下载对应的固件 我选择了最新版本固件。下载下来。 二、通过flash_download_tool_3.…

NodeJs

视频学习 Nodejs 基础 前提条件 学习Node.js 之前你必须掌握的知识 HTMLCSSJavaScript DOM APIBOM APIAjax API 如果你已经掌握或者学习了以上的知识&#xff0c;那么我们先来回顾一下以上的一些知识点 浏览器为什么能执行Java代码 不同的浏览器具有不同的JavaScript解析…

【Applied Algebra】物理学中的群论漫谈1:群论基础

物理学中的群论漫谈1:群论基础与希尔伯特空间 我准备开一个新系列谈谈群论在物理学中的应用,这样有两个好处:一是可以明白群论以及相关数学概念的具体应用,以此来举一反三懂得这些理论工具如何使用;而是可以通过这样的应用例子反过来更好地理解这些代数概念;参考书是约什(A.W.J…

myBaits Expert Whole Genome Enrichment (WGE) 从复杂的DNA来源捕获全基因组DNA

myBaits Custom WGE 是捕获全部核基因组序列的生物素化 RNA 探针&#xff0c;适用于从复杂的宏基因组样本(如环境或古代 DNA)中批量富集全基因组内源性 DNA。定制此探针无需考虑基因组是否已测序&#xff0c;仅需要提供研究生物或近缘生物的高质量基因组 DNA 样本。 使用传统的…

云原生|kubernetes|CKA备考和一些应试小技巧

前言&#xff1a; CKA认证相对来说还是比较简单的&#xff0c;在圣诞节前参与了2022的cka的考试&#xff0c;还算顺利的一次通过了。 在考前&#xff0c;也参考了一些前辈的备考经验和应试技巧&#xff0c;但考完后发现&#xff0c;很多资料说的并不准确&#xff0c;究其原因…

Spring Boot 一个注解解决重试机制

前言 在实际工作中,重处理是一个非常常见的场景,比如: 发送消息失败。 调用远程服务失败。 争抢锁失败。 这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便…

嵌入式C语言设计模式 --- 抽象工厂模式

1 - 什么是抽象工厂模式? 前面两篇文章,讲述了工厂模式里面的两种:简单工厂模式和工厂方法模式,这两种设计模式都有其各自的优缺点和适用场景。本篇文章继续讲述最后一种工厂模式,抽象工厂模式。(Abstract Factory Pattern) 抽象工厂模式,是一种为访问类提供一个创建一…

白盒测试和黑盒测试的区别

白盒测试和黑盒测试的区别白盒测试和黑盒测试都是计算机领域行业用以检查程序的状态&#xff0c;确定实际运行状态与预期状态是否一致的重要环节&#xff0c;来看看他们有什么不一样吧。 白盒测试技术 (White Box Testing) &#xff1a; 深入到代码一级的测试&#xff0c;使用这…

【Maven基础】单一架构案例(四)

第七节 业务功能&#xff1a;显示奏折列表 1、流程图 2、创建组件 2.1、创建 WorkServlet 2.1.1、创建 Java 类 刚开始是空的&#xff0c;还没有写方法&#xff1a; public class WorkServlet extends ModelBaseServlet {private MemorialsService memorialsService new M…