内存虚拟化:为什么会有影子页表

一、影子页表

   1. 为什么会有影子页表?

       我们给虚拟机分配内存的时候肯定是非连续的内存,但是qemu给虚拟机内部呈现的必须是连续的内存。能否通过一次转换来完成从虚拟机内部进程的虚拟地址到真实的物理地址的转换呢?

  初略的想这是做不到的,因为虚拟机操作系统内核的页表机制已经写死了,它转换出来的肯定是虚拟机的“物理地址”,而非host的物理地址。

  既然如此,那么我们是否可以把每次对vm的物理地址访问转换成host的物理地址呢?Like this:

 

   实际上,肯定是转换了的,毕竟数据是保存在host的物理内存上。但是这里已经没有MMU可供使用了(在没有EPT的情况),用纯软件你的方式转换很耗时耗力(另外怎么使用到TLB呢)

   作为CPU设计者,他们考虑怎么解决这个问题呢?  我们都知道每次虚拟机内部进程切换的时候,其中有一个很重要的操作就是加载CR3寄存器(实际上对于CPU来说,它只是感受到在guest模式中有加载CR3寄存器操作)。是否会把这个操作设计成一个敏感指令?
  如果VMM不拦截这个敏感指令的话,我想它加载的是虚拟机操作系统自行维护的页表,那么MMU翻译出来的地址是vm的物理地址。 没有EPT的情况下这很糟糕,得在没有MMU的情况下内核自己去查页表(MMU已经被虚拟机用了),更糟糕的是物理机上这么多虚拟机并行执行,这样内存操作的效率很低(这就回答了)。
  那么我们去拦截这个敏感指令吧,让VMM去加载一个特殊的页表,这个MMU加载的页表可以把VM的虚拟地址直接翻译成HOST的物理地址。这个页表就叫影子页表(只是这个特殊的页表有点难构建啊)

 

posted @ 2018-04-08 10:47  你的KPI完成了吗  阅读(546)  评论(0)    收藏  举报