计算虚拟化2——内存虚拟化

news2024/11/27 21:38:43

目录

物理机内存访问过程

虚拟地址VA和物理地址PA概念

MUU实现VA到PA所使用的映射表

内存虚拟化类型

内存软件辅助虚拟化

内存硬件辅助虚拟化

内存虚拟化-内存超分配

内存共享

内存置换

内存气泡


物理机内存访问过程

内存的基本知识

内存都是从物理地址0开始的,n结束

内存都是连续的

MMU(Memory Management Unit)内存管理单元,主要功能为将内存虚拟地址到物理地址的转换、内存保护、中央告诉缓存的控制等

虚拟地址VA和物理地址PA概念

为什么提出虚拟地址VA

我们知道一个服务器的物理内存是固定的,从0开始,到n结束;当有多个应用程序要使用内存时,每个应用程序都认为自己使用的内存地址是从0开始,到x结束(x≤n),此时某个进程的内存区就可能会被别的进程覆盖;为了解决此问题就提出了虚拟内存的概念,也就是虚拟内存地址VA的概念(应用程序通过此地址无法直接访问内存),通过MMU内存管理单元来把每个应用程序使用的VA虚拟地址转为具体的对应的物理内存地址PA

虚拟地址VA和物理地址PA的转换

虚拟地址VA由虚拟页面号VPN和虚拟地址偏移VA Offset组成;物理地址PA由物理页帧号PFN和物理地址偏移PA Offset组成(通常PA Offset等于VA Offset)

当虚拟地址VA转为物理地址时,需要将VPN转为PFN,然后在加上VA Offset(即 PA=PFN+VA Offset)

VA和PA地址转换的大致工作原理如下

实际上应用程序在往内存中读写数据时,需要先将请求发往CPU,再由CPU发往内存

所以应用程序将自己需要访问的虚拟内存地址VA发往CPU,CPU将VA虚拟地址发给MMU

由,MMU通过映射表将VA虚拟地址转为PA物理内存地址,然后交给内存完成内存的读写

MUU实现VA到PA所使用的映射表

MMU将VA转为PA的两种映射表:页表(慢表)、TLB传输后备缓冲器(快表)

页表(慢表)基本概念

MMU没有自己的存储空间,所以最开始映射表存储在内存中,名字叫页表

MMU如何知道页表在内存的具体地址呢?

通常CPU会提供一个页表基址寄存器给操作系统使用,用于给MMU指示页表的基地址(不同处理器架构对应的寄存器不一样,x86的寄存器为CR3、ARM-v8的寄存器为TTBR、RISC-V的寄存区为SATP);寄存器存储了第一级页表的基地址,由于在实际使用中都是使用多级页表来存储虚拟地址和物理地址的映射关系,所以需要寄存器找到第一级页表的基地址,然后依次查找后续级别的页表知道找到VA对应的真正的物理内存地址

不同多级页表涉及的表项

二级页表

分为页全局目录PGD(page global directory)和页表入口PTE(page table entry)

其中PGD来存储下一级页表的基地址,PTE来存储真正的物理地址

共有PGD、PTE二级目录

三级页表

在PGD和PTE之间新加了页中间目录PMD(page middle directory)

共有PGD、PMD、PTE三级目录

四级页表

在PGD和PMD之间新增了页上级目录PUD(page upper directory)

共有PGD、PUD、PMD、PTE四级目录

常见系统使用多级页表的类型

未开启PAE物理地址扩展的32位系统只使用二级页表;开启PAE物理地址扩展的32位系统使用三级页表;64位系统使用四级页表或三级页表

具体使用多少级页表、虚拟地址、物理地址等的格式与是32位系统还是64位系统有关、也与处理器的架构有关;但是MMU管理的工作原理都是一致的,不管是二级页表、三级还是四级,都是通过第一级找到第二级,第二级找到第三级等,最终找到其它物理地址

使用三级页表的工作原理

由于使用三级页表来存放VA与PA之间的关系,此时VA地址也被分为4部分VPN1、VPN2、VPN3、VA Offset

应用程序将VA发给CPU,CPU将VA发给MMU,MMU访问页表基址寄存器,得到一级页表PGD的基地址,再结合虚拟地址中的VPN1(PGD index)找到下一级页表PMD的基地址;得到了PMD的基地址,再结合虚拟地址中的VPN2(PMD index)得到再下一级PTE的基地址,结合虚拟地址中的VPN3(PTE index)的到最终的PFN,然后通过PFN+VA offset得到真实的物理地址,然后MMU将VA转为PA,最后通过PA地址访问内存

CPU→MMU→寄存器→读取内存中的页表→MMU将VA转为PA→内存(整个流程访问了两次内存)

