1 PowerPC 的 MMU 和 TLB 机制
1.1 基本原理
1.1.1 基本概念
在涉及虚拟存储系统时,需要搞明白以下这些地址的概念及相互之间的关系。
逻辑地址:代码中使用,如数据载入和绝对指令跳转等使用的地址 ,如 LR寄存器中的地址等,本文中有效( EA )地址也就是逻辑地址;
虚拟地址:虚拟地址在页转换中使用,为中间地址,逻辑地址转成虚拟地址后再转成物理地址,虚拟地址的位数取决于处理器类型及型号,如 PPC440中的虚拟地址为 41位;
TLB: Translation Lookaside Buffers,转换快表,简称快表,保存最近使用的页转换地址映射表,一般由硬件实现。 TLB是内存里存放的页表的缓存,那么它里边存放的数据实际上和内存页表区的数据是一致的,在内存的页表区里,每一条记录虚拟页面和物理页框对应关系的记录称之为一个页表条目( Entry),同样地在 TLB里边也缓存了部分甚至全部的页表条目( Entry)。
物理地址:地址总线上使用的实际地址,传给 SDRAM使用的地址。
1.1.2 内存管理
内存管理主要是管理计算机主存,简单的来说,就是为程序提供内存分配和释放的功能。内存管理分为三个层次:硬件、操作系统和应用程序 。对大多数人而言,都只会关注应用程序的内存管理。
硬件内存管理:硬件的内存管理主要是需要关注 CPU层,提供了什么样的硬件机制来实现内存管理,如是否提供分页机制、分段机制以及 Cache/MMU 等。
操作系统内存管理:操作系统应该提供一个虚拟内存机制,为应用程序提供内存分配回收等,实现交换等。
应用程序内存管理:每个应用可能对当前可用内存未知,因此需要像系统提出内存分配申请,一般如在 C语言中使用 malloc等申请堆空间。
重定位( Relocation):代码的加载域和链接域不一致的情况下,加载程序需要对代码进行重新定位,以便能够正确解析符号。
1.1.3 MMU 简介
MMU的基本功能包括:
1)将有效地址 (effective address)转换成实际物理地址( real address),这也是 MMU的最基本功能,地址转换分为 2种类型,分别为指令地址转换和数据地址转换;
2)权限保护功能,如提供读写保护等,在 PPC中还针对超级模式和普通用户模式做了不同的权限区分;
3)访问更大的虚拟空间,有效地址空间可以比实际物理内存大,这样可以实现虚拟交换技术,便于运行大型的程序。基本原理就是不将程序的所有数据 /指令载入内存,只载入马上需要使用的,而暂时不用的可以交换到二级存储器。
现代 MMU通常都将虚拟地址空间划分成页,页大小为 2 的 n 次方,一般为几 k 字节。 虚拟地址中的低 n位为页内地址,在地址转换中保持不变,而高位称作虚拟页号( Virtual Page Number), MMU最基本的功能就是将虚拟页号转换成物理页号。 MMU首先在 TLB缓存中查找待访问的指令或者数据地址,如果 TLB没有命中,将进入页表异常处理。
1.1.4 地址转换模式
有 3种地址转换模式:
1)段页式地址转换 ;
2)块地址转换( BAT),通常用于将逻辑地址映射到一块很大的连续的物理地址 上,这样可以减少页表数量,提高转换效率。块地址只适用于部分 PPC 处理器,如 MPC8247/8260 等, PPC440 没有块地址转换功能;
3)实地址转换,也即平板映射模式,禁止地址转换( MSR[IR] =0, MSR[DR]=0),逻辑地址与物理地址相等 ,直接将逻辑地址送往地址总线,如果物理内存较小,高位的逻辑地址可能被忽略。 大多数嵌入式处理器不支持 MMU,或者硬件支持 MMU,但操作系统不支持虚拟内存管理时,都只能采用平板映射。
1.2 PPC440 MMU 概述
PPC440× 6支持 4G 的有效地址空间( EA ),及 64G(36bit) 的 RA 实地址空间 ,其 MMU实现如下功能:
EA地址到 RA地址的转换;
可用软件来控制页表替换策略;
页表级的指令和数据访问权限控制;
页表级的存储属性控制。
MMU首先将有效地址 EA扩展为虚拟地址 VA,然后利用页表转换功能将其转换成 RA物理地址,以此进行指令和数据的读取。
PPC440 只支持页式内存管理,共支持 9 种页大小,分别为 1K/4K/16k 。。。 1G 。 而通常大多数处理器的页表大小为 4K,也有支持二级页表 4k和 1m的。当访问的地址无法通过 TLB进行映射时,将触发 DATA或者 Instruction TLB Exception。
1.3 TLB
PPC440 的 TLB 为 64 路全相连的硬件结构 ,其控制地址转换、存取保护及存储属性等。 TLB的维护由软件通过专门指令控制,相关指令如下:
Tlbwe,写 TLB表,通过连续三条指令可以从 GPR和 MMUCR[STID]中获取一条 TLB表项写入到硬件中;
Tlbre,三条连续指令可读取一条表项;
Tlb[.]:可以搜索特定的 TLB表项。
TLB表项由以下四个部分组成:
页识别域;
地址转换域;
访问权限控制域;
存储属性控制域。
一个表项又三个字组成:
WORD1:
0-21位, EPN,有效页编号,大小可变,取决于当前页所采用的页大小
22位: V,有效标识,只有当当前页表为有效时,才进行页表匹配查询。一上电时所用页表无效
23位, TS,转换的地址空间,是用户模式或者超级权限模式的数据、指令
24-27, SIZE,页大小,共支持 16种大小,此处为当前页大小所代表的编号
32-39, TID,转换 ID,为 0时为全局共享页表,否则为进程的 ID号,此时为私有页表,可加强安全控制。一般实现时,都为 0,全局共享
WORD2:
0-21位, RPN,实际的物理页编号
28-31位, ERPN,扩展到实际页编号,和页编号及页内偏移等一起构成 36位实际物理地址,以支持 64GB空间。在嵌入式平台上,一般未用,为 0
WORD3:
包括是否缓存, cache是 copyback还是 write through,是否要求内存一致性,大小端,用户模式和 supervisor模式的读写执行权限等
1.4 页表识别
1.4.1 概述
一个页表是否识别成功取决于以下因素:
Valid (V);
Effective Page Number (EPN);
Translation Space Identifier (TS);
Page Size (SIZE);
Translation ID (TID)
所有项匹配成功后才能进行地址转换和存取控制处理。当无法找到匹配的 TLB时将产生 ITLB或者 DTLB MISS EXCEPTION。
1.4.2 虚拟地址的构造
页表识别的第一步就是根据 EA有效地址产生 VA虚拟地址。
虚拟地址为 41位,构成如下:
0位, TS,地址空间域
1-8位, TID域,进程标识符,由 PID寄存器提供,一般多数操作系统都未实现,即默认为 0
9-40位,即原来的 EA地址。
然后由此虚拟地址进行 TLB匹配。
1.4.3 地址空间
TS将地址空间分成了两种:
一种和中断处理及系统级的代码和数据关联
另一种是应用程序的代码和数据
用户模式的程序运行时,一般 MSR[IS,DS]为 1,只允许访问应用程序的代码及数据地址空间。当进入中断时, MSR[IS,DS]自带清 0,因此可以利用系统级的 TLB(TS=0)来访问中断处理相关的代码。
1.4.4 TLB 匹配过程
根据虚拟地址的 TS、 TID、 EPN等域进行相关 TLB表项的匹配,匹配过程如下:
V域为 1,当前 TLB项有效;
MSR[IS,DS]和 TLB表项的 TS域一致;
TID一致或者 TLB表达 TID为 0,全局共享;
由表项的 SIZE域根据公式 n = 32–log2 (page size in bytes)计算虚拟地址中 EPN的值,然后和 TLB的 EPN域进行匹配且匹配成功。
注意: PPC通常为大端模式, 0表示最高位
1.5 地址转换
TLB匹配成功后,将提取 TLB表的 RPN和 ERPN域,构成 RA物理实际地址的页编号部分,而页内偏移由 EA的低地址部分提供,相关构成如下:
RA = ERPN0:3 || RPN0:n–1 || EAn:31
由于在嵌入式平台上,内存小于 4G,故 ERPN为 0,地址转换的过程实际上就是将 EPN转换为 RPN。
1.6 MMU 异常处理
1.6.1 异常原因
TLB是一个内存管理单元用于改进虚拟地址到物理地址转换速度的缓存。 TLB具有固定数目的 slots, slots包含了 page table的入口。页表用于将虚拟地址映射到物理地址。 TLB是典型的内容寻址的内存,其中用于搜索的键值是虚拟地址,搜索结果是物理地址。如果 TLB中包括请求的虚拟地址,硬件会很快的产生一个与之匹配的物理地址,通过此物理地址可以对内存进行存取。如果 TLB中不包括请求的虚拟地址,那么就会产生页表异常,由软件进行相关处理, OS可进行软件搜索,得到对应的物理地址,也可以产生异常告警。
当 CPU执行机构收到应用程序发来的虚拟地址后,首先到 TLB中查找相应的页表数据,如果 TLB中正好存放着所需的页表,则称为 TLB命中( TLB Hit),如果当前页具备缓存属性则查看物理内存地址中的数据是不是已经在缓存里了,若没有则到内存中取相应地址所存放的数据。
地址转换失败时将产生异常,原因有:
1) TLB异常:如果试图访问没有在 MMU的 TLB中映射的内存地址,会触发这个异常。在支持虚拟内存的操作系统中,这一般会触发内存的页面倒换,系统的 Exception Handler会将所需要的内存页从虚拟内存中调入物理内存,并更新相应的 TLB表项。
2)地址对齐异常:如果试图访问一个非对齐的地址,例如 lw/sw指令的地址非 4字节对齐,或 lh/sh的地址非 2字节对齐,就会触发这个异常。一般地,操作系统在 Exception Handler中对这个异常的处理,是分两次读取 /写入这个地址。虽然一般的操作系统内核都处理了这个异常,最后能够完成期待的操作,但是由于会引起用户态到内核态的切换,以及异常的退出,当这样非对齐操作较多时会严重影响程序的运行效率。因此,编译器在定义局部和全局变量时,都会自动考虑到对齐的情况,而程序员在设计数据结构时,则需要对对齐做特别的斟酌。但并不是所有的处理器或者操作系统支持非对其访问的。
3)访问冲突: TLB命中,地址转换成功,但是当前处理器的模式的访问权限和该页表的权限不符合,因此导致该异常。
1.6.2 PPC440 的异常类型
PPC440相应的 MMU异常中断入口如下:
IVOR2 Data Storage
用户模式下访问内核模式才能访问的内存空间,或者数据访问的字节序与定义的字节序不一致引发的异常
IVOR3 Instruction Storage
在用户模式访问内核模式下才能访问的内存空间,以及因为指令预取部件访问的字节序与定义的字节序不一致时引发此异常。
IVOR5 Alignment
IVOR13 Data TLB Miss Error
当处理器取指时,如果访问指令的地址没有在 TLB中命中时产生此异常
IVOR14 Instruction TLB Miss Error
当处理器取指时,如果访问指令的地址没有在 TLB中命中时产生此异常
1.6.3 如何进行异常处理
异常处理机制保存有对应异常的状态信息,以此实现异常处理。 PPC440相关异常处理的寄存器如下:
Save/Restore Registers (SRR0–SRR1)
Critical Save/Restore Registers (CSRR0–CSRR1)
Data Exception Address Register (DEAR)
1、 Data Exception Address Register (DEAR)
DEAR: 错误的虚拟地址。实际上,这个寄存器仅限于出现 TLB Miss、 storage及 alignment等异常的时候才能用到。发生错误的虚拟地址会放在这个寄存器里。
一般地,在设定 TLB时,通常将 0地址附近的一块,设定为无映射区域。这样,一旦编程时不慎访问了空指针 (0地址 ),或是空指针加上一定的偏移量,那么,系统就会抛出一个 TLB Miss Exception。在这种情况下,发生错误的地址会被记录在 DEAR寄存器中。一般地,这个地址是一个非常接近于 0的地址。往往地通过 DEAR寄存器中的值,和相关数据结构的分析,就可以找出对应的语句。
当数据指针或者指令被非法篡改时也可能出现待访问的地址在 TLB表中没有任何映射,此时根据 DEAR的值,查看相应的页表映射关系即可判断是否属于此类错误。
对于 alignment异常,异常地址也会被保存在 DEAR中。一般地,操作系统会自行接管这个地址,分两次读取 /写入这个地址处的数据,而不会发生 Core Dump的情况。但是,如果这个地址既属于非对齐地址,又属于 TLB Miss,那么,系统还是会抛出一个 Core Dump的。
对于 storage异常,通常是用户模式的代码访问了不该访问的内存空间,这种情况通常是异常指针造成的。根据页表中设置的访问存取权限很容易判断错误原因。
2、 Save/Restore Registers (SRR0–SRR1)
SRR0保存了产生异常时的指令地址,根据程序的 MAP表即可查到此地址所对应的文件、函数,再结合 OBJ的反汇编文件即可查出出错的代码行。