说明:
- KVM版本:5.9.1
- QEMU版本:5.0.0
- 工具:Source Insight 3.5, Visio
1. 概述
深入分析Linux虚拟化KVM-Qemu之ARMv8虚拟化文中描述过内存虚拟化大体框架,再来回顾一下:
- 非虚拟化下的内存的访问
- CPU访问物理内存前,需要先建立页表映射(虚拟地址到物理地址的映射),最终通过查表的方式来完成访问。在ARMv8中,内核页表基地址存放在TTBR1_EL1中,用户空间页表基地址存放在TTBR0_EL0中;
- 虚拟化下的内存访问
- 虚拟化情况下,内存的访问会分为两个Stage,Hypervisor通过Stage 2来控制虚拟机的内存视图,控制虚拟机是否可以访问某块物理内存,进而达到隔离的目的;
- Stage 1:VA(Virtual Address)->IPA(Intermediate Physical Address),Host的操作系统控制Stage 1的转换;
- Stage 2:IPA(Intermediate Physical Address)->PA(Physical Address),Hypervisor控制Stage 2的转换;
猛一看上边两个图,好像明白了啥,仔细一想,啥也不明白,本文的目标就是将这个过程讲明白。
在开始细节讲解之前,需要先描述几个概念:
gva - guest virtual address
gpa - guest physical address
hva - host virtual address
hpa - host physical address
- Guest OS中的虚拟地址到物理地址的映射,就是典型的常规操作,参考之前的内存管理模块系列文章;
铺垫了这么久,来到了本文的两个主题:
- GPA->HVA;
- HVA->HPA;
开始吧!
资料直通车:Linux内核源码技术学习路线+视频教程内核源码