MMU相关概念及工作原理介绍

MMU相关概念及工作原理介绍

笔者这篇文章主要从使用者的角度介绍MMU的相关概念和工作原理。

一. MMU是什么,为什么要用它

在了解MMU之前需要了解下面几个概念:

  1. 物理地址(Physical Address):简写为PA.我们在STM32等MCU上见到的全是物理地址。像内存等的访问需要物理地址。物理地址是实际存在的。
  2. 虚拟地址(virtual Address):简写为VA.是假地址,只有cpu才识别它。它和物理地址的关系类似加密文档。物理地址为加密前的文档,虚拟地址则为加密后的文档。用公式表达则为VA = f(PA).当函数f()改变,同一物理地址对应的虚拟地址也就不同。
  3. 其中函数f()可以比作是MMU.用于虚拟地址与物理地址之间的转化。函数f()可以看作MMU的页表发生变化(页表的概念后面会介绍)。

简单的说,MMU(Memory Management Unit)指内存管理单位。负责虚拟地址与物理地址之间的转化、内存保护、权限控制等事务。

为什么要用MMU,说白了就是为什么要用虚拟地址?那STM32来说,它的运行程序使用的是物理地址(也就是说编译链接后的指令用的是物理地址)。那么如果要让两个独立的程序在STM32上跑,那这两个程序的物理地址必须没有重叠(如我们常用的在线升级程序+应用程序的现象)。那么就出现了一个问题:编译程序之前就要商量好物理地址段的使用。可事实是像window、linux这些系统我们要用这么多的软件。压根就没法做到这点。当然也没有必要做。虚拟地址就可以很好的解决这个问题。有了虚拟地址,我们的所有应用程序都可以使用相同的虚拟地址,然后内核程序通过控制页表(也就是上面提到的f()函数)来将它们放在不同的物理地址上。这就是虚拟地址系统的一个重要特征:地址重定位(address relocation)。地址重定位是将处理器核产生的地址转换到主存的不同地址,转换由MMU硬件完成。

二. MMU结构关系和相关概念

下图是MMU在处理器中的位置图:MMU相关概念及工作原理介绍_第1张图片

在了解MMU基本工作原理之前需要了解下面几个概念:

  1. 页表:也叫转换表(Translation Table).它负责MMU虚拟地址与物理地址之间的映射关系,由用户编写并存放在内存中,然后将其首地址存放在cpu的cp15:c2控制器。这样就可以将MMU与页表联系起来,进行转换工作了。页表由很多个页表项组成。
  2. 页表项(page table entry):简写为PTE。它是页表的组成单位。它里面保存这虚拟地址到物理地址的转换关系以及权限控制等内容。一个页表项占四个字节。后面会详细讲解每种页表项的格式。
  3. 页表基地址(TTB):也叫转换表基地址(Translation Table Base address).就是页表的首地址。MMU根据首地址就可以访问页表的所有页表项。由用户填写在cpu的cp15:c2寄存器。
  4. TLB(转换旁路缓冲器):简单说就是一个高速的cache,专门用来缓存频繁使用的页表项
  5. 转换关系:后面我们会一直提到这个词。它指虚拟地址到物理地址的转换关系。说白了,就是一个物理基地址,存在于页表项的高几位。这个地址用来计算最终的物理地址。
  6. 页表搜索(page table walk):在页表中搜索有效的转换数据。
  7. (page):大多数使用MMU的机器都采用分页机制。虚拟地址空间以页为单位进行划分(比如linux最常用的页为4K),而相应的物理地址空间也被划分,其使用的单位称为页帧.
  8. 页帧:(page frame):见上面的

MMU页表的结构组成

页表负责MMU虚拟地址与物理地址之间的映射关系,因此我们现在就重点来研究页表

ARM MMU采用2级页表结构:一级页表(L1)和二级页表(L2).

  1. 一级页表(L1): 页表中只有一个一级页表。通常把它叫做L1主页表(L1 master page table).一级页表将4GB的地址空间划分成了4096个1MB的(section).也就是说它有4096个页表项(一个页表项占4byte的空间,所以一个一级页表就占4096*4byte=4KB的空间)。4096个页表项按其功能分为2中类型:
    1. 普通页表项: 此页表项中包含的是虚拟地址到物理地址的转换关系(即虚拟地址对应物理页帧的首地址).
    2. 指针页表项:此页表项中包含的是指向二级页表的指针。
  2. 二级页表(L2):由于一级页表的划分粒度是1MB,划分粒度太粗,所以需要使用二级页表来进行细分。一级页表通过L1指针页表项把它们两者链接了起来。MMU访问时就可以通过一级页表L1指针页表项访问对应的二级页表。从这个关系我们可以看出,二级页表一般有多个,其数量等于L1指针页表项的数量。二级页表根据细分的粒度,又可以将分为下面几种类型(不同MMU对二级页表的划分可能不一致,但原理一致):
    1. 小页表(small):小页表的页表项数量=1MB/4KB=256个。(一个页表项占4byte的空间,所以一个粗页表就占256*4byte=1KB的空间)。
    2. 大页表(large):大页表的页表项数量=1MB/64KB=64个。(一个页表项占4byte的空间,所以一个粗页表就占16*4byte=64byte的空间)。
      不管是大页表还是小页表,它们里面的页表项都是普通页表项.包含的是虚拟地址到物理地址的转换关系.(即虚拟地址对应物理页帧的首地址)。

上面提到了页表项由4个字节组成,每种页表项的32bit内容格式都有区别,具体如下图:MMU相关概念及工作原理介绍_第2张图片
上图中的 C、B、control等黄色外的区域跟内存保护、权限控制有关。具体需要参考官方文档,这里不多讲解。
L2页表除了64KB页表项和4KB页表项,可能还有1KB的页表项。(这些都与具体的MMU有关,需要参考具体的官方手册).读者可以在看完后面的转换流程后,思考它的转换关系位应该是多少bit。

MMU基本工作原理和地址转换流程

有了对页表组织结构的了解,我们就可以很方便的理解MMU地址的转换流程。大体流程如下,然后结合图说细节。

当cpu发出一个读写请求的虚拟地址,MMU首先查看它的高速缓存TLB中是否存在这个虚拟地址到物理地址的转换关系(后面简称转换关系)。如果存在,说明物理地址找到,转换流程完成。如果不存在,就需要用到页表来查找了。流程如下:

  1. 首先从cp15:c2寄存器中获取到页表的首地址(TTB),也就是L1主页表的起始地址。
  2. 根据虚拟地址的bit[31:20]定位到L1主页表的具体的页表项上。比如bit[31:20]=0x008,则对应L1主页表中0~4095个列表项的第8个。bit[31:20]=0xFFF,对应第4095(0xFFF)个列表项。
  3. 确定了L1主页表中具体的页表项后,MMU根据页表项的bit[1:0]位判断是普通页表项还是指针页表项?如果是普通页表项。因为它包含转换关系,说明物理地址找到,转换流程完成。如果是指针页表项,那么MMU就根据指针指向的二级页表来继续查找。
  4. 二级页表中,MMU又根据虚拟地址的bit[19:12](此处指4KB页表)定位到二级页表的具体的页表项上。比如bit[19:12]=0x008,则对应二级页表中0~255个列表项的第8个。因为二级页表页表项普通页表项,它包含转换关系,所以物理地址找到,转换流程完成。
  5. 在找到转换关系后,MMU就会将此转换关系缓存到TLB中,方便下次使用。

一级页表直接转换流程举例

例:某处理器MMU要将虚拟地址0x80143210转换出它的物理地址。其中页表存放在主存的0x20000000的位置,页表中的第2049个页表项的值为0x42000002.

转换流程如下:

  1. 由页表存放地址可知页表的首地址TTB=0x20000000.
  2. 由虚拟地址的bit[31:20]=0x801可知此虚拟地址的转换关系存放在L1主页表的第个2049(0x801)页表项中.
  3. 由题目可知第个2049页表项的值为0x42000002。其中的类型位bit[1:0]=2可知此页表项为L1的普通页表项。所以转换关系的bit[31:20]=0x420直接指向物理页帧。所以虚拟地址0x80100010对应的物理地址的bit[31:20]=0x420.bit[19:0]=虚拟地址的bit[19:0]=0x43210.即物理地址为0x42043210.

下图是它的转换流程图:MMU相关概念及工作原理介绍_第3张图片

二级页表转换流程举例

例:某处理器MMU要将虚拟地址0x80143210转换出它的物理地址。其中页表存放在主存的0x20000000的位置,页表中的第2049个页表项的值为0x42000001.地址0x4200010C处的内容为0x60100002.

转换流程如下:

  1. 由页表存放地址可知页表的首地址TTB=0x20000000.
  2. 由虚拟地址的bit[31:20]=0x801可知此虚拟地址的转换关系存放在L1主页表的第个2049(0x801)页表项中.
  3. 由题目可知第个2049页表项的值为0x42000001。其中的类型位bit[1:0]=1可知此页表项为L1的指针页表项。所以转换关系的bit[31:10]=0x420000为所需的二级页表首地址的bit[31:10],二级页表首地址的bit[9:0]=0x00(固定为0).所以二级页表首地址=0x42000000;
  4. 由虚拟地址的bit[19:12]=0x43可以算出此虚拟地址位于二级页表的第67(0x43)个页表项。此页表项的d地址=0x42000000+ 67*4=0x4200010C. 由题目可知地址0x4200010C处的内容为0x60100002;
  5. 由0x0x60100002的bit[1:0]=2可知,它是一个4KB的页表项。所以最终得到的物理地址=虚拟地址bit[11:0]+4KB页表项的转换关系bit[31:12]=0x60100210;

下图是它的转换流程图:MMU相关概念及工作原理介绍_第4张图片

总结

页表是MMU的核心,理解了它MMU就理解的差不了。后面会继续介绍MMU在系统中的应用于练习。

参考资料

  1. ARM嵌入式系统开发:软件设计与优化.pdf

关于技术交流

此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。二维码

你可能感兴趣的:(初学linux,MMU工作原理,ARM,MMU,MMU是什么,页,页表,页表项)