阅读本文前,请先参阅文章 《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相关的数据结构及其影子页的表关了




Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