ver 0.1
[看前序文章有惊喜,关注WX公众*号“浩瀚架构师”,解锁更多精彩内容。]
前言
前面我们介绍了ARM的关于内存管理的软硬件体系,对相关的一些重要的基础组件和设计概念做了详细的介绍,目的就是和大家一起摸一摸ARM的AArch64 Virtual Memory System Architecture (VMSA)。VMSA体系的核心思想就是构建一个虚拟的内存世界,然后将这个世界分成不同的空间,在运行时让这些空间共享物理内存,最大程度的发掘硬件资源的价值。连接这两个世界的信使就是页表,前面的文章中我们也把页表称之为账本,并且说明了账册结构(多级页表架构)以及账本的明细的格式(页表描述符)。本文讲介绍MMU是如何使用页表完成虚拟地址到物理地址的映射,其实这个过程也是一般现代处理器地址映射的工作原理。
正文
1 页表映射
1.2 虚拟地址翻译的钥匙
前文专门有一篇文章介绍了地址空间,其实一个地址空间就是一段程序执行的上下文,这段程序可以是kernel、可以是用户空间的进程、可以是Hypervisor,也可以是Secure Firmware。ARM通过Exception模型和Secure模型对这些空间做了更加精细的划分,如图1-1所示。

上图中是比较典型的基于虚拟化架构的虚拟内存空间的划分。前序的文章中我们已经介绍过了,EL2层是可以配置的,当EL2层存在的时候,EL1&0虚拟地址空间需要经过两个阶段的翻译才能找到物理内存,而本文为了介绍地址翻译的原理我们简化一下模型,舍弃EL2层,让EL1&0地址空间可以直接映射到物理内存空间,如图1-2所示。

通过图1-2,我们从另外一个维度对EL1&0所代表的地址空间做了映射,这里可以看出EL1&0是共享整个64bits的虚拟地址空间,但是ARM觉得它太大了,不好管理,继续分,如图1-3所示。

通过系统寄存器TCR_ELx(Translation Control Register,地址翻译控制寄存器)的配置,EL1和EL0各自有了自己的虚拟地址空间。现代处理器和操作系统设计的目标就是多任务并发执行,最大程度的发挥硬件的性能,ARM也是如此。以linux系统为例,OS(Kernel)空间(EL1 Space)是共享的(Global),而用户空间(EL0)的各个App是需要做到进程之间隔离的,首先要做到的就是每个进程之间虚拟地址空间的隔离。这个隔离不是将“EL0 VA Space”分段处理然后分配给各个App,而是每个app都独占(Non-Global)属于自己的完整的“EL0 VA Space”。要实现这个设计思路,就需要记录虚拟地址空间分配使用情况的页表具备描述虚拟地址空间是否共享的能力,事实上也是这样,参考图1-4所示。

来看一下手册中对页描述符中nG位的描述:
For translation regimes that use an ASID, it is possible to mark translations as global or non

最低0.47元/天 解锁文章
2138

被折叠的 条评论
为什么被折叠?



