阅读本文前,请先参阅文章 《tdp_page_fault 函数解析之level,gfn变量的含义》
依然感谢Intel OTC的 wufeng、OenHan、chenhe、ruanshuai给予的帮助和支持
本文将会对KVM中虚拟MMU的的几个关键成员含义进行分析。
这系数据结构和影子页表(spt)的关系如下图所示
a、 kvm结构
每个虚拟机一个,代表一个虚拟机
- arch成员是虚拟机级别的arch特性,其中通过hash和链表会将kvm_mmu_page结构管理起来,以后通过gfn就可以快速索引到一个gfn地址所用的页表页(kvm_mmu_page)
- vcpus成员指向一组虚拟机内的VCPU结构
b、 kvm_vcpu结构
对应一个VCPU
- arch成员是架构特性部分,如x86特性部分,arm特定部分等
c、kvm_vcpu_arch结构
VCPU中架构相关部分
- mmu成员指向vMMU结构,可以看出vMMU是每VCPU一个
- walk_mmu成员指向mmu
d. kvm_mmu结构
vMMU的数据结构
- root_hpa : 影子页表level4页表页物理地址,EPT情况下,该值就是VMCS的EPT_pointer
- root_level: guest中页表的级别,根据VCPU特性不同而不同,如开启long mode就是4,开启PAE的就是3等等
- shadow_root_level:就是影子页表的级数,EPT情况下这个是4
- root_level: guest中页表的级别,根据VCPU特性不同而不同,如开启long mode就是4,开启PAE的就是3等等
- base_role:里面设置了vMMU角色所代表的一些硬件特性,如是否开启了NX,是否开启了SMEP等
e. kvm_mmu_page结构
影子页表页的管理结构。
- spt:指向影子页表页,页中被分为多个spte。影子页表用的页面成为shadow page,一个页面中分为多个表项,每个表项成为spte,注意不论哪个级别,表项都成为spte
- role.level: kvm_mmu_page结构管理的页面可以作为影子页表中任何一个level的页表。也就是影子页表所代表的角色不同,有时候是level1 有时候是level4。其所管理的页面被用作哪个界别是靠role.level区分的。
- gfn: 每级的页表页都会管理GUEST物理地址空间的一部分,这段GUEST物理地址空间的起止地址对应的GFN就在这个成员中被记录下来。当通过gaddr遍历影子页表页的时候,就会根据gaddr算出gfn,然后看gfn落在每级中的哪个spte内,从而确定使用哪个spte,然后用spte来定位出下一级页表地址或pfn
f. 影子页表页
影子页表页,shadow page,就是装载影子页表的页面,每个页面中分为多个表项,每个表项成为spte,注意不论哪个级别,表项都成为spte。
好了,到此我们应该已经分析清楚KVM 中vMMU相关的数据结构及其影子页的表关了