QEMU源码全解析 —— 内存虚拟化(1)

接前一篇文章:

本文内容参考:

《趣谈Linux操作系统》 —— 刘超,极客时间

《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社

内存虚拟化硬件基础——EPT

特此致谢!

内存虚拟化简介

内存是计算机必不可少的组成部分之一,因此内存的虚拟化也是各类虚拟化方案必须要解决的问题。从CPU的视角来看,物理机上的内存是一段从0开始的连续可用的物理内存。在虚拟化中,每个虚拟机都需要这么一段从0开始的、连续的、属于自己的物理地址。为此,VMM必须也为虚拟机模拟出这样一段空间。首先且比较容易想到的就是QEMU进程的虚拟地址作为这样一段空间提供给物理内存,如下图所示:

但是这样的方案会存在问题:在物理机上,CPU对内存的访问在保护模式下是通过分段分页实现的,也就是说在保护模式下,CPU访问时使用的是虚拟地址而非物理地址。虚拟地址必须通过硬件MMU进行转换,将其转换为物理地址,之后才能访问到实际的物理内存。如下图所示:

但是在虚拟化下,虚拟机内部也有自己的保护模式。因此,当虚拟机中的虚拟CPU进行内存寻址的时候,其使用的是虚拟机内部的虚拟地址。要想让其访问到实际的物理内存,必须先将这个虚拟机的虚拟地址转换成虚拟机的物理地址然后将虚拟机的物理地址转换成QEMU的虚拟地址(即物理机上的虚拟地址);最后将QEMU的虚拟地址转换成物理机上的物理地址,才能访问到数据。

这个过程中涉及到四类内存:

  • 虚拟机中的虚拟内存地址(Guest OS Virtual Memory Address,GVA)

这是虚拟机里面的进程看到的内存空间。

  • 虚拟机中的物理内存地址(Guest OS Physical Memory Address,GPA)

这是虚拟机里面的操作系统看到的内存,它认为这是物理内存。

  • 物理机的虚拟内存地址(Host Virtual Memory Address,HVA)

这是物理机上的QEMU进程看到的内存空间。

  • 物理机的物理内存地址(Host Physical Memory Address,HPA)

这是物理机上的操作系统看到的内存。

也即,上边虚拟机中的进程访问物理内存时,需要经过GVA->GPA->HVA->HPA的过程。咱们作为旁观者,在一旁看着这一过程都感觉费劲,就甭说实际的效果了。经过这个特别“绕”的过程,计算机的性能算彻底“日本船”了。显然,这需要虚拟化软件提供一种机制来完成这种转换(而且还不能单纯是以上那个过程),这就是所谓MMU的虚拟化。

影子页表与EPT

  • 影子页表

在CPU没有支持EPT(Extended Page Table,扩展页表)之前,虚拟机是通过影子页表实现从虚拟机虚拟地址到宿主机物理地址的转换的,这是一种软件实现方案。在该方案中,影子页表直接实现GVA到HPA的转换,绕过了中间的GPA和HVA。这一没有中间商,果然开销就少了不少。虚拟化软件(KVM)为虚拟机中的每一个进程保存一个页表,虚拟机中的进程也有自己的页表,但是这个页表是可读的,所以就称前一个页表是后一个页表的影子页表。这样虚拟机的页表就会导致VM Exit(即由非根模式切换成根模式),然后KVM会处理该请求,然后更新影子页表。

影子页表的基本原理是:

1)当处于非根模式下的CPU有修改CR3的动作时(通常是下一个进程被调度的时候),意味着有页目录地址会被加载到CR3(如果是32-bit分页模式),这时VMM截获这个动作,退回到根模式;

2)VMM中维护了一个hash链表,专用于存放CR3中页目录地址对应的影子地址。VMM拿到页目录地址后计算该地址的hash值并作为key放到hash表中,然后申请一个主机上的物理地址作为页目录的地址放到CR3寄存器中,同时主机上的物理地址也被存放到hash表中,CR3原有的应该被保存的页目录地址被VMM保存起来;

3)当虚拟机进程被调度出去的时候,CR3中应该被保存的页目录地址要放回到进程控制块中,这时VMM会截获这个动作并提供之前保存的页目录地址。

VMM在CR3寄存器被修改的过程中,偷天换日,将本应该放到CR3中的地址拿走,替换成自己申请的地址,当客户机要从CR3中取回这个地址时替换回去。

总之,影子页表的方案使用纯软件实现了一个MMU。

  • EPT(Extended Page Table,扩展页表)

由于影子页表使用纯软件实现MMU的方案效率很低,因此VMX架构引入了所谓的扩展页表,即EPT方案。

在EPT方案中,CPU的寻址模式在VM non-root operation下会发生变化,其会使用两个页表。其基本原理如下图所示:

如果开启了EPT,当CPU进行VM Entry时,会使用EPT功能。虚拟机对内部自身页表有着完全的控制,CPU先将虚拟机内部的虚拟地址转换为虚拟机物理地址,通过此过程查找虚拟机内部页表;然后CPU会将这个地址转换为宿主机的物理地址,通过此过程查找宿主机中的EPT页表。当CPU产生VM Exit时,EPT会关闭,这个时候CPU在宿主机上就又会按照传统的单页方式寻址。

虚拟机中的页表就像物理机操作系统页表一样,页表里边保存的是虚拟机物理地址,由自己维护;EPT页表则由主机维护,里边记录着虚拟机物理地址到宿主机物理地址的转换。

EPT克服了影子页表使用软件维护GVA->HPA地址转换的缺点,它使用硬件来维护GPA->HPA,因此效率大大提高。而且,影子页表虽然缩短了地址转换路径,但每次虚机进程访问CR3时,都会引起VMX的模式切换,开销很大。影子页表在每次加载和卸载的时候都会引起模式切换,而EPT减少了这种开销,EPT只在缺页的时候才引起VMX模式切换,一旦页表建立好之后,EPT就不再有模式切换的开销,虚机内存的访问一直在客户态。

一般来讲,EPT使用的是IA-32e的分页模式,也就是使用48位物理地址,总共分为四级页表,每级页表使用9位物理地址,最后12位表示在一个页(4KB)内的偏移,如下图所示:

在EPT分页基址下,虚拟机进行内存访问会引发一系列的GPA到HPA的转换。上图展示了EPT的访问过程,EPT页表的基址保存在VMCS(Virtual Machine Control Structure)结构内的EPTP(extended-page-table pointer)指针中。在进行一次内存访问时,虚拟机首先将客户机虚拟内存转换为客户机物理内存地址,这中间会查询虚拟机的页表。如果对应页表存在且有效,则读取此页表信息,然后读取下一级页表,计算出虚拟机需要访问的GPA,然后这个GPA会再一次执行页表查找,最终找到物理机上的数据。在以上过程中,如果虚拟机内部发生缺页异常,则虚拟机会自己修好自己的页表;如果发生EPT异常,则产生EPT异常退出,虚拟机会退出到KVM,构建好对应的EPT页表。

欲知后事如何,且看下回分解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C languange DGEQRF 示例,link liblapack.a

1.示例源码 #include <stdio.h>int min(int m, int n){ return m<n? m:n;}void print_matrix(double* A, int m, int n, int lda) {for (int i 0; i < m; i){for (int j 0; j < n; j){//printf("%7.4f ", A[i j*lda]);printf("%7.4f, &quo…

【数据结构】分治策略

现场保护和现场恢复 文章目录 分治策略分治法解决问题有以下四个特征&#xff1a;分治法步骤: 递归&#xff1a;解决以下问题&#xff1a;倒序输出整数求最大公约数&#xff08;递归和非递归&#xff09;菲波那切数列 不要尝试间接 要使用直接递归&#xff08;自己调用自己&am…

创建与删除数据库(四)

创建与删除数据库&#xff08;四&#xff09; 一、创建数据库 1.1 使用DDL语句创建数据库 CREATE DATABASE 数据库名 DEFAULT CHARACTER 示例&#xff1a; 创建一个test 的数据库&#xff0c;并查看该数据库&#xff0c;以及该数据库的编码。 创建数据库&#xff1a; cre…

MATLAB Fundamentals>>>Centering and Scaling

MATLAB Fundamentals>Common Data Analysis Techniques>Polynomial Fitting>Centering and Scaling 数据导入 This code sets up the activity. yr 2000:2007 penguins [5.49 7.03 7.73 7.70 9.29 9.21 11.89 10.85] 附加练习 How does the model look?…

嵌入式——数字/模拟转换模块(DAC)

目录 一、初识DAC 1. 介绍 2. DAC主要特性 3. DAC的特性参数 二、相关寄存器 1. 控制寄存器&#xff08;DAC_CR&#xff09; 2. DAC通道1 的12位右对齐数据保持寄存器&#xff08;DAC_DHR12R1&#xff09; 3. 通道1数据输出寄存器&#xff08;DAC_DOR1&#xff09; 三…

C# .Net Framework Swagger

1.安装 Swagger 在NuGet程序包中安装以下文件 Swashbuckle: Swagger&#xff1a; Swagger.Net: 2.在项目APP_Start 文件夹下面找到 SwaggerNet.cs文件 1.注释掉这两行代码 2.将PreStart方法的内容修改为以下 public static void PreStart() {RouteTable.Routes.MapHttpRoute(…

Message Queue --- RabbitMQ

MessageQueue Intro 什么是MQ为什么使用MQ常见的MQ 什么是MQ MQ全称是Message Queue&#xff0c;消息的队列&#xff0c;因为是队列&#xff0c;所以遵循FIFO 先进先出的原则&#xff0c;它是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中&#xff0c;M…

