ByEchoa
1Xen内存子系统
内存子系统在os中本身就比较复杂,那么在xen中是如何实现的呢。下面我将通过MMU虚拟化来了解它。
Xen内存子系统,即实现内存虚拟化,其主要工作旨在独立三个内存管理空间,即xen,操作系统和应用程序的内存空间。这个其实比较好理解,在没有虚拟化的环境中,操作系统和应用程序的空间就是相互独立的。内存虚拟化在某种程度上依赖于cpu虚拟化。
MMU是完成逻辑地址到物理地址转换的硬件设备,它主要有两个部件组成,分段单元和分页单元。如图4.1所示为地址转过程。下面我们将从伪物理模型,xen的内存空间分布,xen的分段机制,xen的分页机制这几方面来讨论MMU的虚拟化。
1.1伪物理模型伪物理模型,即在虚拟地址和真实的机器物理地址中插入了一层伪物理地址。伪物理地址即是guestos看到的的物理地址,它和未虚拟化时os看到的物理地址一样是连续的。机器物理地址是指真实的硬件物理地址,我们称它为机器地址。如图4.2所示为guestos的伪物理地址和硬件的机器地址。
在未虚拟化的os中,引入了虚地址的概念使得应用程序认为自己可以使用整个内存空间,并且该空间是连续的。同样的道理,引入伪物理模型使得os拥有整个内存空间,满足os的“连续性”要求。但引入伪物理模型的更重要的原因是因为虚拟机的活动移植。如果不考虑活动移植,则xen可以通过修改guestos的内存分配和地址转换方式实现对分离的物理内
存支持。考虑一下活动移植中,如果虚拟机要从A宿主机迁移到B宿主机,很难保证虚拟机在宿主机A和宿主机B中相同物理地址地址的内存页面可用。
1.2xen的内存空间分布由于部分硬件原因(TLB刷新),出于性能的考虑,x86体系的内存虚拟化采用了以下两种技术。在泛虚拟化中由guestos负责分配和管理硬件页表,最小化xen对页表操作的影响,保证了安全性和隔离性;xen为自己保留了顶部的虚拟地址空间(在x86_32未启用PAE的情况中这个值为64MB),避免在进入和离开xen时的TLB刷新操作。
利用分段机制,xen和guestos可共处于同一地址空间,简化了xen对Domain的内存分配和管理。利用分页机制,xen保证了各个Domain在内存上的有效隔离。在未启用PAE的情况下,xen保留了高64M内存空间给hypervisor,中间部分给内核,其余部分给应用程序。图4.3显示了一个在xen上运行的类Unix系统的内存布局示例。Xen的内存空间只能在ring0模式下访问,即只允许xen访问。ring1的内存空间只能在ring1和比它高的模式下访问,即允许xen和内核访问。应用程序的内存空间采用类似的原理。
1)xen的分段机制
在x86_32体系中,采用了分段和分页方式管理内存,事实上如今大部分系统都不采用分段技术。体系定义的段在两类表中,即局部描述符表(LDT)和全局描述符表(GDT)。泛虚拟化中,Xen上运行的内核只能更改LDT,更改GDT需通过超级调用(hypercall)。Xen的分段机制其实和linux中类似,也没有过多的采用分段机制,但xen利用分段机制保留了虚地址空间的顶部给xen。通过代码,我们可以得出如下数据。
base
__XEN_CS__XEN_DS__KERNEL_CS__KERNEL_DS__USER_CS__USER_DS
0x000000000x000000000x000000000x000000000x000000000x00000000
LIMIT0xFFFFF0xFFFFF0xFC3FF0xFC3FF0xFC3FF0xFC3FF
DPL001133
2)xen的分页机制
Xen的分页实现和linux内核稍有不同。在linux2.6.11版本之后,linux采用四级分页模
型,之后根据具体平台不同调整分页级别,合并页目录。而xen则不同,它依据平台选择页表级别。在x86_32中,未启用PAExen支持二级分页,启用PAE支持三级分页,X86_64中支持四级分页。
为了实现Domain的安全隔离,guestos对页表的更新必须由xen进行确认,xen提供了一些超级调用来完成这项工作。在未经xen的确认时,guestos即使对自己的页表也无权更改。出于性能考虑,guestos可以批处理页表更新。
因为伪物理模型的引入,有几个概念需注意。MFN指的是真实的物理机器的页框号,比如用在伪物理地址到机器地址的转换中。GMFN指客户机认为的真实机器的物理页框号,在泛虚拟化中GMFN=MFN,在全虚拟化中由于guestos意识不到,GMFN!=MFN,GMFN=GPFN。GPFN指guestos的物理页框号,即guestos看到的连续的物理地址空间。PFN在具体上下文中可以指以上三种。
在xen的分页模式中,有三种模式即直接模式,影子模式和硬件支持页表,在xen中会根据情况使用。
a.直接模式
直接模式用在泛虚拟化中,它的效率很高,但是guestos必须经过修改。在这种模式下,guestos维护的页表对MMU可见。由guestos更新页表,但是必须经过xen验证。为了验证页表更新,xen将每一个内存页和一种页类型相关联。页类型分为页目录(PD),页表(PT),局部描述符表(LDT),全局描述符表(GDT),读写页(RW)。不论什么类型的页,guestos都可以读自己的内存。xen提供了超级调用mmu_upadte批处理验证页表更新。由xen维护M2P(MachinetoPhysical)表,且该表对guestos可见,guestos维护P2M(PhysicalltoMachine)表。页表中存储的内容是HPA(硬件物理地址),如图4.4所示为直接模式图。
此外还存在一种可写模式,它其实是直接模式的扩展。Guestos有一种错觉感觉自己可以直接更新页表。在这种模式下,xen可以捕捉到guestos的更新页表。如果更新发生时,xen会临时允许guestos对页的写访问,同时将当前使用的页和页表断开连接,待重新验证后连接入页表,此时新更新的表项才对MMU可见。xen提供了vm_assist这个超级调用完成该功能。如图4.5所示为可写页表原理图。
b.影子模式
影子模式用在全虚拟化和泛虚拟化的活动移植中,它的效率很低。在这种模式下,guestos和平时一样使用页表。但是该页表对MMU不可见。Xen在自己的内存中维护guestos页表的一个副本。M2P表和P2M表均由xen维护,guestos对两个表都不知道。如图4.6所示为影子模式图。
c.硬件支持页表
硬件支持页表正如名字所示,该类型页表需要硬件的支持,它用在全虚拟化中。Intel提供了ExtendedPageTables(EPT),AMD有或“NestedPaging”或NestedPageTables(NPT)。它的原理很简单,由硬件完成P2M转换。
因篇幅问题不能全部显示,请点此查看更多更全内容