1、PowerPC 体系结构之存储管理取 BOOKE 精要,兼顾 E500 规范。 E500 规范是 BOOKE 的 32-bit 实现,更具体些,大部与 BOOKE 兼容。BOOKE 对存储管理的规范较抽象,没有非常多的细节(比如 TLB 每项的结构必须如此等等),涉及细节则多以 E500 为例子。1. 概述E500 实现有两级 TLB,即:L1 TLB 和 L2 TLB。L1 TLB 可以理解为 L2 TLB 的部分缓存。访问 L1 TLB 的效率要比 L2 的效率高,相应的实现的花费也就高。L1 TLB 由硬件维护,不可编程精确控制。故下面的讨论皆针对 L2 TLB,为方便简称其为 TLB。
2、E500 没有对虚拟地址空间进行划分,即没有固定使用某段虚拟地址固定映射到某段物理地址 (MIPS,重要用于支持设备资源的固定映射以及方便内核对内存的管理)。而是引入了一个更灵活的设计:将 TLB 分为 TLB0 和 TLB1。TLB0 即用于页映射的 TLB,可动态被替换,页大小固定为 4 KB。E500v1 实现为 2 路组相联,256 项;E500v2 实现为 4 路组相联,512 项。TLB1 则设计用于映射大页(比如 16MB, 256MB .),支持可变页大小,E500v1 可支持 9 个页大小(最大 256MB),E500v2 则支持 11 个页大小(最大 4GB)。使用时可将某
3、项设为永驻 TLB1 (通过置 Invalidation Protection 位,简写为 IPROT 位),不会被动态替换,实现为全相联,共 16 项,可将其理解为用于映射 16 个段的可编程固定映射机制。2. TLB 结构与工作方式 2.1 TLB 结构E500 之 TLB0 与 TLB1 每项的数据格式相似,皆由页区分域、翻译域、访问控制域和存储属性位组成。2.1.1 页区分域 页区分域 (Page Identificaion Fields) 即为查找 TLB 时的比对域。涉及 EPN (Effective Page Number),TS (Translation Address Spa
4、ce, 1 bit),TID (Translation ID),V (Valid, 1 bit),SIZE (Page Size, 4 bits)。其中 EPN 即为虚页号。PowerPC 习惯上将地址转换时需要比对的位 (IS/DS | PID | EPN) 的组合,叫做一个地址空间。其中 IS/DS 为 Instruction/Data Address Space,各 1 bit,位于 MSR,0 为地址空间 0,1 则为地址空间 1,转换时其于 TLB_Entry 之 TS 相比较,相等才会输出物理页号;PID 为 Process ID,本意是用于区分不同进程的虚拟地址空间,存放于 PI
5、DR 中,属上下文。转换时,比较 PIDR 与 TLB_Entry 之 TID 位,相等才会输出物理页号。BOOKE 规定需实现一个 PID 寄存器;E500 作了扩展,其实现有 3 个 PIDR (PID0 2),则 E500 在转换时会形成 3 个虚拟地址。将 TLB_Entry 之 TID 置 0,则硬件会忽略 PID0 2 与 TID 的比较,PowerPC Linux 设计时,就将 TID 置 0。2.1.2 翻译域 翻译域 (Translation Field) 即为经 TLB 翻译后输出的数据,其实即为物理页号,PowerPC 叫 RPN (Real Page Number)2.
6、1.3 访问控制域访问控制域 (Access Control Fields) 又称为 PERMIS,共 6 bits,分别指定该页可否被用户态读、写、可执行 (UR, UW, UX);管理态(核心态)的读、写、可执行 (SR, SW, SX)2.1.4 存储属性位存储属性位 (Storage Attribute Bits) ,其重要的 5 bits 为: W (Write through), I (caching Inhibited), M (Memory coherence), G (Guarded), E (Endianness),一般简写为 WIMGE;E500 还实现有可用于系统软件的
7、 X01,可用于用户软件的 U0 U3此外E500 之 TLB1 尚有一位无效保护位 IPROT,置位则该项不会被置无效。2.1.5 完整的 E500 TLB Entry 结构2.2 TLB 工作方式3. TLB 控制接口3.1 相关寄存器3.1.1 MAS0 4, MAS6, MAS7MMU Assist Registers, 用于与 TLB Entry 之间的数据互换MAS0,32 bits,用于选择互换对象是 TLB0 还是 TLB1 (TLBSEL),以及是TLB1 的哪个 Entry 或者 TLB0 的哪一路 (ESEL):MAS1,32 bits,用于存放 V, IPROT, TI
8、D, TS, TSIZE:MAS2,32 bits,用于存放 EPN | X0 | X1 | W | I | M | G | E:MAS3,32 bits,用于存放 RPN | U0 - U3 | UX | SX | UW | SW | UR |SR:MAS4,32 bits,用于加上 TLB Miss 的解决,存放默认的 TLBSEL, TIDSEL, TSIZE, X0, X1, WIMGE,当 I/D TLB Miss 出现时,硬件自动将 MAS4 中的值写到 MAS0 2 的相应域中:MAS6,32 bits,用于 tlbsx 查找 TLB 时指定 PID0 (SPID0) 和 AS
9、(SAS)MAS7,32 bits,E500v2 实现,用于支持 36 bits 物理地址,即其 MAS760:63 用作 RPN 的高四位:3.1.2 MMUCSR0MMU Control and Status Register 0,用于控制 TLB 的批量无效。有 2 个有效位:位 61 和位 62,其余保存为 0。MMUCSR061,置 1 则将 TLB0 的所有项置无效MMUCSR062,置 1 则将 TLB1 的所有项置无效3.1.3 MMU 配置状态寄存器MMUCFG, TLB0CFG, TLB1CFG,皆为只读。MMUCFG 存放当前实现的 PID Register 的数目,PI
10、D Register 中 PID 的有效位(e500 为 8),实现的 TLB 个数(e500 为 2,TLB0 和 TLB1)TLB0CFG 指示 TLB0 的特性,如:几路组相联 (e500v1 为 2,e500v2 为4),最小页大小和最大页大小(TLB0 皆为 4KB),是否支持 IPROT 位(TLB0 不支持),是否支持可变页大小(TLB0 不支持,则 AVAL = 0),有多少 EntryTLB1CFG 指示 TLB1 的特性,数据域与 TLB0CFG 同。3.2 相关指令tlbsx RA, RB - TLB Search Indexedtlbre - TLB Read Entr
11、ytlbwe - TLB Write Entrytlbivax RA, RB - TLB Invalidate Virtual Address Indexedtlbsync - TLB Sync3.3 实例3.3.1 查找 TLB输入: MAS6,指定 PID0 (SPID0) 和 AS (SAS)执行 tlbsx RA, RB,在 TLB 中查找有效地址 RA + RB若命中,则将命中项之数据输出到:MAS0 MAS3,MAS1V = 1,MAS0TLBSEL 指定命中的是 TLB0 还是 TLB1,MAS0ESEL 指定命中项是TLB1 的哪个 Entry 或者 TLB0 的哪一路。若没找
12、到,则 MAS1V = 0,MAS2RPN 为 0 3.3.3 写 TLB 输入:MAS0 3 (MAS7 for E500v2)执行 tlbwe其据 MAS0TLBSEL 和 MAS0ESEL 选择将被写的 TLB 入口(若为 TLB0,还需借助 EPN45:51 用于索引组,ESEL 用于路选),然后将 MAS0 3 (MAS7 for E500v2) 中的数据写入 TLB。3.3.4 读 TLB输入:MAS0TLBSEL, MAS0ESEL, MAS2EPN执行 tlbre输出:MAS1 MAS3,若为 E500v2 且 HID0EN_MAS7_UPDATE 则将 RPN 的高 4 位置
13、入 MAS73.3.2 置无效某项输入:无需借助 MAS 寄存器执行 tlbivax RA + RBEA = RA + RB,为虚拟地址EA32:51 用于匹配 TLB 项 (组选 EPN 匹配),其不进行 PID 和 AS 的比较,则若同一组内有相同的 EPN,皆会将其置无效。EA60 用于选择操作的对象是 TLB0 还是 TLB1,类似 MAS0TLBSELEA61 为 1 则置无效 TLB0 或 TLB1 的所有项若 HID1ABE = 1 则该无效操作亦广播给其它 Core,置无效相应的项。注意: TLB1 之 IPROT 位为 1 可使匹配的项免于被置无效4. TLB 相关异常Ins
14、truction TLB Error 异常,由 Instruction TLB Miss 引起,用于从页表填充 TLBData TLB Error 异常,由 Data TLB Miss 引起Instruction Storage 异常,由不允许的访问引起,如用户态读一个 UR 为 0(用户态不可读)的页Data Storage 异常,亦由不允许的访问引起5. Reset 后 TLB 的状态E500 上电后, TLB0 和 TLB1 的所有项都会被硬件自动置无效,后将 TLB1 的第一项自动初始化为:因素为: E500 在上电后,固定到虚拟地址 0xFFFF FFFC 处取指,但其既无实模式 (x86) 又无固定映射 (MIPS),所以就规定 TLB 中至少有一项,映射到初始化代码处(位于 Flash 的 bootloader),故E500 规定,上电后 TLB1 的第一项始终映射 0xFFFF F000 到物理地址 0xFFFF F000 处,大小为 4KB。