深入了解Linux内核MMU管理机制

MMU:存储器管理单元
*虚拟内存空间到物理存储空间的映射。在ARM中采用了页式虚拟内存管理。它把虚拟地址空间分为一个个大小固定的块,每一块称为一页,把物理内存的地址空间也分成同样大小的页。页的大小可以分为粗粒度和细粒度两种,MMU就要实现从虚拟地址到物理地址的转换。
*存储器访问权限的控制。
*设置虚拟存储空间的缓冲特性。
MMU可以将某些地址变换条目锁定在TLB中(TLB(translation lookaside buffer)实现从虚拟地址到物理地址的页表查询的地址变换条目存放),从而使得进行与该地址变换条目相关的地址变换速度保持很快。在MMU中寄存器C10用于控制TBL内容的锁存。
MMU可以将整个存储空间分为最多16个域(domain)。每个域对应一定的内存区域,该区域具有相同的访问控制属性。MMU中寄存器C3用于控制与域相关的属性配置。
表1 与MMU操作相关的寄存器



存储器 作用
——————————————————————————————————————
寄存器C1中某些位 用于配置MMU中一些操作
寄存器C2 保存内存中页表的基地址
寄存器C3 设置域(domain)的访问控制属性
寄存器C4 保留(resvered)
寄存器C5 内存访问失效状态指示
寄存器C6 内存访问失效时的地址
寄存器C7
寄存器C8 控制与清除TLB内容相关的操作
寄存器C9
寄存器C10 控制与锁定TLB内容相关的操作

++++++
CP15的寄存器C1[0]设置为0时,禁止MMU,设置成1的时候enable MMU,如:
MRC P15, 0 ,R0 ,C1 ,0 ,0 ;从协处理器CP15的C1传送到ARM处理器R0
ORR R0, #01 ;给COP15的寄存器C1[0]写1
MCR P15 ,0 ,R0 ,C1 ,0 ,0;

1,结构:

MMU存储器系统的结构允许对存储器系统的精细控制。大部分的控制细节由存在存储器中的转换表提供。这些表的入口定义了从1KB 到1MB 的各种存储器区域的属性。这些属性包括:

虚拟地址到物理地址映射

ARM 处理器产生的地址叫虚拟地址,MMU 允许把这个虚拟地址映射到一个不

同的物理地址去。

这个物理地址表示了被访问的主存储器的位置。如果使用了快速上下文切换扩展(Fast Context Switch Extension),则在本文中的虚拟地址的意思应该是修改过的虚拟地址(Modified virtualaddress)

这种方式允许我们用很多方式管理物理存储器的位置,例如:

用具有潜在冲突的地址映射为不同的进程分配存储器;

允许具有不连续地址的应用把它映射到连续的地址空间。

存储器访问权限(permissions)

控制对存储器区域的不可访问权限、只读权限、读写权限。当访问不可

访问权限的存储器时,会有一个存储器异常通知ARM 处理器。

允许权限受程序运行在用户状态还是特权状态影响,还和是否使用了域有关。

高速缓存和缓冲位(Cachability and bufferability bits [C and B])

这些在高速缓存和缓冲一节讲

系统控制协处理器的寄存器允许对系统的高级控制,如转换表的位置。他们也用来为ARM 提供内存异常的状态信息。

查找整个转换表的过程叫转换表遍历。它由硬件制动进行,并需要大量的执行时间(至少一个存储器访问,通常是两个)。为了减少存储器访问的平均消耗,转换表遍历结果被高速缓存在一个或多个叫作Translation Lookaside Buffers(TLBs)的结构中。通常在ARM 的实现中每个内存接口有一个TLB。

· 有一个存储器接口的系统通常有一个唯一的TLB

· 指令和数据的内存接口分开的系统通常有分开的指令TLB 和数据TLB