TLB传输后备缓冲器(快表)

TLB存放在CPU缓存中(CPU缓存的速率高于内存),并且能够直接通过VA的VPN来获取到PA地址的PFN,进而获得PA地址

TLB如何通过VA找到PA地址

TLB表根据虚拟地址VA的高20位(此20位是针对x86架构的,不同架构的值不同)来查找表项,找对对应的物理地址PA

TLB工作流程

应用程序将VA地址发给CPU,CPU将VA发给MMU,MMU将存放在CPU缓存的TLB读取出来,然后MMU将VA转为PA,最后通过PA地址访问内存

CPU→MMU→读取CPU缓存中的TLB表→MMU将VA转为PA→内存

有些VA地址在TLB中没有映射怎么办?

根据VA的高20位地址,在TLB中查找对应的PA地址,如果没有对应表项就返回TLB Miss,此时MMU就去读取内存的页表,通过页表来实现VA到PA的转换


内存虚拟化类型

内存半虚拟化主要是Xen厂商使用,此处不做介绍

提前了解的概念

GVA        虚拟机访问内存的虚拟内存地址

GPA        虚拟机访问内存的物理内存地址

HVA        物理机访问内存的虚拟内存地址

HPA        物理机访问内存的物理内存地址

虚拟机内存虚拟化的核心

虚拟机的内存虚拟化类似于物理机的虚拟内存,虚拟机的内存虚拟化通过引入一层新的地址空间(GPA),使得虚拟机以为自己运行在真实的物理地址中,实际上它是通过VMM访问真实的物理地址的

内存软件辅助虚拟化

常用的软件辅助全虚拟化通过“影子页表(shadow page table)”技术来实现

虚拟机设计的每个映射表的作用

虚拟机的页表/TLB表维护GVA到虚拟机物理地址GPA的映射关系

VMM定义的映射表维护GPA到HVA的映射表

物理机的页表/TLB表维护HVA到HPA的映射表

VMM的影子页表维护GVA到HPA的映射表(影子页表由VMM维护)

虚拟机的页表和影子页表会通过一个哈希表建立关联(也有其他的关联方式),可以完成GPA到HPA的映射

影子映射表的作用

VMM为每个虚拟机都维护一个影子页表,影子页表维护GVA到HPA的映射表,简化了地址转换的过程,实现了虚拟机的虚拟内存地址GVA到物理机的真实内存地址HPA的直接映射

具体工作原理

当虚拟机通过虚拟机CR3寄存器来获取到自己虚拟机的页表或获取TLB表时,都会被VMM捕获,通过影子页表直接将GVP转为HPA,完成内存的访问

如果影子页表没有相应的GVP表项如何做

虚拟机的应用程序访问内存,CPU将GVA地址发给虚拟机的MMU,虚拟机的MMU通过页表或TLB表得到GPA;然后再通过VMM查找GPA对应的HVA,最后通过物理主机的页表或TLB表查HVA对应的HPA(如果没有HPA则为HVA分配对应的HPA),最终得到GPA对应的HPA关系,然后将其对应关系填充到影子页表;

VMM如何感知到虚拟机对自己的页表做出了一些更改

VMM将虚拟机对应影子页表的物理内存区域标记为只读状态,当虚拟机想要更改自己的页表时,就会对该物理内存区域做出更改的操作,此时就会抛出CPU的异常,触发一个VM Exit,这个时候就退出到VMM中,VMM就知道了虚拟机在更改页表

此时VMM代替虚拟机操作系统修改虚拟机页表,然后更新自身的影子页表中GVA到HPA的映射关系

存在的问题

每次触发VM exit的话开销很高

VMM承担太多影子页表的维护工作

内存硬件辅助虚拟化

常见的内存硬件虚拟化技术

Inter的EPT(Extend Page Table)扩展页表技术

AMD的RVI(Rapid Virtualization Index)快速虚拟化索引技术

两者细节方面有所不同,但是设计理念完全一致,把影子页表中依靠软件实现的过程改为硬件实现(GVP到GPA的转换没有变化,只是GPA到HPA的转化是由硬件来完成)

EPT页表的工作原理

EPT页表存放在CPU中

当应用程序访问内存时,将GVA交给虚拟机CPU,虚拟机CPU会通过访问虚拟机中的页表来完成GVA到GPA的转换;接着CPU通过EPT页表来实现GPA到HPA的转换

如果EPT页表没有GPA对应的HPA地址,如何解决

如果HPA为空,则CPU会抛出EPT Violation异常,触发一个vm exit让VMM来处理,此时VMM会根据GPA地址将其映射到对应的HVA地址,然后通过物理页表找到此HVA地址对应的HPA(如果没有HPA则为HVA分配对应的HPA),最后再更新EPT表项

