4 内存虚拟化
4.1 客户机物理地址空间
在物理机上,虚拟地址通过Guest页表即可转换为物理地址。但是在虚拟化环境中,由于VMM和VM都需要独立的地址空间,则产生了冲突。
为实现内存虚拟化,让客户机使用一个隔离的、从零开始且具有连续的内存空间,KVM 引入一层新的地址空间,即客户机物理地址空间 (Guest Physical Address, GPA),该地址空间并不是真正的物理地址空间,它只是宿主机(Host主机)虚拟地址空间在Guest地址空间的一个映射。对Guest来说,客户机物理地址空间都是从零开始的连续地址空间,但对于宿主机来说,客户机的物理地址空间并不一定是连续的,客户机物理地址空间有可能映射在若干个不连续的宿主机地址区间,如下图所示:
由于物理MMU只能通过Host机的物理地址(Host Physical Address, HPA)进行寻址,所以实现内存虚拟化,关键是需要将Guest机的虚拟地址(Guest Virtual Address, GVA)转换为HPA。传统的实现方案中,这个过程需要经历:GVAàGPAàHVAàHPA的转换过程,需要对地址进行多次转换,而且需要KVM的介入,效率非常低。为提供GVA到HPA的地址转换效率,KVM提供了两种地址转换方式: