本文以Intel开源的ACRN项目(Homepage - Project ACRN™)介绍的内存虚拟化技术为基础,介绍一下在虚拟系统中内存管理的一些基本知识。另外不同虚拟化公司提供的技术大多基于开源项目例如Xen、QEMU、KVM等
虚拟机管理程序 (HV) 通过虚拟真实的物理内存, 以便在虚拟机中运行的未经修改的操作系统 (如 linux 或 android),客户操作系统可以管理自己的连续物理内存的视图。虚拟机管理程序使用虚拟处理器标识符 (VPID) 和扩展页面表 (EPT) 来把客户物理地址转换为实际主机物理地址。虚拟机管理程序启用了EPT和 VPID 硬件虚拟化功能, 为操作系统和客户系统建立了EPT页表, 并向其他应用程序提供了EPT页表操作接口。
从虚拟机管理程序的角度来看, 需要考虑以下几种内存空间,有:
主机物理地址 (Host Physical Address): 本地主机物理地址空间,主机虚拟地址 (Host Virtual Address): 基于MMU机制的本地主机虚拟地址空间。我们使用页面表管理在HPA和HVA空间之间进行映射。
从虚拟机上运行的客户操作系统来看, 有:
客户物理地址 (Guest Physical Address): 虚拟机的客户操作系统的物理地址空间。在GPA到HPA之间的映射通常需要基于类似MMU的硬件模块 (例如X86中的EPT), 同时与页面表相关联客户操作系统虚拟地址 (Guest Virtual Address): 基于VMMU机制的虚拟机中客户操作系统的虚拟地址空间
通常在这样的架构下,内存地址访问有四层映射:
GVA - GPA - HVA - HPA
GVA - GPA 的映射由客户操作系统来负责,而 HVA - HPA 由微内核虚拟化操作系统来负责维护。于是在虚拟化系统中我们需要一种机制,来维护 GPA - HVA 的映射。常用的实现有 SPT(Shadow Page Table) 和 EPT/NPT (Intel) ,前者通过软件维护影子页表,后者通过硬件特性实现二级映射。
本文说明虚拟化系统的内存管理基础结构, 以及它如何在虚拟化系统内处理不同的内存空间:
虚拟机管理程序如何管理本地主机内存 (HPA/HVA)虚拟机管理程序如何管理客户操作系统内存 (HPA/GPA)虚拟机管理程序如何管理两个不同客户操作系统内存(HPA/GPA)
虚拟化物理内存管理
在虚拟化系中, 虚拟机最先初始化MMU页表以管理所有物理内存, 然后切换到新的MMU页表。在平台初始化阶段初始化MMU页表后, 就不会对MMU页表进行更新,因为这牵涉到客户操作系统内存和交互区域,系统启动时间优化等问题,因此MMU在平台初始化阶段固定对系统稳定性有一定的影响。
虚拟化物理内存分布
无可非议虚拟机管理程序必须具备系统内存管理功能。通常情况下, 系统启动引导程序 (例如Intel的EFI) 将系统物理内存布局表传递给虚拟机管理程序,虚拟机管理程序基于此表使用分级页表来执行内存管理工作。如下图所示,此表包含系统平台的原始内存布局。
虚拟化内存初始化
虚拟机管理程序在分页模式下运行。系统启动引导处理器 (BSP) 获取系统平台内存布局表后, BSP将在此基础上创建其MMU页面表。应用处理器 (AP) 接收 IPI CPU启动中断后, 它将使用由BSP创建的 MMU页表,并启用SMEP。SMEP(Supervisor Mode Execution Prevention),在现代intel处理器上,当设置了CR4存器的控制位时,会保护特权进程(比如在内核态的程序)不能在不含supervisor标志(对于ARM处理器,就是PXN标志)的内存区域执行代码。(直白地说就是内核程序不能跳转到用户态执行代码)。
虚拟机管理程序可以访问所有系统内存,并有自己的内存,为其代码/数据的 write-back 缓存,使用最小内存页将虚拟地址空间映射到物理地址空间。如果更新了页面的内存类型或访问权限, 或者删除了某些虚拟地址空间, 则会导致相应页面的拆分。虚拟机管理程序仍将继续使用最小内存页将虚拟地址空间映射到物理地址空间。
内存分页池功能
内存分页池功能提供了对多种4kb 页面大小内存块的动态管理, 虚拟机管理程序通常使用这些内存块来存储内部数据。通过这些功能, 虚拟机管理程序可以分配和释放相应的内存页面。
虚拟机管理程序内存虚拟化
虚拟机管理程序为每个客户操作系统提供了一个连续的物理内存区域。它还保证每个客户操作系统互相隔离不能访问彼此程序中的代码和内部数据, 并且每个客户操作系统在未授权的情况下不能访问虚拟机的代码和内部数据。虚拟机管理程序应该支持以下功能:
支持EPT和VPID硬件虚拟化功能,为每个客户操作系统建立EPT页表,提供EPT页表操作服务,为每个客户操作系统提供虚拟化的MTRR机制,提供VPID操作服务,为GPA和HPA之间的地址空间映射提供服务,提供虚拟机管理程序和每个客户操作系统之间的数据传输服务。
虚拟化内存功能检查
在虚拟机管理程序中, 内存虚拟化提供 EPT/VPID功能检查服务和支持EPT大型页面检查服务。
不同地址空间的数据传输
在虚拟化系统中, 虚拟机管理程序、不同客户操作系统中使用不同的内存空间来实现各自的隔离。在这些内存空间之间, 有不同类型的数据传输, 客户操作系统可能会使用超调用来请求虚拟机管理程序提供数据传输服务。
访问客户操作系统内存地址GPA
当虚拟机管理程序需要访问GPA来进行数据传输时, 来自客户操作系统的调用方必须确保此GPA内存地址范围是连续的。但对于虚拟机管理程序中的HPA主机物理内存地址, 它可能是不连续的 (特别是对于 巨型页表分配机制下的用户操作系统)。例如, 4Mb的GPA地址范围可能映射到2个不同的2Mb巨型主机物理页面。虚拟机管理程序应该通过基于其HPA的EPT页面滑动来处理这种数据传输。
访问客户操作系统内存地址GVA
当虚拟机管理程序需要访问GVA内存地址数据进行数据传输时, GPA和HPA地址可能都是不连续的。虚拟机管理程序最好监视这种数据传输, 并通过基于其GPA和HPA 内存页表相应滑动来处理它。
内存扩展页表的操作
虚拟机管理程序使用最小内存页表将客户操作系统的物理地址 (GPA) 映射到主机物理地址 (HPA) 。
如果更新了页面的内存类型或访问权限或删除了某些 GPA 空间, 则会导致相应的EPT页表被拆分。虚拟机管理程序仍应继续使用最小的EPT页表将GPA空间映射到HPA空间。
虚拟机管理程序提供EPT客户操作系统物理内存增加、删除、EPT页表重新分配、以及内存无效服务。
如果觉得《内存位置访问无效 midas.dll_内存虚拟化介绍》对你有帮助,请点赞、收藏,并留下你的观点哦!