ARM存储管理系统MMU
2016-07-13 来源:eefocus
CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分。如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,CPU在访问内存时发出的地址将直接传送到地址总线上,使具有相同地址的物理存储器被读写。这称为物理地址(Physical Address,以下简称PA),如下图所示:
图 1. 物理地址示意图
如果CPU启用了MMU,CPU核发出的地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成真正的物理地址发送到地址总线上,也就是将虚拟地址映射成物理地址,如下图所示:
图 2. 虚拟地址示意图
二、虚拟地址映射物理地址原理
页表是实现虚拟地址到物理地址转换的一个重要手段。我们在使用MMU以前,需要在内存中新建一个页表。表中的每一行(即一个字的大小)存放的是一个物理内存页的基地址,该页的访问权限和缓冲特性等,这里将页表中这样的一行称为一个地址变换条目。页表存放在内存中,CP15的C2寄存器用来存放页表的基地址。
多数使用虚拟存储器的系统都使用一种称为分页(paging)。虚拟地址空间划分成称为页(page)的单位。而相应的物理地址空间也被进行划分,单位是页框(frame).页和页框的大小必须相同。
虚拟地址被MMU分为两部分,,第一部分是页号索引(page Index),第二部分则是相对该页首地址的偏移量(offset)
当CPU访问一个地址时,该地址是虚拟地址,于是该地址被送到MMU,MMU再根据虚拟地址的高几位作为页号索引,在页表中寻找对应的地址变换条目。从地址变换条目中找到物理地址的页基地址,再加上虚拟地址中的偏移量,便得到了真正的物理地址,然后由MMU将物理地址发送到地址总线上,访问物理内存。
那么MMU是如何使用页号索引在页表中找到对应的地址变换条目呢?MMU会用CP15协处理其中的C2寄存器存放的页表基地址加上虚拟地址的页号索引值,然后便得到了页表中对应的地址变换条目的地址。其实页号索引就是相对于页表基地址的一个偏移量,然后使用基地址加偏移量的方式得到一个页表中的地址。
例:如图所示,如果分页大小为1M,虚拟地址为0x30000012,
虚拟地址的二进制码为 00110000 00000000 00000000 00010010 前12位为页号索引,后20位为偏移量,因为2^20 = 1M
前12位页号索引为00110000 0000 = 768,所以在页表中找到相对于页表基地址的偏移量为768的地址,然后得到地址变换条目。于是0x0300 << 20位,便得到了物理页基地址,再加上虚拟地址中的偏移位 0000 00000000 00010010 = 0x12,便得到了真正的物理地址 0x30000012 。
1、TLB的概念
从虚拟地址到物理地址的变换过程其实就是查询页表的过程,由于页表存放在内存中,这个查询过程通常代价很大。而程序在执行过程中具有局部性,也就是说,一段时间内,对页表的访问只是局限在少数几个单元中。根据这个特点,采用一个容量更小、访问速度更快的存储器来存放当前访问需要的地址变换条目。这个小容量的页表称为快表,也称TLB.
当CPU访问内存时,现在TLB中查找需要的地址变换条目。如果该条目不存在,CPU从位于内存的页表中查询,并把相应的结果添加到TLB中。这样,当CPU下一次又需要该地址变换条目时,可以从TLB中直接得到,从而使地址变换的速度大大加快。
当内存中的页表内容改变,或者通过修改CP15中的寄存器C2使用新的页表时,TLB的内容需要全部清除。MMU提供了相关的硬件支持这种操作。CP15中的寄存器C8用来 控制清除TLB内容的相关操作。
MMU可以将某些地址变换条目锁定在TLB中,从而使得进行与该地址变换条目相关的地址变换速度保持很快。在MMU中C10用于控制TLB内容的锁定。
注:TLB中存放的是地址变换条目,相当于一个小页表。
- 使无效TLB内容
有时候页表可能只是部分内容改变了,只影响了很少的地址映射关系,这种情况下,可以只使无效TLB对应的单个地址变换条目可能会提高系统性能。
系统协处理器CP15的寄存器C8就是清除TLB内容的相关操作。它是一个只写的寄存器。
MCR p15,0,Rd,c8,CRm,opcode_2
Rd中为要写入C8寄存器的内容,CRm和opcode_2的不同组合决定指令执行的不同操作。
指令 |
Rd |
含义 |
||||||||||||||||||||||||||||||||
MCR p15, 0, Rd, c8, c5, 0 |
0 |
使无效整个指令TLB |
||||||||||||||||||||||||||||||||
MCR p15, 0, Rd, c8, c5, 1 |
虚拟地址 |
b、禁止MMU时存储访问过程
c、禁止/使能MMU时应注意的问题
3、MMU中的地址变换过程
在ARM中,虚拟地址到物理地址的映射有两种方式,一级映射和二级映射。
a、一级映射
当使用一级映射时,只会用到一张页表,我们将它称为一级页表,用L1表示。一级映射时,虚拟空间被划分成段的单位,每段的大小为1M。而相应的物理空间也被进行这样的划分,单位是段框,段和段框的大小必须相同。
于是,首先在内存中建立一张页表(这个页表由我们自己建立),页表中的每一项存放的是一个物理段基地址,该页的访问权限和缓冲特性等。页表中每一项的大小为4字节,所以每一项的地址是字对齐。我们将页表中的每一格称为一个项。
因为ARM的可寻址范围为4G,且虚拟空间的每段大小为1M,所以如图所示,页表有4096个项。每一项对应一个段,每一项中存放的是一个物理段基地址,该页的访问权限和缓冲特性等。
虚拟地址被MMU分为两部分,第一部分为页索引号(bits[31:20]),第二部分是相对物理地址的偏移量(bits[0:19])。
所以当访问一个地址时,此地址是虚拟地址。MMU会用协处理器CP15的C2寄存器中的页表基地址+页索引号便查到了页表中对应的一项,从页表中相应的项中找到物理段基地址,然后:物理段基地址 + 偏移量(这个是虚拟地址的第二部分) = 物理地址。
注:虚拟空间并不真实存在,只是为方便理解才这么说。
例:
CPU要访问0x300008的地址,此地址为虚拟地址。MMU会根据页索引号(也就是 0x3 )找到相对页表基地址偏移量为0x3的项。这个项中的物理段基地址为0x006。
物理地址 = (0x006<<20)+0x8=0x600008
一级页表中一项的详细内容如下表所示:
段基地址:也就是物理空间的段首地址,1M大小对齐
AP: 访问控制位Access Permission
域: 标明了当前段属于哪个域 。Domain与AP配合使用,对访问权限进行检查 C: 如下表所示 B: 如下表所示 bits[1:0]: 00:相应1M的虚拟空间并没有被映射到物理空间,因此访问该存储空间将会产生地址变换失效信号,所以bits[31:2]的内容无效
10:这是一个一级映射的地址变换,所以存储的是要访问的物理段基地址
01:这是一个二级映射的地址变换,所以存储的是粗粒度的二级页表的基地址(后面会讲)11:这是一个二级映射的地址变换,所以存储的是细粒度的二级页表的基地址(后面会讲)
域标明了当前段属于哪个域。然后该段便具有了和该域一样的访问权限。
CP15 的寄存器 C3:
在 CP15的C3寄存器中,划分了 16个域,每个区域由两位构成,这两位说明了当前内存的检查权限:
00:当前级别下,该内存区域不允许被访问,任何的访问都会引起一个domain fault,这时 AP位无效
01:当前级别下,该内存区域的访问必须配合该内存区域的段描述符中AP位进行权检查
10:保留状态(我们最好不要填写该值,以免引起不能确定的问题) 11:当前级别下,对该内存区域的访问都不进行权限检查。 这时 AP位无效 所以只有当相应域的编码为 01 时,才会根据 AP位 和协处理器CP15中的C1寄存器的S,R位进行权限检查
b、二级映射 当使用二级映射时,一级页表L1仍然存在,但是一级页表中不再存放物理段基地址了,而是存放了二级页表的基地址,也就是二级页表的首地址。 一级页表要表示4G的地址范围,一共4096项,每一项都表示1M 的大小。二级页表相当于对一级页表这1M的范围作更详细的划分,所以每个二级页表要表示1M 的地址范围。 因为不论是一级页表还是二级页表,页表中的每一项都是四个字节,所以页表中每一项的地址都是字对齐的,也就是最低两位的值都为0。所以因为粗粒度的二级页表的基地址为22位,而偏移量只能为8位,则粗粒度的二级页表中只能有256个项,大小为1KB。而这256个项要表示1M大小,所以粗粒度二级页表中的每个项要表示4KB的物理空间范围。
进入单片机查看更多内容>> 上一篇:ARM存储器之:协处理器CP15 相关文章
|