Stupid is as stupid does
分类: 虚拟化
2016-05-13 14:27:34
不得不承认,一直对影子页表和EPT技术都一知半解,是时候好好的认真的理解了。
先说普通的内存地址转换,首先明确基本知识点。
页表:确定了线性地址和物理地址的转换。
TLB 就是保存页表中对应的线性地址和物理地址的转换,这样的作用是为了加速。
过程:首先CPU会去根据线性地址查找TLB,如果有,则立马得到物理地址;若没有,则进行地址转换 ,并将结果更新到TLB。
所以说CPU并没有说页表一定要和TLB缓存的数据保持一致,若不一致的时候,查找TLB会引发 TLB Miss,然后会通过 TLB fill去修正TLB使之与页表保持一致。
之前,一直对页表这个词不太理解,现在可以这么理解吧,有了它,就可以通过线性地址找到物理地址,而这个页表是可以被用户更改,但是是给CPU查找的。
然后我们说下VTLB,这是基于VT_X技术优化。这里VM中的页表就不直接控制着线性地址和物理地址的转换了,即CR3寄存器指向的不是页表,而是影子页表了。所以呢,地址转换就通过的是影子页表和TLB来共同控制。
既然不是通过页表来查找地址了,那么每次修改其页表,也就不会引发VM_Exit了。 所以呀,这里的页表和影子页表之间其实是不太同步的,有两种情况:
1,VM页表比影子页表有更多的访问权限,比如吧,VM页表中记录着线性地址和物理地址的对应关系,而影子页表不存在此关系,那么VM对线性地址的访问将导致页面故障,这里注意,是访问,不是修改,其实修改是不会产生页面故障的。VMM会捕获这个异常,然后根据VM页表来修正影子页表。
2,如果影子页表的关系更多,而VM页表被修改之后关系很少呢。此时,VM需要执行INVLPG指令或重装CR3寄存器来刷新TLB,VM在执行INVLPG指令或重装CR3寄存器时将导致VM exit,使VMM有机会根据VM的页表来修改影子页表,从而修补这种不一致性。发现没,其实影子页表的修改还是通过VM页表来作为参照的。
-------------
对于A位,只要VMM不先于VM建立线性地址到物理地址的映射关系,就可以确保捕获客户对内存的访问,进而有机会确保影子页表项和客户页表项在A位上的一致。因为,当客户首次访问某个线性地址时,由于影子页表中没有该线性地址到物理地址的对应关系,将导致一次页面故障,VMM可以捕获该故障,在影子页表中建立线性地址到物理地址的对应关系,并将客户页表中相应项的A位置1。
对于D位,VMM在影子页表中建立线性地址到物理地址间的映射之初,可以将页置为只读,这样当VM对该页进行写操作时,将导致页面故障,使VMM获得控制,进而有机会确保影子页表项和VM页表项在D位上的一致。
EPT由VMM控制,并且仅在处理器工作于非根模式时才参与地址转换。采用EPT后,客户在读写CR3和执行INVLPG指令时不会导致VM exit,并且由于客户页表结构自身导致的页故障也不会导致VM exit,因此极大地提高了内存虚拟化的效率,简化了内存虚拟化的实现。