笔者这篇文章主要从使用者的角度介绍MMU的相关概念和工作原理。
在了解MMU之前需要了解下面几个概念:
页表
发生变化(页表的概念后面会介绍)。简单的说,MMU(Memory Management Unit)指内存管理单位。负责虚拟地址与物理地址之间的转化、内存保护、权限控制等事务。
为什么要用MMU,说白了就是为什么要用虚拟地址?那STM32来说,它的运行程序使用的是物理地址(也就是说编译链接后的指令用的是物理地址)。那么如果要让两个独立的程序在STM32上跑,那这两个程序的物理地址必须没有重叠(如我们常用的在线升级程序+应用程序的现象)。那么就出现了一个问题:编译程序之前就要商量好物理地址段的使用。可事实是像window、linux这些系统我们要用这么多的软件。压根就没法做到这点。当然也没有必要做。虚拟地址就可以很好的解决这个问题。有了虚拟地址,我们的所有应用程序都可以使用相同的虚拟地址,然后内核程序通过控制页表(也就是上面提到的f()函数)来将它们放在不同的物理地址上。这就是虚拟地址系统的一个重要特征:地址重定位
(address relocation)。地址重定位是将处理器核产生的地址转换到主存的不同地址,转换由MMU硬件完成。
在了解MMU基本工作原理之前需要了解下面几个概念:
页表
:也叫转换表(Translation Table).它负责MMU虚拟地址与物理地址之间的映射关系,由用户编写并存放在内存中,然后将其首地址存放在cpu的cp15:c2控制器。这样就可以将MMU与页表联系起来,进行转换工作了。页表由很多个页表项
组成。页表项
(page table entry):简写为PTE。它是页表
的组成单位。它里面保存这虚拟地址到物理地址的转换关系以及权限控制等内容。一个页表项占四个字节。后面会详细讲解每种页表项的格式。页表基地址
(TTB):也叫转换表基地址(Translation Table Base address).就是页表的首地址。MMU根据首地址就可以访问页表的所有页表项。由用户填写在cpu的cp15:c2寄存器。TLB
(转换旁路缓冲器):简单说就是一个高速的cache,专门用来缓存频繁使用的页表项
。转换关系
:后面我们会一直提到这个词。它指虚拟地址到物理地址的转换关系。说白了,就是一个物理基地址,存在于页表项
的高几位。这个地址用来计算最终的物理地址。页表搜索
(page table walk):在页表中搜索有效的转换数据。页
(page):大多数使用MMU的机器都采用分页机制。虚拟地址空间以页为单位进行划分(比如linux最常用的页为4K),而相应的物理地址空间也被划分,其使用的单位称为页帧.页帧
:(page frame):见上面的页
。页表
负责MMU虚拟地址与物理地址之间的映射关系,因此我们现在就重点来研究页表
。
ARM MMU采用2级页表结构:一级页表
(L1)和二级页表
(L2).
一级页表
(L1): 页表
中只有一个一级页表
。通常把它叫做L1主页表
(L1 master page table).一级页表
将4GB的地址空间划分成了4096个1MB的段
(section).也就是说它有4096个页表项
(一个页表项占4byte的空间,所以一个一级页表就占4096*4byte=4KB的空间)。4096个页表项
按其功能分为2中类型:
普通页表项
: 此页表项
中包含的是虚拟地址到物理地址的转换关系(即虚拟地址对应物理页帧的首地址).指针页表项
:此页表项
中包含的是指向二级页表
的指针。二级页表
(L2):由于一级页表
的划分粒度是1MB,划分粒度太粗,所以需要使用二级页表
来进行细分。一级页表
通过L1指针页表项
把它们两者链接了起来。MMU访问时就可以通过一级页表
的L1指针页表项
访问对应的二级页表
。从这个关系我们可以看出,二级页表
一般有多个,其数量等于L1指针页表项
的数量。二级页表
根据细分的粒度,又可以将分为下面几种类型(不同MMU对二级页表的划分可能不一致,但原理一致):
小页表
(small):小页表的页表项数量=1MB/4KB=256个。(一个页表项占4byte的空间,所以一个粗页表就占256*4byte=1KB的空间)。大页表
(large):大页表的页表项数量=1MB/64KB=64个。(一个页表项占4byte的空间,所以一个粗页表就占16*4byte=64byte的空间)。大页表
还是小页表
,它们里面的页表项都是普通页表项
.包含的是虚拟地址到物理地址的转换关系.(即虚拟地址对应物理页帧的首地址)。上面提到了页表项由4个字节组成,每种页表项的32bit内容格式都有区别,具体如下图:
上图中的 C、B、control等黄色外的区域跟内存保护、权限控制有关。具体需要参考官方文档,这里不多讲解。
L2页表除了64KB页表项和4KB页表项,可能还有1KB的页表项。(这些都与具体的MMU有关,需要参考具体的官方手册).读者可以在看完后面的转换流程后,思考它的转换关系位应该是多少bit。
有了对页表
组织结构的了解,我们就可以很方便的理解MMU地址的转换流程。大体流程如下,然后结合图说细节。
当cpu发出一个读写请求的虚拟地址,MMU首先查看它的高速缓存TLB
中是否存在这个虚拟地址到物理地址的转换关系(后面简称转换关系)。如果存在,说明物理地址找到,转换流程完成。如果不存在,就需要用到页表
来查找了。流程如下:
页表
的首地址(TTB
),也就是L1主页表
的起始地址。L1主页表
的具体的页表项
上。比如bit[31:20]=0x008,则对应L1主页表中0~4095个列表项的第8个。bit[31:20]=0xFFF,对应第4095(0xFFF)个列表项。L1主页表
中具体的页表项
后,MMU根据页表项
的bit[1:0]位判断是普通页表项
还是指针页表项
?如果是普通页表项
。因为它包含转换关系,说明物理地址找到,转换流程完成。如果是指针页表项
,那么MMU就根据指针指向的二级页表
来继续查找。二级页表
中,MMU又根据虚拟地址的bit[19:12](此处指4KB页表)定位到二级页表
的具体的页表项
上。比如bit[19:12]=0x008,则对应二级页表中0~255个列表项的第8个。因为二级页表
的页表项
是普通页表项
,它包含转换关系,所以物理地址找到,转换流程完成。例:某处理器MMU要将虚拟地址0x80143210转换出它的物理地址。其中页表
存放在主存的0x20000000的位置,页表中的第2049个页表项的值为0x42000002.
转换流程如下:
页表
的首地址TTB=0x20000000.转换关系
存放在L1主页表的第个2049(0x801)页表项
中.页表项
的值为0x42000002。其中的类型位bit[1:0]=2可知此页表项为L1的普通页表项
。所以转换关系
的bit[31:20]=0x420直接指向物理页帧。所以虚拟地址0x80100010对应的物理地址的bit[31:20]=0x420.bit[19:0]=虚拟地址的bit[19:0]=0x43210.即物理地址为0x42043210.例:某处理器MMU要将虚拟地址0x80143210转换出它的物理地址。其中页表
存放在主存的0x20000000的位置,页表中的第2049个页表项的值为0x42000001.地址0x4200010C处的内容为0x60100002.
转换流程如下:
页表
的首地址TTB=0x20000000.转换关系
存放在L1主页表的第个2049(0x801)页表项
中.页表项
的值为0x42000001。其中的类型位bit[1:0]=1可知此页表项为L1的指针页表项
。所以转换关系
的bit[31:10]=0x420000为所需的二级页表首地址的bit[31:10],二级页表首地址的bit[9:0]=0x00(固定为0).所以二级页表首地址=0x42000000;页表
是MMU的核心,理解了它MMU就理解的差不了。后面会继续介绍MMU在系统中的应用于练习。
此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。