ARM中MMU工作原理
本文描述基于存储器管理单元的系统结构, 包含以下内容:
· 关于存储器管理单元的结构
· 存储器访问的顺序
· 转换过程
· 访问权限
· 域
· 异常
· CP15 寄存器
http://embedded.homeunix.org 30/06/2003
Page 3 of 3
3.1 关于存储器管理单元的结构
MMU 存储器系统的结构允许对存储器系统的精细控制。大部分的控制细节由存在存
储器中的转换表提供。这些表的入口定义了从1KB 到1MB 的各种存储器区域的属
性。这些属性包括:
虚拟地址到物理地址映射
ARM 处理器产生的地址叫虚拟地址,MMU 允许把这个虚拟地址映射到一个不
同的物理地址去。这个物理地址表示了被访问的主存储器的位置。
它允许用很多方式管理物理存储器的位置,例如:它可以用具有潜在冲突的
地址映射为不同的进程分配存储器,或允许具有不连续地址的应用把它映射
到连续的地址空间。
------注------
如果使用了快速上下文切换扩展(Fast Context Switch Extension),则在
本文中的虚拟地址的意思应该是修改过的虚拟地址(Modified virtual
address)
---------------
存储器访问权限(permissions)
这些控制对存储器区域的不可访问权限、只读权限、读写权限。当访问不可
访问权限的存储器时,会有一个存储器异常通知ARM 处理器。
允许权限的级别也受程序运行在用户状态还是特权状态影响,还受是否使用
了域有关。
高速缓存和缓冲位(Cachability and bufferability bits [C and B])
这些在高速缓存和缓冲一节讲
系统控制协处理器的寄存器允许对系统的高级控制,如转换表的位置。他们也用来
为ARM 提供内存异常的状态信息。
查找整个转换表的过程叫转换表遍历。它由硬件制动进行,并需要大量的执行时间
(至少一个存储器访问,通常是两个)。为了减少存储器访问的平均消耗, 转换表
http://embedded.homeunix.org 30/06/2003
Page 4 of 4
遍历结果被高速缓存在一个或多个叫作Translation Lookaside Buffers(TLBs)的
结构中。通常在ARM 的实现中每个内存接口有一个TLB。
· 有一个存储器接口的系统通常有一个唯一的TLB
· 指令和数据的内存接口分开的系统通常有分开的指令TLB 和数据TLB
如果系统有高速缓存, 高速缓存的数量也通常是由同样的方法确定的。所以在高
速缓存的系统中,每个高速缓存一个TLB。
当存储器中的转换表被改变或选中了不同的转换表(通过写CP15 的寄存器2),先
前高速缓存的转换表遍历结果将不再有效。MMU 结构提供了刷新TLB 的操作。
MMU 结构也允许特定的转换表遍历结果被锁定在一个TLB 中,这就保证了对相关的
存储器区域的访问绝不会导致转换表遍历,这也对那些把指令和数据锁定在高速缓
存中的实时代码有相同的好处。
3.2 存储器访问的顺序
当ARM 要访问存储器时,MMU 先查找TLB 中的虚拟地址表,如果ARM 的结构支持分
开的地址TLB 和指令TLB,那么它用:
· 取指令使用指令TLB
· 其它的所有访问类别用数据TLB
如果TLB 中没有虚拟地址的入口,则转换表遍历硬件从存在主存储器中的转换表中
获取转换和访问权限,一旦取到,这些信息将被放在TLB 中,它会放在一个没有使
用的入口处或覆盖一个已有的入口。关于转换表的信息和转换表遍历的实现参见转
换过程一节。
一旦为存储器访问的TLB 的入口被拿到,这些信息将被用于:
1. C(高速缓存)和B(缓冲)位被用来控制高速缓存和写缓冲,并决定是否高速
缓存。(如果系统中没有高速缓存和写缓冲,则对应的位将被忽略)
2. 访问权限和域位用来控制访问是否被允许。如果不允许,则MMU 将向ARM 处理
器发送一个存储器异常;否则访问将被允许进行。
访问权限、域和异常几节有详细描述。
http://embedded.homeunix.org 30/06/2003
Page 5 of 5
3. 对没有高速缓存的系统(包括在没有高速缓存系统中的所有存储器访问),物
理地址将被用作主存储器访问的地址。
对有高速缓存的系统,在高速缓存没有选中的情况下,物理地址将被用行取
(line fetch)的地址。如果选中了高速缓存,则物理地址将被忽略。
图3-1 说明了这种高速缓存系统
访问控
制硬件
TLB
ARM
处理器
高速缓
存和写
缓冲
转换表遍历
硬件
高速缓
存行取
硬件
主
存
储
器
虚拟地址
异常
域位
C, B位
物理地址
图3-1 高速缓存的MMU存储器系统
http://embedded.homeunix.org 30/06/2003
Page 6 of 6
3.2.1 允许和禁止MMU
通过写系统控制协处理器的寄存器1 的第0 位可以允许和禁止MMU。在复位后这位
是0,MMU 被禁止。
当MMU 被禁止时,存储器访问将被按如下处理:
1. 由具体的实现确定当MMU 被禁止时是否能够允许高速缓存和写缓冲。
· 当MMU 被禁止时不能允许高速缓存和写缓冲时,C 和B 位不起作用。
· 当MMU 被禁止时能允许高速缓存和写缓冲时:
i. 访问数据时被认为没有高速缓存和写缓冲(C==0,B==0)
ii. 取指令时:
a) 当系统只有一个唯一的TLB 时,认为是没有高速缓存。(C==0)
b) 当系统只有独立的指令TLB 时,认为是有高速缓存。(C==1)
2. 没有存储器访问权限的检查,MMU 也不产生异常信号。
3. 物理地址与虚拟地址相同(即所谓的平坦地址映射模式)。
在允许MMU 之前,必须在内存中建立适当的转换表,并且所有相关的CP15 寄存器
要被初始化正确。
注:-------------------
允许和禁止MMU 直接改变了虚拟地址到物理地址的映射(除非转换表被设定为平坦
地址映射模式)。所以很可能在允许MMU 时所有的高速缓存需要被刷新。
另外,如果允许MMU 的指令的物理地址和虚拟地址不同,取指令将变得复杂化。所
以,强烈建议允许MMU 的指令具有相同的物理地址和虚拟地址。
--------------------------
http://embedded.homeunix.org 30/06/2003
Page 7 of 7
3.3 转换过程
MMU 支持基于节或页的存储器访问:
节(Section) 构成1MB 的存储器块
支持3 中不同的页尺寸:
微页(Tiny page) 构成1KB 的存储器块
小页(Small page) 构成4KB 的存储器块
大页(Large page) 构成64KB 的存储器块
节和大页是支持允许只用一个TLB 入口去映射大的存储器区间。小页和大页有附加
的访问控制:小页分成1KB 的子页,和大页分成16KB 的子页。微页没有子页,对
微页的访问控制是对整个页。
存在主存储器内的转换表有两个级别:
第一级表 存储节转换表和指向第二级表的指针。
第二级表 存储大页和小页的转换表。一种类型的第二级表存储微页转换表。
MMU 把CPU 产生的虚拟地址转换成物理地址去访问外部存储器,同时继承并检查访
问权限。地址转换有四条路径。路径的选取由这个地址是被标记成节映射访问还是
页映射访问确定。页映射访问可以是大、小和微页的访问。
然而,转换过程总是由下面所描述的那样由第一级表的获取开始。节映射的访问只
需要读取第一级表,页映射的访问还需要读取第二级表。
3.3.1 转换表基址
当片上(on-chip)的TLB 中不包含被要求的虚拟地址的入口时,转换过程被启
动。转换表基址寄存器(CP15 的寄存器2)保存着第一级转换表基址的物理地址。
只有bits[31:14]有效,bits[13:0]应该是零(SBZ)。所以第一级表必须在16KB
的边界。
3.3.2 取第一级表
http://embedded.homeunix.org 30/06/2003
Page 8 of 8
转换表基址寄存器的bits[31:14]与虚拟地址的bits[31:20]和两个0 位连接形成
32 为物理地址,如图3-2。这个地址选择了一个四字节的转换表入口,它是第一级
描述符或是指向第二级页表的指针。
转换基址 SBZ
转换基址 表索引 00
31 14 13 0
31 20 19 0
31 14 13 2 10
表索引 xxxxxxxxxxxxxxxxxxxxxx
图3-2 访问转换表的第一级描述符
http://embedded.homeunix.org 30/06/2003
Page 9 of 9
3.3.3 第一级描述符
第一级表的每个入口是一个描述它所关联的1MB 虚拟地址是如何映射的描述符。见
表3-1,根据bits[1:0]的组合,有四种可能:
· 如果bits[1:0]==0b00,所关联的地址没有被映射,试图访问他们将产生一
个转换错(fault)。因为他们被硬件忽略,所以软件可以利用这样的描述
符的bits[31:2]做自己的用途。推荐为描述符继续保持正确的访问权限。
· 如果bits[1:0]==0b10,这个入口是它所关联地址的节描述符。见节描述符
和转换节参考中的细节。
· 如果bits[0]==1,这个入口给出粗糙第二级表(bit[1]==0),或精细第二
级表(bit[1]==1)。每一种类型的表描述了它所关联的1MB 存储区域的映
射。粗糙第二级表较小,每个表1KB,每个精细第二级表4KB。然而粗糙第
二级表只能映射大页和小页,精细第二级表可以映射大页、小页和微页。
3.3.4 节描述符和转换节参考
如果第一级描述符是节描述符,那么各个字段有如下的意义:
Bits[1:0] 描述符类型标识(0b10 表示节描述符)
Bits[3:2] 高速缓存和缓冲位
Bits[4] 由具体实现定义
Bits[8:5] 这个描述符控制的节的16 种域之一
Bits[9] 现在没有使用,应该为零
Bits[11:10] 访问控制,见表3-3
Bits[19:12] 现在没有使用,应该为零
Bits[31:20] 节基址,形成物理地址的高12 位
忽略 00
粗糙页表基址 sbz 域 imp 00
节基址 SBZ AP sbz 域 imp C B 10
精细页表基址 SBZ 域 imp 11
31 20 19 12 11 10 9 8 5 4 3 2 10
表 3-1 第一级描述符格式
错
粗糙页表
节
精细页表
http://embedded.homeunix.org 30/06/2003
Page 10 of 10
图3-3 表示了节转换的完整过程。
注:---------------
访问权限必须在物理地址产生之前去检查,检查