如果EPT页表中没有GPA地址,如何解决?

如果GPA地址为空(即缺页),则CPU产生缺页异常,发生缺页中断(如果是软件实现方式,则会产生vm exit)但是硬件实现方式下,并不会产生VM-exit,而是交给虚拟机内核的中断处理程序处理;在中断处理程序中会产生EXIT_REASON_EPT_VIOLATION,虚拟机退出,VMM截获到该异常后,为虚拟机分配新的物理地址HPA,并建立新的GPA到HPA的映射关系,保存到EPT中,这样在下一次访问的时候就可以完成GPA到HPA的转换


内存虚拟化-内存超分配

虚拟机内存和物理机内存之间并不是一一对应的,物理机可以通过内存超分配来超额分配内存给虚拟机

内存超分配实现分配给虚拟机的内存总数大于实际可用的物理内存总数

实现内存超分配主要通过内存复用技术实现的

而内存复用通过内存共享、内存置换、内存气泡三大技术来对内存进行分时复用,实现内存超分配

内存复用=共享,气泡,置换共同作用

内存共享

虚拟机之间共享同一物理内存空间(蓝色部分),并且该共享的物理内存为只读权限(多个虚拟机内存中保存的多份相同数据,在物理内存中只保留一份数据)

当某个虚拟机需要写入数据到共享内存空间时,此时就通过写时复制技术,另开辟一块内存空间使用,并修改映射表

内存置换

虚拟机长时间未访问的内存内容置换放到硬盘中,并建立映射表,释放内存

当虚拟机再次访问该内存时再置换回来

内存气泡

将较为空间的虚拟机内存释放给内存使用率较高的虚拟机(即:把虚拟机2的空闲内存分给虚拟机1使用);内存的回收和分配为系统动态执行,虚拟机上的应用无感知

提升了内存利用率;不过需要保证所有虚拟机正在使用的内存总量不能超过物理机的物理内存总量

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

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

相关文章

