电子说
1, 介绍
前面的文章《一文搞懂Cortex-A77(ARMv8架构)工作原理》,《一文搞懂cpu cache工作原理》介绍CPU、cache的组成与工作原理,这篇文章将介绍CPU与cache之间的MMU的组成与工作原理。通过本文可以了解CPU访问的虚拟地址是怎么转换成物理地址,然后通过物理地址在cache、主存或者EMMC中获取相应的数据。
早期的内存是比较小的,一般是几十k,不过相应的程序也是比较小的,这时程序可以直接加载到内存中运行。后来为了支持多个程序的并行,内存中出现了固定分区,在编译阶段将不同程序,划分在不同的内存区域上。这种方式存在不少问题:一是内存分区大小与程序大小要匹配,二是地址空间无法动态的增长。于是内存动态分区思想便诞生了,内存上线划出一块区域给操作系统,然后剩余的内存空间给用户进程使用,这样用户程序所使用的内存空间,跟随程序大小及数目进行变动。
不论是静态分析,还是动态分区,都存在一些问题:进程地址空间安全问题、内存使用效率低。为了能够让多程序安全、高效地并行运行,物理内存中需要存放多个程序的代码及数据,这时虚拟内存便诞生了。不得不说虚拟内存是一个伟大的发明,一方面它让每个程序认为自己是独自、连续的使用内存,另一方面,每个程序之间的内存形成了安全隔离,避免程序破坏彼此的内存。
后来随着软件的快速发展,一个程序的大小变得很大,这时物理内存大小跟不上程序大小增加的速度。这样便不能将整个程序加载到物理内存中,一是物理内存没有这么大,二是如果将整个程序加载到内存,为了多程序并行,就需要将大量的数据及代码换入、换出,这导致程序运行效率低下。
虚拟内存并没解决高效使用内存的问题,好在程序运行遵循时间、空间局部性原理,进而出现了分页机制。分页机制从根本上解决了高效使用物理内存的问题。每次只需要将几页的代码、数据从磁盘中加载到内存,程序就能正常运行。当程序运行的过程中,需要新的代码、数据会产生缺页异常,这些代码、数据就会从磁盘加载到内存,然后程序从异常恢复正常运行。
对于支持虚拟内存,分页机制的系统,处理器直接寻址虚拟地址,这个地址不会直接发给内存控制器,而是先发给内存管理单元(Memory Manager Unit,MMU)。MMU就是负责将虚拟地址转换和翻译成物理地址的一个硬件模块,其实MMU所做的事,完全可以通过CPU来实现。为啥还要一个MMU硬件模块呢?就是为了提升虚拟地址到物理地址转换的速度,减少转换所消耗的时间。
MMU包含两个模块TLB(Translation Lookaside Buffer)和TWU(Table Walk Unit)。TLB是一个高速缓存,用于缓存页表转换的结果,从而缩短页表查询的时间。TWU是一个页表遍历模块,页表是由操作系统维护在物理内存中,但是页表的遍历查询是由TWU完成的,这样减少对CPU资源的消耗。
虚拟内存及分页机制的出现,解决了进程地址空间安全性的问题和内存使用效率低的问题,但是也引入了系统性能变差的问题。本来CPU可以直接通过访存执行程序,但是现在引入了虚拟地址到物理地址的转换。MMU硬件模块的出现,就是为了解决这个性能问题。因此,几G运行内存的电脑,可以并行运行几十G的多程序,让你在听歌的同时,能够并行处理编辑文档,下载电影,收发邮件等。
2, 框架
2.1 内存管理体系结构
在SMP(Symmetric Multi Process,对称多处理器)系统中,每个处理器内置了MMU模块,MMU模块包含了TLB和TWU两个子模块。TLB是一个高速缓存,用于缓存虚拟地址到物理地址的转换结果。页表的查询过程是由TWU硬件自动完成的,但是页表的维护是需要操作系统实现的,页表存放在主存中。
页表的查询是一个耗时的过程,理想情况下,TLB命中,可以从中直接得到虚拟地址对应的物理地址。当TLB未命中的时候,MMU才会通过TWU查询页表,从而翻译虚拟地址得到物理地址。得到物理地址后,首先要查询该物理地址的内容是否存在于cache中,若cache命中,则直接取出物理地址对应的内容返回给处理器。
若cache没有命中,会进一步访问主存获取相应的内容,然后回写到cache,并返回给处理器。如果没能在页表中查询到虚拟地址对应的物理地址,则会触发一个与MMU相关的缺页异常,在异常处理的过程中,会将EMMC中相关的数据加载到主存,然后建立相应的页表,然后将物理地址对应的内容返回给cache及处理器。
2.2 MMU相关的基本概念
(1)虚拟地址相关基本概念
虚拟内存(Virtual Memory,VM):为每个进程提供了一致的、连续的、私有的内存空间,简化了内存管理。将主存看成是一个存储在磁盘上的地址空间的高速缓存,当运行多个进程或者一个进程需要更多的空间时,主存显然是不够用的,这时需要更大、更便宜的磁盘保存一部分数据。
虚拟地址空间(Virtual Address Space,VAS):每个进程独有。
虚拟页(Virtual Page,VP):把虚拟内存按照页表大小进行划分。
虚拟地址(Virtual Address,VA):处理器看到的地址。
虚拟页号(Virtual Page Number,VPN):用于定位页表的PTE。
(2)物理地址相关的基本概念
物理内存(Physical Memory,PM):主存上能够使用的物理空间。
物理页(Physical Page):把物理内存按照页表的大小进行划分。
物理地址(Physical Address,PA):物理内存划分很多块,通过物理内存进行定位。
物理页号(Physical Page Number,PPN):定位物理内存中块的位置。
(3)页表相关的基本概念
页表(Page Tabel):虚拟地址与物理地址映射表的集合。
页表条目(Page Table Entry,PTE):虚拟地址与独立地址具体对应的记录。
页全局目录(Page Global Directory,PGD):多级页表中的最高一级。
页上级目录(Page Upper Directory,PUD):多级页表中的次高一级。
页中间目录(Page Middle Directory,PMD):多级页表中的一级。
2.3 页命中、缺页
(1)页命中
a) 处理器要对虚拟地址VA进行访问。 b) MMU的TLB没有命中,通过TWU遍历主存页表中的PTE地址。 c) 主存向MMU返回PTE。 d) MMU通过PTE映射物理地址,并把它传给高速缓存或主存。 e) 高速缓存或主存返回物理地址对应的数据给处理器。
(2)缺页
a) 处理器要对虚拟地址VA进行访问。 b) MMU的TLB没有命中,通过TWU遍历主存页表中的PTE地址。 c) 主存向MMU返回PTE。 d) PTE中有效位是0,MMU触发一次异常,CPU相应缺页异常,运行相应的处理程序。 e) 缺页异常处理程序选出物理内存中的牺牲页,若这个页面已经被修改,将其换出到EMMC。 f) 缺页异常处理程序从EMMC中加载新的页面,并更新内存中页表的PTE。 g) 缺页异常处理程序返回到原来的进程,再次执行导致缺页的指令。CPU将引起缺页异常的虚拟地址重新发给MMU。由于虚拟页面现在缓存在主从中,主存会将所请求的地址对应的内容返回给cache和处理器。
2.4 多级页表映射过程
物理页面大小一级地址总线宽度不同,页表的级数也不同。以AArch64运行状态,4KB大小物理页面,48位地址宽度为例,页表映射的查询过程如图:
对于多任务操作系统,每个用户进程都拥有独立的进程地址空间,也有相应的页表负责虚拟地址到物理地址之间的转换。MMU查询的过程中,用户进程的一级页表的基址存放在TTBR0。操作系统的内核空间公用一块地址空间,MMU查询的过程中,内核空间的一级页表基址存放在TTBR1。
当TLB未命中时,处理器查询页表的过程如下:
处理器根据虚拟地址第63位,来选择使用TTBR0或者TTBR1。当VA[63]为0时,选择TTBR0,TTBR中存放着L0页表的基址。
处理器以VA[47:39]作为L0的索引,在L0页表中查找页表项,L0页表有512个页表项。
L0页表的页表项中存放着L1页表的物理基址。处理器以VA[38:30]作为L1索引,在L1页表中找到相应的页表项,L1页表中有512个页表项。
L1页表的页表项中存放着L2页表的物理基址。处理器以VA[29:21]作为L2索引,在L2页表中找到相应的页表项,L2页表中有512个页表项。
L2页表的页表项中存放着L3页表的物理基址。处理器以VA[20:12]作为L1索引,在L3页表中找到相应的页表项,L3页表中有512个页表项。
L3页表的页表项里,存放着4KB页面的物理基址,然后加上VA[11:0],这样就构成了物理地址,至此处理器完成了一次虚拟地址到物理地址的查询与翻译的工作。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !