本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/9284635
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
引:本文多处使用以下术语,声明如下:
GVA,Guest Virtual Address客户机进程的线性地址GPA,Guest Physical Address 客户机的物理地址
HVA,Host Virtual Address 宿主机进程的线性地址
HPA,Host Physical Address 宿主机的物理地址
在KVM机制下,客户系统运行在CPU的非根模式,透明的完成地址翻译,即对客户机而言,一条客户机虚拟地址经MMU翻译为客户机物理地址而返回。但实际过程则稍微复杂,因为每一条客户机物理地址也都是真实存在于物理内存上的,而虚拟机所在的地址空间并不是真实的内存物理地址空间,所以客户域下的GPA需要再经过某种地址翻译机制完成到HPA的转化,才能够取得真实物理内存单元中的内容。
KVM提供了两种地址翻译的机制,基于软件模拟的影子页表机制,以及基于硬件辅助的扩展页表机制(Intel的EPT,AMD的NPT)。详细的机制介绍参见Reference,这里重介绍开启硬件支持的EPT/NPT地址翻译情况。地址翻译的流程:
与影子页表的构成略有不同(影子页表项存储的是GVA->HPA的映射),基于硬件辅助的地址翻译采用二维的地址翻译结构(“two-dimensional”),如以下两图所示。客户系统维护自身的客户页表,即完成GVA->GPA的映射,而具体的每一条客户页表项、客户页目录项都是真实存储在物理内存中的,所以需要完成GPA->HPA的映射,定位到宿主物理地址空间,以获得物理内存单元中的值。EPT/NPT页表就负责维护GPA->HPA的映射,并且EPT/NPT页表是由处理器的MMU直接读取的,可以高效的实现地址翻译。总结之,所谓“二维”的地址翻译结构,即客户系统维护自己的页表,透明地进行地址翻译;VMM负责将客户机请求的GPA映射到宿主机的物理地址,到真实的内存单元中取值。
一条完整的地址翻译流程为,处于非根