ARM中MMU工作原理

来源:互联网 发布:淘宝返现网 编辑:程序博客网 时间:2024/05/16 11:34
本文描述基于存储器管理单元的系统结构, 包含以下内容:
·  关于存储器管理单元的结构
·  存储器访问的顺序
·  转换过程
·  访问权限
·  域
·  异常
·  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 表示了节转换的完整过程。
注:---------------
访问权限必须在物理地址产生之前去检查,检查访问权限的顺序见访问权限一节。
---------------------
表索引 节索引
31 20 19 0
虚拟地址
转换基址 SBZ
31 14 13 0
转换表基址
转换基址 表索引 00
31 14 13 2 1 0
第一级表地址
节基址 SBZ AP sbz 域 imp C B 10
31 20 19 12 11 10 9 8 5 4 3 2 1 0
第一级表描述符
节基址 节索引
31 20 19 0
物理地址
图3-3 节转换
First-level fetch
http://embedded.homeunix.org 30/06/2003
Page 11 of 11
3.3.5 粗糙页表描述符
如果第一级描述符是粗糙页表描述符,那么各个字段有如下的意义:
Bits[1:0] 描述符类型标识(0b01 表示粗糙页表描述符)
Bits[4:2] 由具体实现定义
Bits[8:5] 这个描述符控制的页的16 种域之一
Bits[9] 现在没有使用,应该为零
Bits[31:10] 页表基地址是一个指向第二极粗糙页表的指针,它给出第二级表访问
的基地址。而第二级粗糙页表必须在1KB 边界对齐。
如果从第一级读取到的是二级粗糙页表描述符,那么会象图3-4 所示执行第二级描
述符读取。
第一级表索引 第二级表索引 xxxxx
31 20 19 12 11 0
虚拟地址
转换基址 SBZ
31 14 13 0
转换表基址
转换基址 第一级表索引 0 0
31 14 13 2 1 0
第一级描述符地址
页表基址 sbz 域 imp 01
31 10 9 8 5 4 2 1 0
第一级描述符
页表基址 第二级表索引 00
31 10 9 2 1 0
第二级描述符地址
First-level fetch
图3-4 访问粗糙页表第二级描述符
http://embedded.homeunix.org 30/06/2003
Page 12 of 12
3.3.6 精细页表描述符
如果第一级描述符是精细页表描述符,那么各个字段有如下的意义:
Bits[1:0] 描述符类型标识(0b11 表示精细页表描述符)
Bits[4:2] 由具体实现定义
Bits[8:5] 这个描述符控制的页的16 种域之一
Bits[11:9] 现在没有使用,应该为零
Bits[31:10] 页表基地址是一个指向第二级精细页表的指针,它给出第二级表访问
的基地址。而第二级精细页表必须在4KB 边界对齐。
如果从第一级读取到的是二级精细页表描述符,那么会象图3-5 所示执行第二级描
述符读取。
第一级表索引 第二级表索引 xxxxx
31 20 19 10 9 0
虚拟地址
转换基址 SBZ
31 14 13 0
转换表基址
转换基址 第一级表索引 0 0
31 14 13 2 1 0
第一级描述符地址
页表基址 sbz 域 imp 01
31 12 11 9 8 5 4 2 1 0
第一级描述符
页表基址 第二级表索引 00
31 12 11 2 1 0
第二级描述符地址
First-level fetch
图3-5 访问精细页表第二级描述符
http://embedded.homeunix.org 30/06/2003
Page 13 of 13
3.3.7 第二级描述符
每个粗糙第二级表对映着以4KB 为单位的虚拟地址范围市怎么映射的,每个精细第
二级表对映着以1KB 为单位的虚拟地址范围市怎么映射的。那些入口是页描述符,
他们能够分别描述大于4KB 或1KB 的页。在这种情况下,这个描述符必须被重复足
够次,以保证这个页始终使用相同的描述符,不论访问这个页中的哪个虚拟地址。
对于一个第二级描述符,有四种可能,由描述符的bits[1:0]选择。见表3-2:
·  如果bits[1:0]==0b00,说关联的虚拟地址没有被映射,任何对这些虚拟地
址的访问将会导致转换错(fault)。软件可以利用这样的描述符的
bits[31:2]做自己的用途,因为他们被硬件忽略。推荐为描述符继续保持正
确的访问权限。
·  如果bits[1:0]==0b01,这个入口是大页描述符,描述64KB 的虚拟地址。
见转换大页参考。
一个大页描述符在精细第二级表中必须被重复64 次,在粗糙第二级表中必
须被重复16 次以保证所有的虚拟地址都被描述。
·  如果bits[1:0]== 0b10,这个入口是小页描述符,描述4KB 的虚拟地址。
见转换小页参考。
一个小页描述符在精细第二级表中必须被重复4 次,以保证所有的虚拟地址
都被描述。在粗糙第二级表中只有一个实例。
·  如果bits[1:0]== 0b11,这个入口是微页描述符,描述1KB 的虚拟地址。
见转换微页参考。
在精细第二级表中只需要一个微页描述符的实例。微页描述符不能在粗糙第
二级表中出现,如果出现了,结果不可预测。
忽略 00
大页基地址 SBZ AP3 AP2 AP1 AP0 C B 01
小页基地址 AP3 AP2 AP1 AP0 C B 01
微页基地址 SBZ AP C B 11
表3-2 第二级描述符格式
31 16 15 12 11 10 9 8 7 6 5 4 3 2 1 0

大页
小页
微页
http://embedded.homeunix.org 30/06/2003
Page 14 of 14
大页描述符字段
大页描述符的字段有如下意义:
bits[1:0] 表示描述符的类型
bits[3:2] 高速缓促和缓冲位
bits[11:4] 访问权限位。这些为控制对页的访问。关于这些位的解释见表3-3。
大页被分成4 各子页。
AP0 编码对第一个子页的访问权限。
AP1 编码对第二个子页的访问权限。
AP2 编码对第三个子页的访问权限。
AP3 编码对第四个子页的访问权限。
bits[15:12] 现在没有使用,应该为零。
bits[31:16] 用来形成物理地址的对应位。
小页描述符字段
小页描述符的字段有如下意义:
bits[1:0] 表示描述符的类型
bits[3:2] 高速缓促和缓冲位
bits[11:4] 访问权限位。这些为控制对页的访问。关于这些位的解释见表3-3。
小页被分成4 各子页。
AP0 编码对第一个子页的访问权限。
AP1 编码对第二个子页的访问权限。
AP2 编码对第三个子页的访问权限。
AP3 编码对第四个子页的访问权限。
bits[31:12] 用来形成物理地址的对应位。
微页描述符字段
微页描述符的字段有如下意义:
bits[1:0] 表示描述符的类型
bits[3:2] 高速缓促和缓冲位
bits[5:4] 访问权限位。这些为控制对页的访问。关于这些位的解释见表3-3 关
于微页的解释。
bits[9:6] 现在没有使用,应该为零。
bits[31:10] 用来形成物理地址的对应位。
http://embedded.homeunix.org 30/06/2003
Page 15 of 15
3.3.8 转换大页参考
图3-6 显示了在粗糙第二级表中转换一个64KB 的大页的完整顺序。在精细第二级
表中的转换顺序页相似,只是第二级描述符的地址如精细页表描述符一节所决定。
注:-----------------------------
页索引的高4 位和第二级表的低阶4 位重叠,在粗糙页表中大页的每个页表入口必
须被重复16 次。在精细页表中大页的每个页表入口必须被重复64 次。
-----------------------------------
大页基址 页索引
31 16 15 0
物理地址
大页基址 SBZ AP3 AP2 AP1 AP0 C B 0 1
31 16 15 121110 9 8 7 6 5 4 3 2 10
0
第二级描述符
页表基址 第二级表索引 00
31 10 9 2 10
第二级描述符地址
页表基址 sbz 域 imp 01
31 10 9 8 5 4 2 10
第一级描述符
转换基址 第一级表索引00
31 14 13 2 10
第一级描述符地址
转换基址 SBZ
31 14 13 2 10
转换表基址
第一级表索引 第二级表索引 页索引
31 20 19 16 15 12 11 0
虚拟地址
Second-level fetch
First-level fetch
图3-6 粗糙第二级表中的大页转换
http://embedded.homeunix.org 30/06/2003
Page 16 of 16
3.3.9 转换小页参考
图3-7 显示了在粗糙第二级表中转换一个4KB 的小页的完整顺序。在精细第二级表
中的转换顺序页相似,只是第二级描述符的地址如精细页表描述符一节所决定。
注:-----------------------------
当小页出现在精细第二级表中时,页索引的高2 位和第二级表的低阶2 位重叠,在
精细页表中小页的每个页表入口必须被重复4 次。
-----------------------------------
图3-7 粗糙第二级表中的小页转换
小页基址 页索引
31 12 11 0
物理地址
小页基址 AP3 AP2 AP1 AP0 C B 10
31 12 11 10 9 8 7 6 5 4 3 2 10
0
第二级描述符
页表基址 第二级表索引00
31 10 9 2 10
第二级描述符地址
页表基址 sbz 域 imp 01
31 10 9 8 5 4 2 10
第一级描述符
转换基址 第一级表索引 00
31 14 13 2 10
第一级描述符地址
第一级表索引 第二级表索引 页索引
31 20 19 12 11 0
虚拟地址
转换基址 SBZ
31 14 13 0
转换表基址
First-level fetch
Second-level fetch
http://embedded.homeunix.org 30/06/2003
Page 17 of 17
3.3.10 转换微页索引
图3-8 显示了在精细第二级表中转换1KB 微页的完整过程。
注:---------------------------
微页不能出现在粗糙第二级表中。
---------------------------------
转换基址 SBZ
31 14 13 0
转换表基址
第一级表索引 第二级表索引 页索引
31 20 19 10 9 0
虚拟地址
转换基址 第一级表索引 00
31 14 13 2 10
第一级描述符地址
页表基址 sbz 域 imp11
31 12 11 9 8 5 4 2 10
第一级描述符
微页表基址 SBZ AP C B 11
31 10 9 6 5 4 3 2 10
第二级描述符
页表基址 第二级表索引00
31 12 11 2 10
第二级描述符地址
微页表基址 页索引
31 10 9 0
物理地址
Second-level fetch
First-level fetch
图3-8 精细第二级表中的微页转换
http://embedded.homeunix.org 30/06/2003
Page 18 of 18
3.4 访问权限
在节和页描述符中的访问权限位控制对相应的节和页的访问。访问权限由CP15 的
寄存器1 的System(S)和ROM(R)位修改。表3-3 描述了访问权限位和S、R 位相互
作用时的意义。如果访问了没有访问权限的存储器空间,将会产生权限错(见异常
一节)。
表3-3 MMU 访问权限
AP
S
R
Privileged permissions
User permissions
0b00 0 0 不能访问 不能访问
0b00 1 0 只读 不能访问
0b00 0 1 只读 只读
0b00 1 1 不可预测 不可预测
0b01 X X 读/写 不能访问
0b10 X X 读/写 只读
0b11 X X 读/写 读/写
http://embedded.homeunix.org 30/06/2003
Page 19 of 19
3.5 域
域是节、大页和小页的集合。ARM 结构支持16 个域。对域的访问由域访问控制寄
存器的两个位字段控制。因为每个字段对访问对应的域的使能非常迅速,所以整个
存储器区间能很快地交换进出虚拟存储器。这里支持2 种域访问方式:
客户 域的用户(执行程序,访问数据),被形成这个域的节或页来监督访
问权限。
管理者 控制域的行为(域中的当前节和页,对域的访问),不被形成这个域
的节或页来监督访问权限。
一个程序可以是一些域的客户,也是另外一些域的管理者,同时没有对其它域的访
问权限。这允许对程序访问不同存储器资源的非常灵活的存储器保护。表3-4 说明
了域访问控制寄存器的位编码方式。
表3-4 域访问的值

