ver0.1
[看前序文章有惊喜,关注W\X\G=Z+H=“浩瀚架构师”,可以解锁全部文章]
前言
前一篇文章我们和大家探讨内存虚拟化的原理,很多小伙伴私信我666的、还有没看懂的,…其实都很正常,主要是怪作者水平一般没说明白。写这些文章的初衷就是和大家分享交流,也是抛砖引玉,希望更多的伙伴能够加入研究虚拟化技术的群体中来。还有我们这是非主流社区,不适应的,我劝你留下来慢慢适应,哈哈哈哈。我们这个系列的文章写得线条都比较粗,一方面是限于篇幅,另外一方面是限于作者精力有限,还有最重要的一方面就是笔者认为,要深入一个基础体系首先还是要建立宏观的框架,然后再深入到这个框架的某个面或者线深入下去,这样的效率比较高。比如虚拟化的核心Hypervisor: [V-01]虚拟化概论-Hypervisor(VMM)(基于AArch64)。你要研究虚拟化技术,起码对这个核心要有一些最起码的感觉才可以。另外由于虚拟化技术和体系的深度耦合性,比如ARM、x86、RISC-V,这就需要你得花一些精力研究系统架构,而作为系统架构的核心Master-CPU[V-02] 虚拟化基础-CPU架构(基于AArch64)更是需要优先了解,并建立起起码的感觉。也许你可能会说,为啥是"感觉",哈哈哈,别问,问就是当年一个大神和我说的。后来历尽沧桑之后,发现神说的是对的,就和谈恋爱一样,就是反反复复拉扯,时间长了有感觉了,才能继续下去。说到这里想到了给公司的新员工培训,300多人巴巴的讲了两天,讲得Linux、QNX、神经网络技术一点没记住,扯得犊子,怎么谈恋爱,怎么辨别人家是否真心喜欢你还是把你当备胎, 怎么判断明星会不会塌方…记得死死地。2、3年之后在在公司看见我,张嘴就是老师你讲得全对(吴某凡确实塌了),此情此景,我一般都会说,别叫我老师,我不配,哈哈哈哈。再扯回来,我们今天会针对大家的一些疑问结合ARM体系对内存的虚拟化再深入一下,对一些细节再写得清晰一些,希望能帮助大家加深对内存虚拟化的理解。
正文
1.1 Stage-2 Translation Overview
前一篇文章中,我们讲述了ARM体系下实现内存虚拟化的核心技术点,就是在MMU和ARM异常处理机制的配合下完成的虚拟地址空间到物理地址空间的转换,让软件上下文获得了运行的必要物理内存空间的资源。还是老规矩,看图说话。如图1-1所示,这是一个典型的基于ARM架构的两级地址翻译模型。
先对这个模型做一个简要的分析:
(1) 首先理解的就是虚拟机VM,因为VM是连接GustOS和Hypervisor的纽带。而VM是工作在IPA 空间,那么就要先对IPA空间有一个充分的认识。
(2) 我们可以看到IPA空间到PA的空间也需要映射,这个映射的过程同样需要记录,一块物理内存空间分配给了VM1,就不能再分配给VM2了,那么Hypervisor同样需要一个账本对这些空间分配的行为做记录,而对这个Stage-2阶段的账本,我们同样需要搞清楚。
(3) 两本帐就是两个页表,VA到IPA再到PA,需要关联两个页表,而页表项中记录着这个VA空间和IPA空间的属性。这两边的属性一致的时候还好,不一致的时候ARM又是怎么处理的,这个方面也需要搞清楚。
在展开具体讨论之前我们还是结合手册看一下Stage-2 Translation的官方定义:
Stage 2 translation allows a hypervisor to control a view of memory in a Virtual Machine (VM). Specifically, it allows the hypervisor to control which memory-mapped system resources a VM can access, and where those resources appear in the address space of the VM.
This ability to control memory access is important for isolation and sandboxing. Stage 2 translation can be used to ensure that a VM can only see the