飞腾CPU体系结构(十三)
飞腾CPU体系结构(十三)
1. 虚拟地址到物理地址的映射
程序员编程一般都是使用虚拟地址,无论是否用到高速缓存,飞腾CPU的内存管理单元MMU都会把虚拟地址翻译成物理地址,然后根据物理地址进行数据的实际访问操作。
内存管理单元MMU负责将虚拟地址翻译成物理地址,即虚拟地址到物理地址的映射。这种映射关系仅仅描述了
- 从虚拟地址到物理地址的单向性映射关系;
- 一个或多个虚拟地址可以同时映射到相同的物理地址上;
- 而且这种映射是以页帧长度为粒度来处理的。
2.页和页帧
- 页
虚拟内存概念,页长度是CPU内部内存管理单元MMU定义的- 页帧
物理内存概念,页帧长度和页长度保持一样
2.1 页
页长度的定义是根据程序和数据的局部性原理来定义的,一般说来常规页长度为4K、16K和64K。在服务器应用场景中64K页长度比较普遍,所以后面我们都以64K的页长度来讲解飞腾CPU的虚拟内存管理机制。
2.2 虚拟地址空间
64位虚拟地址空间,分成三部分:
- 内核地址空间
- 用户地址空间
- 空洞是内核地址空间和用户地址空间之间的隔离区。
Linux操作系统中的每个进程具有专属的、等长的用户地址空间,所有进程共享一个内核地址空间。
3. 页表和页表项
以页长度为粒度,将虚拟地址空间和物理地址空间进行逻辑切割。从虚拟地址到物理地址的映射关系就可以用从虚拟页号到物理页帧号的映射关系来表述。因此这种映射关系包含三部分内容:
- 虚拟页号
- 物理页帧号
- 映射属性
每一个进程的用户地址空间内的所有虚拟页到物理页帧的映射关系都要进行描述,因此用户地址空间上的映射关系就形成一个映射关系数组,虚拟页号就是映射关系数组的索引号。
针对某个进程的整个用户地址空间而言,每一个虚拟页的映射关系就是一个页表项;所有虚拟页的映射关系数组就是该进程的用户地址空间页表。由于虚拟页帧号就是页表项在页表中的索引号 ,因此页表项只需要包含物理页帧号和映射属性。
4.飞腾CPU 页表
针对64K的页帧长度,飞腾CPU采用三级页表方式来设计页表结构。本节不详细介绍三级页表结构,我们可以简单地理解为三维数组结构,一般情况下虚拟页帧号连续的无效页表项很多,因此三维数组具有稀疏性。采用三级页表结构主要为了节省内存资源。
5.飞腾CPU 物理地址
ARMv8支持最大物理地址长度为48位,ARMv8.2可以支持最大52位,目前飞腾CPU支持44位物理地址。如果页帧长度为64K=216,物理页帧号最多需要52-16=36位。因此,飞腾CPU的每个页表项只需要64位,就可以包含物理页帧号和映射属性。