基于LDA主题+协同过滤+矩阵分解算法的智能电影推荐系统——机器学习算法应用(含python、JavaScript工程源码)+MovieLens数据集(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据爬取及处理 相关其它博客工程源代码下载其它资料下载 前言 前段时间,博主分享过关于一篇使用协同过滤算法进行智能电影推荐系统的博文《基于TensorFlowCNN协同过滤算法的智能电影推荐系统——深…

文献查询辅助工具,查看文献影响因子期刊,显示文献排名,翻译文献

插件工具:easyScholar 适配浏览器(Edge、chrome、Firefox),本文以Edge为例: 1.打开Edge浏览器,输入: edge://extensions/ 2.点击获取Microsoft Edge扩展 3.搜索 easyscholar,然后…

Hive【Hive(八)自定义函数】

自定义函数用的最多的是单行函数&#xff0c;所以这里只介绍自定义单行函数。 Coding 导入依赖 <dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.3</version></dependency>…

路由器基础(十):防火墙配置

一、防火墙默认的区域 防火墙是基于安全区域进行工作的安全设备。 一个安全区域是若干接口所连网络的集合&#xff0c;这些网络中的用户具有相同的安全属性。 通常防火墙认为在同一安全区域内部发生的数据流动是不存在安全风险的&#xff0c;不需要实施任何安全策略。只有当不同…

代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零

前言 : 动规五部曲 理论基础 : 代码随想录Day34 LeetCode T343整数拆分 T96 不同的二叉搜索树-CSDN博客 1.明白dp数组的含义 2.明白递推公式的含义 3.初始化dp数组 4.注意dp数组的遍历顺序 5.打印dp数组排错 LeetCode T1049 最后一块石头的重量II 题目链接:1049. 最后一块石头…

LeetCode:117. 填充每个节点的下一个右侧节点指针 II(C++)

117. 填充每个节点的下一个右侧节点指针 II 题目描述&#xff1a; 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将…

Promise的并发控制 - 从普通并发池到动态并发池

一、场景 给你一个有200个URL的数组&#xff0c;通过这些URL来发送请求&#xff0c;要求并发请求数不能超过五个。 这是一道很常考的面试题&#xff0c;接下来让我们来学习一下Promise并发控制 二、普通并发池的实现 主要思路就是&#xff0c;判断当前队列是否满&#xff0c;…

【IDEA】在工具栏设置快速创建包和类的图表

页面效果&#xff1a; 操作步骤&#xff1a; 设置 --> 外观与行为 --> 菜单与工具栏 --> 点击 主工具栏 --> 点击 ---- --> 点击 号 --> 添加操作 主菜单 --> 文件 --> 文件打开操作 --> 打开项目操作 --> 新建 --> 往下找 找到 clas…

单行自动横向滚动——css实现

效果 封装组件 <template><div ref"container" class"scroll-area"><divref"content":class"[isScroll ? scroll : no-scroll]":style"{ color: fontColor }">{{ content }}</div></div> &…

c++值deque容器

1.deque容器介绍 deque 是 double-ended queue 的缩写&#xff0c;又称双端队列容器。deque容器支持从头部和尾部双端插入、删除数据。与vector容器不同的是&#xff0c;vector容器是一段连续的空间&#xff0c;而deque没有所谓容量的概念&#xff0c;因为它是动态的以分段连续…

Spring Boot 常见面试题

目录 1.Spring Boot 快速入门什么是 Spring Boot&#xff1f;有什么优点&#xff1f;Spring Boot 与 Spring MVC 有什么区别&#xff1f;Spring 与 Spring Boot 有什么关系&#xff1f;✨什么是 Spring Boot Starters?Spring Boot 支持哪些内嵌 Servlet 容器&#xff1f;如何设…

掌握RESTful API:规范与设计详解

前言 RAML (RESTful API Modeling Language) 和 OAS (OpenAPI Specification) 都是用于描述和定义 RESTful API 的规范。它们分别提供了不同的功能和优势。 RAML&#xff08;RESTful API Modeling Language&#xff09;&#xff1a; RAML简介 RAML&#xff08;RESTful API M…

CSC公派研究生项目|北语北外2024年寒假英语培训班正在招生

北京语言大学出国部、北京外国语大学出国部近期发布了2024年寒假“国家建设高水平大学公派研究生项目”英语培训的通知&#xff0c;知识人网小编特归纳整理&#xff0c;供有需求的同学参考。 北京语言大学 我部将于2024年寒假举办“国家建设高水平大学公派研究生项目”英语培训…

银行账单转换beancount

用了beancount来记账后&#xff0c;发现每月的账单手动记是一件极其麻烦的事情。 然后再github搜索一通后&#xff0c;有double-entry-generator&#xff08;https://github.com/deb-sig/double-entry-generator&#xff09;能转换支付宝/微信的账单&#xff0c;但是没有自己用…

基于STM32F412RET6的智能桶硬件设计

一、智能桶功能需求&#xff1a; 智能桶是一直采用Cortex-M4 嵌入式平台&#xff0c;搭载NB-IotTO通讯模组、智能称重采集、智能门锁监控以及温度监测等装置。主要功能如下&#xff1a; ▲ 具有GPS定位功能&#xff0c;可以通过后台APP实时定位智能桶的位置。 ▲ 具有温度监测功…

大厂面试题-Netty中Reactor模式的理解

Reactor其实是在NIO多路复用的基础上提出的一个高性能IO设计模式。 它的核心思想是把响应IO事件和业务处理进行分离&#xff0c;通过一个或者多个线程来处理IO事件。 然后把就绪的事件分发给业务线程进行异步处理。 Reactor模型有三个重要的组件&#xff1a; Reactor&#…

基于单片机的可穿戴个人健康监测仪-智能手环

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、方案的设计与论证2.1设计任务及要求2.2 模块技术和方法综述2.3 设计可能遇到的困难 二、 系统总体框架3.1 硬件设计 三 软件部分4.1 主程序流程框 四、 结论五、 文章目录 概要 近几年智能化的不断发展&#…

GEE——提取制定多波段影像的属性值(按照制定属性名称和属性值)输出格式为矢量格式

简介: 这里我们很多时候,需要提取制定影像,或者多波段影像制定区域的值,这里有一个问题是我们一般输出的结果仅仅是一个字典类型的对象,而我们不知道如何按照一个矢量输入,这里我们首先要做的就是进行多波段值在制定区域的提取,随后就是分别对其新的字典的键、值的设定…

Leetcode76最小覆盖子串

思路&#xff1a;滑动窗口思想 1. 滑动窗口是什么&#xff1a;用一个滑动窗口为覆盖目标子串的字符串 2.怎么移动窗口&#xff1a;当不满足覆盖时右指针移动扩大范围&#xff0c;当覆盖了就移动左指针缩减范围直到再次不覆盖 3. 怎么判断是否覆盖&#xff1a;这里使用两个哈…

Qt封装的Halcon显示控件,支持ROI绘制

前言 目前机器视觉ROI交互控件在C#上做的比较多&#xff0c;而Qt上做的比较少&#xff0c;根据作者 VSQtHalcon——显示图片&#xff0c;实现鼠标缩放、移动图片的文章&#xff0c;我在显示和移动控件的基础上&#xff0c;增加了ROI设置功能&#xff0c;并封装成了一个独立的Q…