已经介绍过了native下的Memory Type,那么,虚拟化下的Memory Type又是何般境地呢?

1. History

前辈们在影子页表时代探索过Memory Type的虚拟化。可以参考Maintaining cache coherencyDisheng Su: Cache Attribute Virtualization in Xen。反正我也看不明白细节,但是,需要知道的是:在影子页表时代,Memory Type的虚拟化需要软件做很多事情。当来到EPT页表时代,软件需要做的事情就没有那么多了。

EPT中的Memory Type在SDM Vol3的28.3.7 EPT and Memory Typing有详细的介绍。

2. EPT and Memory Typing

中文翻译转载自Intel SDM Chapter 28: VMX Support for Address Translation

涉及EPT的Memory Type有两个,首先是walk EPT时,访问EPT各级页表项所采用的Memory Type:

  • CR0.CD = 0,则采用的Memory Type由EPTP的第0-2位决定,取0表示UC,取6表示WB
  • CR0.CD = 1,则采用的Memory Type为UC

其次是Guest访问内存时,采用的Memory Type,它由两个因素决定:

  • EPT Memory Type:即EPT中最后一级页表项的第3-5位,起相当于MTRR的作用
    • 取0表示UC,取1表示WC,取4表示WT,取5表示WP,取6表示WB,这与MTRR中Type的含义相同
    • 此时MTRR完全不起作用
  • PAT Memory Type:
    • CR0.PG = 0,则PAT Memory Type为WB
    • CR0.PG = 1,则PAT Memory Type为Guest页表翻译时根据MSR[IA32_PAT]确定的PAT Memory Type

最终产生的Memory Type如下:

  • CR0.CD = 0
    • 若末级页表项的IPAT = 0,则Memory Type就是将EPT Memory Type当做MTRR Memory Type和PAT Memory Type合并后的结果
    • 若末级页表项的IPAT = 1,则Memory Type就是EPT Memory Type
  • CR0.CD = 1,则Memory Type为UC

IPAT即Ignore PAT(末级页表项的第6位),如下图标注所示:

MTRR Memory Type和PAT Memory Type合并后的结果: