00. 目录

01. MMU简介

MMU(Memory Management Unit)主要用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权、多任务多进程操作系统。

02. MMU发展

学习一个知识点,很重要的一步是了解其**为什么而存在?它的存在是为了解决什么问题?**然后,在学习的过程中带着这些问题去理解、去思考。

在许多年以前,还是使用DOS或一些古老的操作系统时,内存很小,同时,应用程序也很小,将程序存储在内存中基本能够满足需要。随着科技的发展,图形界面及一些其他更复杂的应用出现,内存已经无法存储这些应用程序了,通常的解决办法是将程序分割成很多个覆盖块,覆盖块0最先运行,运行结束之后,就调用另一个覆盖块,虽然这些操作由OS来完成,但是,需要程序员对程序进行分割,这非常不高效;因此,人们想出了一个**虚拟存储器(virtual memory)**的方法。虚拟存储器的基本思想是:程序、数据、堆栈的总大小可以超过内存空间的大小,操作系统将当前运行的部分保存在内存中,未使用的部分保存在磁盘中。比如一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择可以决定哪部分4MB的程序内容保存在内存中,并在需要时,在内存与磁盘中交换程序代码,这样16MB的代码就可以运行在4MB的机器中了。注意:这里面包含了虚拟地址和物理地址的概念

03. 地址分类

地址的分类

一个程序在运行之前,没有必要全部装入内存,仅需要将那些要运行的部分先装入内存,其余部分在用到时从磁盘载入,当内存不足时,再将暂时不用的部分调出到磁盘。这使得大程序可以在较小的内存空间中运行,也使得内存中可以同时装入更多的程序并发执行,这样的存储器一般称为虚拟存储器

虚拟地址最终需要转换为物理地址才能读写实际的数据,通过将虚拟地址空间和物理空间划分为同样大小的空间(段或页),然后两个空间建立映射关系。

由于虚拟地址空间远大于物理地址,可能多块虚拟地址空间映射到同一块物理地址空间,或者有些虚拟地址空间没有映射到具体的物理地址空间上去(使用到时再映射)。

ARM CPU地址转换涉及三种地址:虚拟地址(VA,Virtual Address)、变换后的虚拟地址(MVA,Modified Virtual Address)、物理地址(PA,Physical Address)

没有启动MMU时,CPU核心,cache,MMU,外设等所有部件使用的都是物理地址

启动MMU后,CPU核心对外发出虚拟地址VA;VA被转换为MVA供cache,MMU使用,在这里MVA被转换成PA;最后使用PA读取实际设备

①CPU核心看到和用到的只是虚拟地址VA,至于VA如果去对应物理地址PA,CPU核心不理会

②caches和MMU看不到VA,他们利用MVA转换得到PA

③实际设备看不到VA、MVA,读写它们使用的是物理地址PA

04. MMU工作过程

MMU是由协处理器(cp15)控制的,Exynos 4412多会用到两级页表:以段(Section,1MB)的方式进行转换时只用到一级页表,以页(page)的方式进行转换时用到两级页表。页的大小有3种:大页(64KB),小页(4KB),极小页(1KB)。

条目也称为"描述符"(Descriptor),有:段描述符,大页描述符,小页描述符,极小页描述符----它们保存段、大页、小页或极小页的起始物理地址;粗页表描述符、细页表描述符—他们保存二级页表的物理地址

转换过程如下:

(1) 根据给定的虚拟地址找到一级页表中的条目

(2) 如果此条目是段描述符,则返回物理地址,转换结束

(3) 如果此条目是二级页表描述符,继续利用虚拟地址在二级页表中找到下一个条目;

(4) 如果这第二个条目是叶描述符,则返回物理地址,转换结束;

(5) 其他情况出错
【ARM】Tiny4412裸板编程之MMU简介_MMU

05. 段地址转换过程

使用 MVA[31:20]来索引一级页表(20-31 一共 12 位,2^12=4096,所以是4096 个描述符)。其中段地址的转换流程如下图所示:
【ARM】Tiny4412裸板编程之MMU简介_MMU_02

再来看看TTB
【ARM】Tiny4412裸板编程之MMU简介_内存管理单元_03

简单的来说,它保存了一级页表所存放的实际物理地址,要求16KB对齐,以段的方式映射,4GB的虚拟地址空间,需要段描述符4096个(每个段描述符映射1M空间),没个描述符占用4byte,所以一段的方式映射一级页表占用的空间为16KB。

在这里我们假设,我们的一级页表存放在物理地址:0x30000000.

第一步:
获得虚拟地址所对应的段描述符所在的地址
addr = TTB&0xffffc000 | ((viraddr >> 20) << 2 ) = 0x30000000 & 0xfffc000 | ((0xa0004000 >> 20) << 2)= 0x30000000 | (0xa00 << 2) = 0x30002800

第二步:
从0x30002800取出虚拟地址所对应的段描述符

​ 段描述的构造我们到后面再来讲解,这里我们假设我们把0xa0004000映射到实际的物理地址0x30004000,则这里的[31:20]为0x300

第三步:
组合成实际的物理地址

phyaddr = 0x300 << 20 | (0xa0004000 & 0xfffff) = 0x30004000

06. 二级页表描述符

大页描述符

​ 位[31:16]为大页基址,此描述符的低16位填充0后就是一块64KB物理地址空间的起始地址粗页表中的每个条目只能表示4KB物理空间,如果大页描述符保存在粗页表中,则连续16个条目都保存同一个大页描述符。类似的,细页表中每个条目只能表示1KB的物理空间,如果大页描述符保存在细页表中,则连续64个条目都保存同一个大页描述符。

下面以保存在粗页表中的大页描述符为例,说明地址转化那过程

①页表基址寄存器[31:14]和MVA[31:20]组成一个低两位为0的32位地址,MMU利用这个地址找到粗页表描述符

②取出粗页表描述符的[31:10](即粗页表基址),它和MVA[19:12]组成一个低两位为0的32位物理地址,通过这个地址找到大页描述符

③取出大页描述符的[31:16](即大页基址),它和MVA[15:0]组成一个32位的物理地址,即MVA对应的PA

步骤②和③中,用于在粗页表中索引的MVA[19:12]、用于在大页内寻址的MVA[15:0]有重合的位[15:12],当位[15:12]从0b0000变化到0b1111时,步骤②得到的大页描述符相同,所以粗页表中有连续16个条目保存同一个大页描述符。

大页的地址转换过程(大页描述符保存在粗页表中)
【ARM】Tiny4412裸板编程之MMU简介_内存管理单元_04

小页描述符

[31:12]为小页基址(Small page base address),此描述符的低12位填充0后就是一块4kb([11:0],一共12位,2^12=4096)物理地址空间的起始地址。粗页表中每个条目表示4kb的物理空间,如果小页描述符保存在粗页表中,则只需要用一个条目来保存一个小页描述符。类似的,细页表中每个条目只能表示1kb的物理空间,如果小页保存在细页表中,则连续4个条目都保存同一个小页描述符。

下面以保存在粗页表中的小页描述符为例,说明地址转换过程:

①页表基址[31:14]和MVA[31:20]组成一个低两位为0的32位地址,MMU利用这个地址找到粗页表描述符

②取出粗页表描述符[31:10](即粗页表基址),它和MVA[19:12]组成一个低两位为0的32位物理地址,用这个地址找到小页描述符

③取出小页描述符的位[31:12](即小页基址),它和MVA[11:0]组成一个32位物理地址(即MVA对应的PA)

小页描述符保存在细页表中,地址转换过程和上面类似。

小页的地址转换过程(小页描述符保存在粗页表中)

极小页描述符

​ [31:10]为极小页基址(Tiny page base address),此描述符的低10位填充0后就是一块1KB物理地址空间的起始地址。极小页描述符只能保存在细页表中,用一个条目来保存一耳光极小页描述符

下面是极小页的地址转换过程:

①页表基址寄存器[31:14]和MVA[31:20]组成一个低两位为0的32位地址,MMU通过这个地址找到细页表描述符

②取出细页表描述符[31:12](即细页表基址),它和MVA[19:10]组成一个低两位为0的32位物理地址,通过这个地址即可找到极小页描述符

③取出极小页描述符[31:10](即极小页基址),它和MVA[9:0]组成一个32位的物理地址(即MVA对应的PA)

极小页的地址转换过程(极小页描述符保存在粗页表中)

从段、大页、小页、极小页的地址转换过程可知

①以段进行映射时,通过MVA[31:20]结合页表得到一段(1MB)的起始物理地址,MVA[19:0]用来在段中寻址

②以大页进行映射时,通过MVA[31:16]结合页表得到一个大页(64KB)的起始物理地址,MVA[15:0]用来在小页中寻址

③以小页进行映射时,通过MVA[31:12]结合页表得到一个小页(4KB)的起始物理地址,MVA[11:0]用来在小页中寻址

④以极小页进行映射时,通过MVA[31:10]结合页表得到一个极小页(1KB)的起始物理地址,MVA[9:0]用来在极小页中寻址

内存的访问权限检查

它决定一块内存是否允许读、是否允许写。这由CP15寄存器C3(域访问控制)、描述符的域(Domain)、CP15寄存器C1的R/S/A位、描述符的AP位共同决定。

“域”决定是否对某块内存进行权限检查,“AP”决定如何对某块内容进行权限检查。

exynos4412有16个域,CP15寄存器C3中每两位对应一个域(一共32位),用来表示这个域是否进行权限检查

每两位数据的含义

00:无访问权限(任何访问都将导致“Domain fault”异常)

01:客户模式(使用段描述符、页描述符进行权限检查)

10:保留(保留,目前相当于“无访问权限”)

11:管理模式(不进行权限检查,允许任何访问)

Domain占用4位,用来表示内存属于0-15,哪一个域

例如:

①段描述符中的“Domain”为0b0010,表示1MB内存属于域2,如果域访问控制寄存器的[5:4]等于0b00,则访问这1MB空间都会产生“Domain fault”异常,如果等于0b01,则使用描述符中的“Ap”位进行权限检查

②粗页表中的“Domain”为0b1010,表示1MB内存属于域10,如果域访问控制寄存器的[21:20]等于0b01,则使用二级页表中的大页/小页描述符中的"ap3"、“ap2”、“ap1”、"ap0"位进行权限检查,如果等于0b11,则允许任何访问,不进行权限检查。

07. TLB的作用

从MVA到PA的转换需要访问多次内存,大大降低了CPU的性能,有没有办法改进呢?

程序执行过程中,用到的指令和数据的地址往往集中在一个很小的范围内,其中的地址、数据经常使用,这是程序访问的局部性。

由此,通过使用一个高速、容量相对较小的存储器来存储近期用到的页表条目(段、大页、小页、极小页描述符),避免每次地址转换都到主存中查找,这样就大幅提高性能。这个存储器用来帮助快速地进行地址转换,成为转译查找缓存(Translation Lookaside Buffers, TLB)

当CPU发出一个虚拟地址时,MMU首先访问TLB。如果TLB中含有能转换这个虚拟地址的描述符,则直接利用此描述符进行地址转换和权限检查,否则MMU访问页表找到描述符后再进行地址转换和权限检查,并将这个描述符填入TLB中,下次再使用这个虚拟地址时就直接使用TLB用的描述符。

使用TLB需要保证TLB中的内容与页表一致,在启动MMU之前,页表中的内容发生变化后,尤其要注意。一般的做法是在启动MMU之前使整个TLB无效,改变页表时,使所涉及的虚拟地址对应的TLB中条目无效。

08. Cache的作用

同样基于程序访问的局部性,在主存和CPU通用寄存器之间设置一个高速的、容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用,对提高程序的运行速度有很大作用。这个cache一般称为高速缓存。

①写穿式(Write Through)

任一CPU发出写信号送到Cache的同时,也写入主存,保证主存的数据同步更新。优点是操作简单,但由于主存速度慢,降低了系统的写速度并占用了总线的时间。

②回写式(Write Back)

数据一般只写到Cache,这样可能出现Cache中的数据得到更新而主存中的数据不变(数据陈旧)的情况。此时可在Cache中设一个标志地址及数据陈旧的信息,只有当Cache中的数据被换出或强制进行”清空“操作时,才将原更新的数据写入主存响应的单元中,保证了Cache和主存中数据一致。

Cache有以下两个操作:

①”清空“(clean):把Cache或Write buffer中已经脏的(修改过,但未写入主存)数据写入主存

②”使无效“(Invalidate):使之不能再使用,并不将脏的数据写入主存。

09. 附录

Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf

参考博客:javascript:void(0)