访问方式
描述
0b00 不能访问 任何访问都将导致一个域错(domain fault)
0b01 客户 能否访问将根据节或页描述符中的访问权限位
确定
0b10 保留 使用这个值将导致不可预料的结果
0b11 管理者 不根据节或页描述符中的访问权限位确定能否
访问,所以不会产生权限错。(permission
fault)
http://embedded.homeunix.org 30/06/2003
Page 20 of 20
3.6 异常
由于存储器访问的约束而导致ARM 处理器停止执行的机制有:
MMU fault MMU 检测到约束并统治处理器
外部Abort 外部存储器系统发出一个非法存储器访问信号
MMU fault 和 外部Abort 都叫异常(ABORT)。
如果导致异常的存储器操作是取指令,那么当处理器去执行这个非法访问得到的指
令时产生一个预取指令异常。如果导致异常的存储器操作是存取数据,那么产生一
个数据异常。参见2.6 节。
3.6.1 MMU fault
MMU 产生4 种类型的fault
·  对齐错
·  转换错
·  域错
·  权限错
存储器系统能终止3 种类型的访问
·  line fetch
·  存储器访问(没有高速缓存和没有缓冲的访问)
·  转换表访问
MMU 检测到的异常在任何外部存储器访问发生之前被停止。终止导致外部异常的外
部访问是外部系统的职责。
系统控制协处理器有2 个寄存器,当外部访问被终止时更新。指令预取异常不更新
这些寄存器,由于程序流程的改变,产生遗产的指令没有被执行。
错误地址寄存器(FAR)和错误状态寄存器(FSR)
数据异常会被CPU 立即响应。FSR 被一个4 位的错误状态(FS[3:0])和域序号更
新。虚拟地址被写入FAR。如果数据访问连续地产生多个数据异常,则它们的优先
级由表3-5 决定。
由取指令产生的异常在指令进入指令流水线时被标记。只有当指令执行时产生预取
异常。一个异常导致取指令没有被执行如果那条指令不被使用(例如跳转到别处)
http://embedded.homeunix.org 30/06/2003
Page 21 of 21
通常当进入预取指令异常服务程序时,fault 所关联的地址被放在R14_abt 寄存器
中。由具体实现决定当预取指令异常产生时是否更新FSR 和FAR。但是预取指令异
常在数据异常产生时(更新FAR 和FSR)和进入数据异常项量入口时绝不更新FSR
和FAR。也就是说数据异常可以使用FAR 和FSR 的值,它们不会被预取指令异常给
破坏。
表3-5 fault 状态的优先级编码
优先

源 FSR[3:0] Domain[3:0] FAR
最高 Terminal Exception 0b0010 Invalid Implementation
Defined
Vector Exception 0b0000 Invalid Valid
Alignment 0b00x1 Invalid Valid
External Abort
Translation: 1st level
2nd level
0b1100
0b1110
Invalid
Valid
Valid
Valid
Translation:
Section
Page
0b0101
0b0111
Invalid
Valid
Valid
Valid
Domain:
Section
Page
Ob1001
0b1011
Valid
Valid
Valid
Valid
Permission:
Section
Page
Ob1101
Ob1111
Valid
Valid
Valid
Valid
External Abort on
Linefetch:
Section
Page
0b0100
0b0110
Valid
Valid
Valid
Valid
最低 External Abort on
Non_lineFetch:
Section
Page
0b1000
0b1010
Valid
Valid
Valid
Valid
---注--------
Alignment 能写0b0001 或0b0011 到FSR[3:0]。
在域(Domain[3:0])中的非法值是因为fault 发生在有效的域被装入之前。
任何被优先级编码屏蔽的异常能够由修改原来的异常(by fixing the primary
abort) 并重新执行那条指令产生。
http://embedded.homeunix.org 30/06/2003
Page 22 of 22
Vector Exception 打破了FS[0]=0 标致着外部异常的模式。
--------------------
错误检测顺序(Fault-checking sequence)
MMU 检测访问错对节(Section)和页(Page)有些不同,见图3-9
Virtual address
Checking
Alignment?
Check address alignment
Misaligned?
Alignmrnt fault
Get 1st level descriptor
External Abort
Descriptor fault
Section or Page?
Translation
External
abort
Section
Translation
fault
Y
N
N
N
N
Y
Y
Y
Secti
on
Page
Section
Page
http://embedded.homeunix.org 30/06/2003
Page 23 of 23
Section
Check Domain
Access Type
Section
Domain
fault
Section
Permission
fault
Client access permissions
Violation?
Physical address
No access
Client
Y
N
Manager
http://embedded.homeunix.org 30/06/2003
Page 24 of 24
Page
Get 2nd descriptor
External
abort
Invalid
Descriptor?
Check domain
Access
type
Check access permissions
Violation?
Physical address
Translation
External
abort
Page
Translation
fault
Page
Domain
fault
Sub-page
Permission
fault
Y
Y
No access
Y
N
N
N
client
Manager
图3-9 错位检查顺序
http://embedded.homeunix.org 30/06/2003
Page 25 of 25
Terminal exception 终端错
这标志着发生一个不可挽回的错误。这在(如果至少)是具体实现决定的情况下发
生。
Vector exception 向量错
当处理器是32 位配置(PROG32 被激活),在26 位模式(CPSR[4]==0),数据访
问(不是取指令)通常的向量表(地址0x00-0x1F)导致一个数据异常,这叫向量
错。如果向量错发生在MMU 被禁止时,由具体实现决定如何实现。详细信息见A8-
11 页。
Alignment fault 对齐错
如果对齐错被允许,则当访问一个不在字对齐地址的数据字(虚拟地址位
bits[1:0]!=0b00)或访问一个不在半字对齐地址的数据半字(虚拟地址位
bits[0]!=0)时产生对齐错。取指令和字节访问不产生对齐错。
---注-----
如果产生对齐错,访问将被终止,而不去进行权限检查。如果对齐错发生在MMU 被
禁止时,由具体实现决定如何实现。
----------
Translation fault 转换错
有两类转换错:
节 当第一级描述符被标志为无效时产生。这时候描述符的bits[1:0]==0b00。
页 当第二级描述符被标志为无效时产生。这时候描述符的bits[1:0]==0b00。
Domain fault 域错
有两类域错:
·  节
·  页
在这两种情况下,第一级描述符中有4 位域字段用来选择16 个域中的一个。域由
域访问控制寄存器中的2 个位控制,这2 个位用来检查访问权限。见表3-4。
如果是节,域访问的检查在第一级描述符返回时进行。
如果是页,域访问的检查在第二级描述符返回时进行。
如果特定的访问在域访问控制寄存器中被标识为不可访问,则回产生一个节域错
或页域错。
http://embedded.homeunix.org 30/06/2003
Page 26 of 26
Permission fault 权限错
有节权限错和子页权限错。
权限错与域错的检查同时进行。如果那2 位的域字段返回的是客户(client)(01),
权限检查如下进行:
节 如果第一级描述符定义了一个节访问,那么描述符的AP 位定义了访问是否
允许,见表3-3。如果访问不允许,那将产生节权限错。
子页 如果第一级描述符定义了一个页映射的访问,那么第二级描述符可以定义一
个微页,小页或大页。如果第二级描述符定义了一个微页,那它只有一个
AP 位,这个位适用于整个页。否则第二级描述符有4 个AP 位(AP3、AP2、
AP1 和AP0),每一个对应1/4 页。
小页:AP3 选择顶上的1KB,AP0 选择底下的1KB。大页:AP3 选择顶上的
16KB,AP0 选择底下的16KB。被选择的AP 位与节完全一样地解释,(见表
3-3),只是产生的是子页错。
3.6.2 外部异常
除了MMU 错,ARM 结构还定义了一个外部异常管脚,可以用来标识访问外部存储器
错误。然而不是所有的访问都能用这种方式终止,所以这个脚必须被仔细使用。以
下的访问可以被外部终止并安全地重启动:
·  读
·  无缓冲的写
·  取第一级描述符
·  取第二级描述符
·  在没有高速缓存和没有缓冲的存储器区域的信号(Semaphore)
行取能够在行传送的任何一个字上安全地终止。如果异常发生在处理器请求的数据
上(而不是在cache line 上取的其它数据),访问被终止。任何不是立刻访问的
数据传送(在cache line 上取的其它数据),只在访问它们时产生异常。
由具体实现确定FAR 寄存器是指向cache line 的起始地址还是包含产生遗产的地
址。
缓冲的写不能被外部终止。所以系统必须配置成不向能够标识外部异常的存储器区
域进行缓冲的写,或者用不同的机制去标志异常(例如中断)。
产生异常后,那个存储器空间的值是不确定的。
http://embedded.homeunix.org 30/06/2003
Page 27 of 27
3.7 CP15 寄存器
MMU 由系统控制寄存器的2、3、4、5、6、8、10 号寄存器和1 号寄存器的一些位
控制。
3.7.1 寄存器1 的MMU 控制位
寄存器1 的如下这些位用来控制MMU:
M(bit[0]) 使能MMU
0 = 禁止MMU
1 = 允许MMU
在没有MMU 和保护单元的系统上,这个位应该读出为0,并忽略写。
A(bit[1]) 使能对齐错检查
0 = 禁止
1 = 允许
S(bit[8]) 这是系统保护位,见3-4 节。
R(bit[9]) 这是ROM 保护位,见3-4 节。
3.7.2 寄存器2:转换表基地址
读CP15 寄存器2 时,在bits[31:14]返回当前活动的第一级转换表的物理地址,
bits[13:0]不确定。读CP15 寄存器2 时,CRm 和操作数2 被忽略,并应该是0。
写CP15 寄存器2 时,在bits[31:14]更新当前活动的第一级转换表的物理地址,
bits[13:0]应该写0 或先前读回的值。写CP15 寄存器2 时,CRm 和操作数2 被忽
略,并应该是0。
3.7.3 寄存器3:域访问控制
读CP15 寄存器3 时,返回域访问控制寄存器的值。CRm 和操作数2 被忽略,并应
该是0。
写CP15 寄存器3 时,更新域访问控制寄存器的值。CRm 和操作数2 被忽略,并应
该是0。
31 14 13 0
转换表基地址 UNP/SBZP
31 30 29 2 1 0
D15 …… D0
http://embedded.homeunix.org 30/06/2003
Page 28 of 28
域访问控制寄存器包含16 个2 位的字段,它定义了对应域的访问权限。见3-5
节。
3.7.4 寄存器4:保留
读写CP15 寄存器4 不可预料结果。
3.7.5 寄存器5:错误状态 FSR
读CP15 寄存器5 时,返回FSR 寄存器的值。FSR 包含最近一次数据错的信息。只
有低9 位有效,高23 位不确定。FSR 指出异常发生时的域和试图访问的类型。
bit[8] 返回0
bit[7:4] 指出错位发生时访问的域
bit[3:0] 试图访问的类型,这些位的编码见表3-5
FSR 在数据错时更新。由具体实现确定取指令异常是否更新FSR。见3.6.1 节的
“错误地址寄存器(FAR)和错误状态寄存器(FSR)”。CRm 和操作数2 被忽略,并应
该是0。
写FSR 将把FSR 设定成写的值。这对于程序调试器非常有用,可以用来恢复FSR 的
值。高24 位应该写0 或上次读到的值。CRm 和操作数2 被忽略,并应该是0。
3.7.6 寄存器6:错误地址 FAR
读CP15 寄存器6 返回FAR 的值。FAR 保存着错误产生时访问的虚拟地址。在数据
错时更新FAR。由具体实现确定取指令异常是否更新FSR。见3.6.1 节的“错误地
址寄存器(FAR)和错误状态寄存器(FSR)”。CRm 和操作数2 被忽略,并应该是0。
写FSR 将把FAR 设定成写的值。这对于程序调试器非常有用,可以用来恢复FAR 的
值。高24 位应该写0 或上次读到的值。CRm 和操作数2 被忽略,并应该是0。
---注------
31 9 8 7 4 3 0
UNP/SBZP 0 Domain Status
31 0
错误地址
http://embedded.homeunix.org 30/06/2003
Page 29 of 29
如果使用了第六章描述的快速上下文切换扩展(FCSE),那么:
·  当存储器错更新FAR 时,写入FAR 的是修改的虚拟地址。
·  当用MRC 指令读或用MCR 指令写FAR 时,它的值被当作数据对待,所以没有
由FCSE 产生的地址修改。
------------
3.7.7 寄存器8:TLB 功能
当CP15 的寄存器8 用来控制TLB 时是只读寄存器。表3-6 显示了定义的TLB 功能
和在MCR 指令中用的CRm 和第二个朝操作数<opcode2>的值。使用没有在表中的
CRm 和opcode2 的组合将导致不可预料的结果。
如果下面的任何操作被用在单一TLB 的实现中,则在单一TLB 中实现相同的功能:
·  无效的指令TLB (Invalidate instruction TLB)
·  无效的指令单一入口 (Invalidate instruction single entry)
·  无效的整个数据TLB (Invalidate entire data TLB)
·  无效的数据单一入口 (Invalidate data single entry)
否则,如果执行一个与特定实现不相关的功能,会导致不确定的结果。
试图用MRC 指令读CP15 寄存器8 的结果不确定。
当只有很少量的存储器被重新映射时,无效的单一入口操作能被用来在一些实现中
改善性能。对每个被重新映射的存储器区域(节、小页或大页),无效的单一入口
需要在存储器区域的虚拟地址上执行。性能的改善来源于不用重新装载与没有被重
新映射的存储器区域相关的TLB 入口。
---注------
无效的单一入口操作的性能改善并不被保证。具体实现可以是单一请求入口无效,
直到使整个TLB 无效。
-----------
---小心------
当存储器被重新映射时必须使与旧的映射相关的TLB 入口无效。如果不这样,可能
会进入两个TLB 入口覆盖虚拟地址范围的状态。在最好的情况下访问这样的覆盖虚
拟地址范围会有不可预料的结果;在某些实现中甚至会物理损坏MMU。
强烈建议在重新映射存储器时要加倍小心使TLB 适当地失效。
------------
http://embedded.homeunix.org 30/06/2003
Page 30 of 30
---注------
如果使用了第六章描述的快速上下文切换扩展(FCSE),那么表3-6 中的一些功
能传递给CP15 的虚拟地址被当作数据。这意味着对它们来说没有由FCSE 产生
的地址修改。
------------
3.7.8 寄存器10:TLB 锁定
转换表遍历的执行需要一定的时间,特别当访问慢速的主存储器时。在实时中断处
理程序中,当TLB 不包含中断处理程序的转换和/或要访问的数据时,中断延迟回
大量加长。
TLB 锁定是一些ARM 存储器系统的特性,它允许把特定的转换表遍历的结果装载到
TLB 中。这种方式不会被后来的转换表遍历的结果覆盖。由CP15 寄存器10 设定。
设 W=LOG2(TLB 入口数),如果需要的话取整(round-up),则CP15 寄存器10 的格
式为:
如果具体的实现有分开的指令和数据TLB,那么有2 个不同的寄存器,由访问寄存
器10 的MCR 或MRC 指令中的opcode2 字段选择:
opcode2 == 0 选择数据TLB 锁定寄存器
opcode2 == 1 选择指令TLB 锁定寄存器
功能 Opcode2 CRm Data 指令
无效整个唯一的TLB 或
指令和数据TLB
0b000 0b0111 SBZ MCR p15,0,Rd,c8,c7,0
无效唯一的单一入口
0b001
0b0111
Virtual
address
MCR p15,0,Rd,c8,c7,1
无效整个指令TLB 0b000
0b0101
SBZ
MCR p15,0,Rd,c8,c5,0
无效指令单一入口
0b001
0b0101
Virtual
address
MCR p15,0,Rd,c8,c5,1
无效整个数据TLB
0b000
0b0110
SBZ
MCR p15,0,Rd,c8,c6,0
无效数据单一入口 0b001 0b0110 Virtual
address
MCR p15,0,Rd,c8,c6,1
表3-6 TLB 功能
31 32-W 31-W 32-2W 31-2W 1 0
base victim UNP/SBZP P
http://embedded.homeunix.org 30/06/2003
Page 31 of 31
如果具体的实现只有唯一的TLB,那么只有1 个寄存器,opcode2 字段应该为0。
访问寄存器10 的MCR 或MRC 指令中的CRm 总应该为0。
写寄存器10 有如下结果:
victim 字段表示下次TLB 失败(miss)时,转换表遍历的结果替代哪个TLB 入口。
Base 字段包含TLB 替换的策略,只使用从(base)到(TLB 入口-1)的TLB 入口,
victim 应该在这个区间。
转换表遍历的结果在写到TLB 入口时,若P==1 则它被保护起来,不能被寄存器8
的使整个TLB 失效操作影响;若P==0 则会被那些操作给失效掉。
---注------
如果TLB 的入口不是2 的N 次方,那么写到大于或等于TLB 入口数的TLB 入口的
base 或victim 的值将不确定。
-----------
读寄存器10 将返回它的值。
TLB 锁定过程
通常锁定N 个TLB 入口的过程如下:
1. 禁止中断等,来保证当这个过程执行时不会产生异常
2. 如果一个指令TLB 或唯一TLB 被锁定,用base==N、index==N 和P==0 写到适当
版本的寄存器10。如果可能,把另指令预取很难理解的分枝预测功能关掉。
3. 使要被锁定的整个TLB 失效。
4. 如果是指令TLB 锁定,要确保剩下的锁定过程所要预取的指令相关的TLB 入口
都被装载。(要注意锁定是从哪里开始的,通常可能一个TLB 入口包含所有这
些。这时TLB 被失效后的第一条指令能完成这个功能)
如果是数据TLB 锁定,要确保剩下的锁定过程所要访问数据的相关的TLB 入口
都被装载。这包含被代码用到的嵌入文字(inline literals)(通常最好避免在
锁定过程中使用嵌入文字,并把所有的数据放在由一个TLB 入口所包含的区
域,然后从那里加载一个数据)
如果一个唯一TLB 被锁定,执行以上所有的过程。
5. i 从0 到N-1 循环
http://embedded.homeunix.org 30/06/2003
Page 32 of 32
a. 用base==i、index==i 和P==1 写到寄存器10。
b. 强迫被锁定到TLB 入口i 处的转换表遍历结果的存储器区域发生转换
表遍历:
* 如果是数据TLB 或唯一TLB 被锁定,从那个区域加载一个数据
* 如果是指令TLB 被锁定,用B5-15 页所描述的指令预取高速缓冲寄
存器7 来在那个区域产生指令预取。
6. 用base==N、index==N 和P==0 写到寄存器10。
---注------
如果你使用FCSE,要注意第5b 步,因为:
·  如果是数据TLB 锁定或唯一TLB 锁定,加载数据指令的地址是会被FCSE 修改
的。
·  如果是指令TLB 锁定,用在寄存器7 的地址被当作数据,所以不会被FCSE 修
改。
为了减少混淆,建议锁定过程应该是:
·  从禁止FCSE 开始(设置PID 为0)
·  把适当的PID 值OR 到使用的虚拟地址的高7 位来自己产生修改的虚拟地址。
-----------
TLB 解锁过程
用上面的过程解锁被锁定的TLB 部分:
1. 用寄存器8 的操作使每个被锁定的单一入口失效
2. 用base==0、index==0 和P==0 写到寄存器10。
---注------
第一步是为了保证P==1 的入口在TLB 中不在被剩下。如故它们被剩在TLB 中,后
续的TLB 锁定过程中使整个TLB 失效(第三步)将不会有预期的结果。