如果系统有高速缓存, 高速缓存的数量也通常是由同样的方法确定的。所以在高速缓存的系统中,每个高速缓存一个TLB。当存储器中的转换表被改变或选中了不同的转换表(通过写CP15 的寄存器2),先前高速缓存的转换表遍历结果将不再有效。MMU 结构提供了刷新TLB 的操作。MMU 结构也允许特定的转换表遍历结果被锁定在一个TLB 中,这就保证了对相关的存储器区域的访问绝不会导致转换表遍历,这也对那些把指令和数据锁定在高速缓存中的实时代码有相同的好处。

【文章福利】小编推荐自己的Linux内核技术交流群:【977878001】整理一些个人觉得比较好得学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100进群领取,额外赠送一份价值699的内核资料包(含视频教程、电子书、实战项目及代码)

内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料

 学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

2,存储器访问的顺序

当ARM 要访问存储器时,MMU 先查找TLB 中的虚拟地址表,如果ARM 的结构支持分开的地址TLB 和指令TLB,那么它用:

· 取指令使用指令TLB

· 其它的所有访问类别用数据TLB

如果TLB 中没有虚拟地址的入口,则转换表遍历硬件从存在主存储器中的转换表中获取转换和访问权限,一旦取到,这些信息将被放在TLB 中,它会放在一个没有使用的入口处或覆盖一个已有的入口。关于转换表的信息和转换表遍历的实现参见转换过程一节。

一旦为存储器访问的TLB 的入口被拿到,这些信息将被用于:

1. C(高速缓存)和B(缓冲)位被用来控制高速缓存和写缓冲,并决定是否高速缓存。(如果系统中没有高速缓存和写缓冲,则对应的位将被忽略)

2. 访问权限和域位用来控制访问是否被允许。如果不允许,则MMU 将向ARM 处理器发送一个存储器异常;否则访问将被允许进行。

访问权限、域和异常几节有详细描述。

3. 对没有高速缓存的系统(包括在没有高速缓存系统中的所有存储器访问),物理地址将被用作主存储器访问的地址。对有高速缓存的系统,在高速缓存没有选中的情况下,物理地址将被用行取(line fetch)的地址。如果选中了高速缓存,则物理地址将被忽略。图3-1 说明了这种高速缓存系统

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 的指令具有相同的物理地址和虚拟地址。

3转换过程

MMU 支持基于节或页的存储器访问:

(Section) 构成1MB 的存储器块

支持3 中不同的页尺寸:

微页(Tiny page) 构成1KB 的存储器块

小页(Small page) 构成4KB 的存储器块

大页(Large page) 构成64KB 的存储器块

节和大页是支持允许只用一个TLB 入口去映射大的存储器区间。小页和大页有附加的访问控制:小页分成1KB 的子页,和大页分成16KB 的子页。微页没有子页,对微页的访问控制是对整个页。

存在主存储器内的转换表有两个级别:

第一级表 存储节转换表和指向第二级表的指针。

第二级表 存储大页和小页的转换表。一种类型的第二级表存储微页转换表。

MMU 把CPU 产生的虚拟地址转换成物理地址去访问外部存储器,同时继承并检查访问权限。地址转换有四条路径。路径的选取由这个地址是被标记成节映射访问还是页映射访问确定。页映射访问可以是大、小和微页的访问。

然而,转换过程总是由下面所描述的那样由第一级表的获取开始。节映射的访问只需要读取第一级表,页映射的访问还需要读取第二级表。

3.1 转换表基址

当片上(on-chip)的TLB 中不包含被要求的虚拟地址的入口时,转换过程被启

动。转换表基址寄存器(CP15 的寄存器2)保存着第一级转换表基址的物理地址。

只有bits[31:14]有效,bits[13:0]应该是零(SBZ)。 所以第一级表必须在16KB

的边界。

3.2 取第一级表

转换表基址寄存器的bits[31:14]与虚拟地址的bits[31:20]和两个0 位连接形成32 为物理地址,如图3-2。这个地址选择了一个四字节的转换表入口,它是第一级描述符或是指向第二级页表的指针。

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.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 位

图3-3 表示了节转换的完整过程。

注:---------------

访问权限必须在物理地址产生之前去检查,检查访问权限的顺序见访问权限一节。

---------------------

3.5 粗糙页表描述符

如果第一级描述符是粗糙页表描述符,那么各个字段有如下的意义:

Bits[1:0] 描述符类型标识(0b01 表示粗糙页表描述符)

Bits[4:2] 由具体实现定义

Bits[8:5] 这个描述符控制的页的16 种域之一

Bits[9] 现在没有使用,应该为零

Bits[31:10] 页表基地址是一个指向第二极粗糙页表的指针,

它给出第二级表访问的基地址。而第二级粗糙页表必须在1KB 边

界对齐。如果从第一级读取到的是二级粗糙页表描述符,那么会

象图3-4 所示执行第二级描述符读取。

3.6 精细页表描述符

如果第一级描述符是精细页表描述符,那么各个字段有如下的意义:

Bits[1:0] 描述符类型标识(0b11 表示精细页表描述符)

Bits[4:2] 由具体实现定义

Bits[8:5] 这个描述符控制的页的16 种域之一

Bits[11:9] 现在没有使用,应该为零

Bits[31:10] 页表基地址是一个指向第二级精细页表的指针,它给出第二级表

访问的基地址。而第二级精细页表必须在4KB 边界对齐。如果从第

一级读取到的是二级精细页表描述符,那么会象图3-5 所示执行第

二级描述符读取。

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 的虚拟地址。

见转换微页参考。在精细第二级表中只需要一个微页描述符的实例。微页描

述符不能在粗糙第二级表中出现,如果出现了,结果不可预测。

大页描述符字段

大页描述符的字段有如下意义:

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] 用来形成物理地址的对应位。

3.8 转换大页参考

图3-6 显示了在粗糙第二级表中转换一个64KB 的大页的完整顺序。在精细第二级表中的转换顺序页相似,只是第二级描述符的地址如精细页表描述符一节所决定。

注:-----------------------------

页索引的高4 位和第二级表的低阶4 位重叠,在粗糙页表中大页的每个页表入口必须被重复16 次。在精细页表中大页的每个页表入口必须被重复64 次。

3.9 转换小页参考

图3-7 显示了在粗糙第二级表中转换一个4KB 的小页的完整顺序。在精细第二级表中的转换顺序页相似,只是第二级描述符的地址如精细页表描述符一节所决定。

注:-----------------------------

当小页出现在精细第二级表中时,页索引的高2 位和第二级表的低阶2 位重叠,在精细页表中小页的每个页表入口必须被重复4 次。

-----------------------------------

3.10 转换微页索引

图3-8 显示了在精细第二级表中转换1KB 微页的完整过程。

注:---------------------------

微页不能出现在粗糙第二级表中。

---------------------------------

4域

域是节、大页和小页的集合。ARM 结构支持16 个域。对域的访问由域访问控制寄存器的两个位字段控制。因为每个字段对访问对应的域的使能非常迅速,所以整个存储器区间能很快地交换进出虚拟存储器。这里支持2 种域访问方式:

客户域的用户(执行程序,访问数据),被形成这个域的节或页来监督访问权限。

管理者控制域的行为(域中的当前节和页,对域的访问),不被形成这个域的节或页来监督访问权限。

一个程序可以是一些域的客户,也是另外一些域的管理者,同时没有对其它域的访问权限。这允许对程序访问不同存储器资源的非常灵活的存储器保护。表3-4 说明了域访问控制寄存器的位编码方式。

5 CP15 寄存器

MMU 由系统控制寄存器的2、3、4、5、6、8、10 号寄存器和1 号寄存器的一些位控制。

5.1 对协处理器寄存器的操作

ARM寄存器到协处理器的数据传诵指令和反向传送指令分别为MCR和MRC

u MCR

MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。若协处理器不能成功执行该操作,将产生未定义指令异常中断。指令格式如下:

MCR{cond} coproc,opcode1,Rd,CRn,CRm{,opcode2}

其中 coproc 指令操作的协处理器的名称,标准名为pn,n为0~15,这里为p15

opcode1 协处理器的特定操作码

Rd 做源的ARM处理器寄存器

CRn 存放第一个操作数的协处理器寄存器

CRm 存放第二个操作数的协处理器寄存器

opcode2 可选的协处理器操作码

指令举例如下:

MCR p6,2,R7,c1,c2

MCR p7,0,R1,c3,c2,1

u MRC

MRC指令将协处理器的寄存器中的数据传送到ARM理器的寄存器中。若协处理器不能成功执行该操作,将产生未定义指令异常中断。指令格式如下:

MRC{cond} coproc,opcode1,Rd,CRn,CRm{,opcode2}

其中 coproc 指令操作的协处理器的名称,标准名为pn,n为0~15,这里为p15

opcode1 协处理器的特定操作码

Rd 做目标的ARM处理器寄存器

CRn 存放第一个操作数的协处理器寄存器

CRm 存放第二个操作数的协处理器寄存器

opcode2 可选的协处理器操作码

指令举例如下:

MRC p6,2,R7,c1,c2

MCR p7,0,R1,c3,c2,1

5.2 寄存器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 节。

5.3 寄存器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。

5.4 寄存器3:域访问控制


读CP15 寄存器3 时,返回域访问控制寄存器的值。CRm 和操作数2 被忽略,并应该是0。写CP15 寄存器3 时,更新域访问控制寄存器的值。CRm 和操作数2 被忽略,并应该是0。

域访问控制寄存器包含16 个2 位的字段,它定义了对应域的访问权限。见3-5

节。

5.5 寄存器4:保留

读写CP15 寄存器4 不可预料结果。

5.6 寄存器5:错误状态 FSR

读CP15 寄存器5 时,返回FSR 寄存器的值。FSR 包含最近一次数据错的信息。只有低9 位有效,高23 位不确定。FSR 指出异常发生时的域和试图访问的类型。

bit[8] 返回0

bit[7:4] 指出错位发生时访问的域

bit[3:0] 试图访问的类型,这些位的编码见表3-5

FSR 在数据错时更新。由具体实现确定取指令异常是否更新FSR。见3.6.2 节的

“错误地址寄存器(FAR)和错误状态寄存器(FSR)”。CRm 和操作数2 被忽略,并应

该是0。写FSR 将把FSR 设定成写的值。这对于程序调试器非常有用,可以用来恢复FSR 的值。高24 位应该写0 或上次读到的值。CRm 和操作数2 被忽略,并应该是0。

5.7 寄存器6:错误地址 FAR


读CP15 寄存器6 返回FAR 的值。FAR 保存着错误产生时访问的虚拟地址。在数据错时更新FAR。由具体实现确定取指令异常是否更新FSR。见3.6.2 节的“错误地

址寄存器(FAR)和错误状态寄存器(FSR)”。CRm 和操作数2 被忽略,并应该是0。写FSR 将把FAR 设定成写的值。这对于程序调试器非常有用,可以用来恢复FAR 的

值。高24 位应该写0 或上次读到的值。CRm 和操作数2 被忽略,并应该是0。

---注------

如果使用了第六章描述的快速上下文切换扩展(FCSE),那么:

· 当存储器错更新FAR 时,写入FAR 的是修改的虚拟地址。

· 当用MRC 指令读或用MCR 指令写FAR 时,它的值被当作数据对待,所以没有由FCSE 产生的地址修改。

------------

5.8 寄存器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 适当地失效。------------

---注------

如果使用了第六章描述的快速上下文切换扩展(FCSE),那么表3-6 中的一些功

能传递给CP15 的虚拟地址被当作数据。这意味着对它们来说没有由FCSE 产生

的地址修改。

------------

5.9 寄存器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 锁定寄存器

如果具体的实现只有唯一的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 循环

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 失效(第三步)将不会有预期的结果。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值