Memory Type virtualization in VT-x
已经介绍过了native下的Memory Type,那么,虚拟化下的Memory Type又是何般境地呢?
1. History
前辈们在影子页表时代探索过Memory Type的虚拟化。可以参考Maintaining cache coherency和Disheng 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合并后的结果: