内存虚拟化实现

Posted 陈老师门徒计划

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存虚拟化实现相关的知识,希望对你有一定的参考价值。

1.3.2 内存虚拟化实现:

说完虚拟化技术中最重要的CPU相关技术外,下面再来说说内存虚拟化技术。

对于计算机的物理内存,空间是有限的,每个应用或进程在使用内存时是不能覆盖别的进程的内存区。

                           

本文要说的不是这种虚拟内存,而是基于虚拟机的内存虚拟化,它们本质上是类似的,通过对虚拟内存的理解,再去理解内存虚拟化就比较容易了。

内存虚拟化分为基于软件的内存虚拟化和硬件辅助的内存虚拟化,其中,常用的基于软件的内存虚拟化技术为影子页表(Shadow Page Table)技术,硬件辅助内存虚拟化技术为Intel的EPT(Extent Page Table) 技术和AMD的NPT(Nest Page Table) 技术。

内存虚拟化解决虚拟机里面的进程如何访问物理机上的内存这一问题。

常规软件内存虚拟化:

GVA -> GPA-> HVA -> HPA

Ok,内存虚拟化的问题变成了GVA->HPA的映射问题。

GVA->GPA通过Guest OS页表映射。

HVA->HPA通过Host OS页表映射。

但,这样三段逐次映射,效率低下。

影子页表技术(Shadow PageTable):

内存虚拟化实现



影子页表:Guest OS创建GVA->GPA页表的时候,VMM知道GVA对应的HPA,并记录下映射关系GVA->HPA。后续需要GVA到GPA映射的时候,根据影子页表就能查到HPA。客户机中的每一个页表项都有一个影子页表项与之相对应,就像其影子一样。



要实现这样的映射,必须为 Guest 的页表设计一套对应的影子页表,然后将影子页表装入 Host 的 MMU 中,这样当 Guest 访问Host 内存时,就可以根据 MMU 中的影子页表映射关系,完成 GVA 到 HPA 的直接映射。而维护这套影子页表的工作则由 VMM 来完成。

影子页表异常处理机制

 

影子页表的维护将带来时间和空间上的较大开销。时间开销主要体现在Guest OS构造页表时不会主动通知 VMM,VMM 必须等到Guest OS发生缺页时才会分析缺页原因再为其补全影子页表。而空间的开销主要体现在VMM需要支持多台虚拟机同时运行,每台虚拟机的 Guest OS 通常会为其上运行的每个进程创建一套页表系统,因此影子页表的空间开销会随着进程数量的增多而迅速增大,这会带来较大内存上的额外开销。

为了改善这个问题,就提出了基于硬件的内存虚拟化方式,将这些繁琐的工作都交给硬件来完成,从而大大提高了效率。

EPT 技术:

这方面 Intel 和 AMD 走在了最前面,Intel 的EPT 和 AMD 的 NPT 是硬件辅助内存虚拟化的代表,两者在原理上类似,本文重点介绍一下 EPT 技术。



由此可以看出,EPT 页表相对于前述的影子页表,其实现方式大大简化。而且,由于客户机内部的缺页异常也不会致使客户机退出(如果是软件实现的方式,则会产生 VM-exit),因此提高了客户机运行的性能。此外,KVM 只需为每个客户机维护一套 EPT 页表,也大大减少了内存的额外开销。


以上是关于内存虚拟化实现的主要内容,如果未能解决你的问题,请参考以下文章

windows中的虚拟内存管理技术是指使用啥来运行应用程序

:内存管理 -- 虚拟内存

Linux 操作系统原理 — 虚拟内存管理

Java内存模型JMM,虚拟机线程实现

操作系统 虚拟内存技术

操作系统—虚拟化内存分段