Win搭建PalWorld服务器,幻兽帕鲁开服联机教程,0基础保姆级教程

Windows系统搭建幻兽帕鲁私服&#xff0c;PalWorld开服联机教程&#xff0c;零基础保姆级教程。 最近这游戏挺火&#xff0c;很多人想跟朋友联机&#xff0c;如果有专用服务器&#xff0c;就不需要房主一直开着电脑&#xff0c;稳定性也好得多。 视频教程&#xff1a;https:/…

vue-cli组件的使用

一、前言 ​ 本文介绍 vue-cli组件的使用&#xff0c;基于已经搭建好的基础项目。关于 vue-cli 构建项目的详细流程&#xff0c;可参考博文&#xff1a;使用vue脚手架构建项目 二、使用步骤 1、创建Header.vue组件 在components 目录下创建 Header.vue 编写Header.vue <…

figure方法详解之清除图形内容

figure方法详解之清除图形内容 一 clf():二 clear():三 clear()方法和clf()方法的区别&#xff1a; 前言 Hello 大家好&#xff01;我是甜美的江。 在数据可视化中&#xff0c;Matplotlib 是一个功能强大且广泛使用的库&#xff0c;它提供了各种方法来创建高质量的图形。在 Mat…

SSE长连接( SpringBoot整合SSE(Server-Sent Events)可以实现后端主动向前端推送数据)

Demo代码分享 依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.or…

Java编程练习之类的封装2

1.封装一个股票&#xff08;Stock&#xff09;类&#xff0c;大盘名称为上证A股&#xff0c;前一日的收盘点是2844.70点&#xff0c;设置新的当前值如2910.02点&#xff0c;控制台既要显示以上信息&#xff0c;又要显示涨跌幅度以及点数变化的百分比。运行效果如下&#xff1a;…

【2024美国大学生数学建模竞赛】2024美赛C题 问题分析、数学模型、实现代码、完整论文

【2023美国大学生数学建模竞赛】2024美赛C题 问题分析、数学模型、实现代码、完整论文 引言 题目将于2024年2月2日6:00发布。我们团队将会在8点前准时更新问题分析&#xff0c;逐步更新数学模型和实现代码&#xff0c;最后发布完整的论文。 更新进展&#xff1a; &#xff08;…

朋友,我在项目挺好的

2024年&#xff0c;是优橙教育成立第7年。过去6年&#xff0c;我们迎来送往&#xff0c;曾与一届届网优人并肩作战。 今天&#xff0c;我们不问所在何处&#xff1f;只想遥问曾在优橙的每一个你 嘿&#xff01;朋友&#xff0c;最近过得怎么样&#xff1f;现在的你和曾经的自…

IEC 104电力规约详细解读(二) - 总召唤

1功能简述 总召唤功能是在初始化以后进行&#xff0c;或者是定期进行总召唤&#xff0c;以刷新主站的数据库。总召唤时请求子站传送所有的过程的变量实际值。定期进行总召唤的周期的是一个系统参数&#xff0c;可以是15分钟或者更长的时间。 总召唤的内容包括子站的遥信、遥测…

【软件设计师笔记】计算机系统基础知识考点

&#x1f413; 计算机系统组成 计算机系统是由硬件和软件组成的&#xff0c;它们协同工作来运行程序。计算机的基本硬件系统由 运算器、控制器、存储器、输入设备和输出设备5大部件组成。运算器、控制器等部件被集成 在一起统称为中央处理单元&#xff08;Central Processing …

springboot+AOP+自定义注解+RBAC自定义操作权限管理02

springbootAOP自定义注解RBAC自定义操作权限管理02!经过上一次的凑话部署&#xff0c;我们这一次&#xff0c;增加了一个后端管理系统菜单栏的访问权限的数据表。用角色表&#xff0c;和这张菜单栏的数据表进行映射。不同的角色&#xff0c;可以看见不同的菜单栏目。 这个就是菜…

Maya------创建多边形工具

配合导入图像使用 Tab键可以删除一个点&#xff01; 模型不能超过4边面&#xff01;多切割工具进行连接&#xff01; 15.maya常用命令5.创建多边形工具 反转 双显 挤出_哔哩哔哩_bilibili

不做烧钱买卖,2025年实现双百万量产!奇瑞和大卓智能「不客气」了

随着造车从技术思维向用户思维转变&#xff0c;车企的自研边界逐渐清晰。 一方面&#xff0c;前两年各车企围绕高阶智驾制定的目标&#xff0c;基本都没有达到预期。尤其是疯狂烧钱堆料&#xff0c;并没能换来销量暴涨和C端消费者的满意度&#xff0c;也让部分车企也开始反思&…

电子电器架构——车载网关转发buffer心得汇总

电子电器架构——车载网关转发buffer心得汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力…