<?xml version="1.0" encoding="gbk"?> <rss version="2.0"><channel> <title>定阅帖子更新</title> <link>http://www.broadkey.com.cn/XML.ASP</link><description>TEAM Board - 意得法电子</description> <copyright>TEAM 2.0.5 Release</copyright><generator>TEAM Board by TEAM5.Cn Studio</generator> <ttl>30</ttl><item><link>http://www.broadkey.com.cn/Thread.asp?tid=54 </link><title>PowerPC&amp;nbsp;体系结构之存储管理</title><author>alan</author><pubDate>2009-11-25 23:44:06</pubDate><description><![CDATA[取 BOOKE 精要，兼顾 E500 规范。 E500 规范是 BOOKE 的 32-bit 实现，更详细些，大部与 BOOKE 兼容。<br />
<br />
BOOKE 对存储管理的规范较抽象，没有非常多的细节（比如 TLB 每项的结构必须如此等等），涉及细节则多以 E500 为例子。<br />
<strong><br />
<font color="#ff9900">1. 概述</font></strong><br />
<br />
E500 实现有两级 TLB，即：L1 TLB 和 L2 TLB。L1 TLB 可以理解为 L2 TLB 的部分缓存。访问 L1 TLB 的效率要比 L2 的效率高，相应的实现的花费也就高。L1 TLB 由硬件维护，不可编程精确控制。故下面的讨论皆针对 L2 TLB，为方便简称其为 TLB。<br />
<br />
E500 没有对虚拟地址空间进行划分，即没有固定使用某段虚拟地址固定映射到某段物理地址 (MIPS，主要用于支持设备资源的固定映射以及方便内核对内存的管理)。而是引入了一个更灵活的设计：将 TLB 分为 TLB0 和 TLB1。<br />
<br />
TLB0 即用于页映射的 TLB，可动态被替换，页大小固定为 4 KB。E500v1 实现为 2 路组相联，256 项；E500v2 实现为 4 路组相联，512 项。<br />
<br />
TLB1 则设计用于映射大页（比如 16MB, 256MB ...），支持可变页大小，E500v1 可支持 9 个页大小（最大 256MB），E500v2 则支持 11 个页大小（最大 4GB）。使用时可将某项设为永驻 TLB1 （通过置 Invalidation Protection 位，简写为 IPROT 位），不会被动态替换，实现为全相联，共 16 项，可将其理解为用于映射 16 个段的可编程固定映射机制。<br />
<br />
<font color="#3d85c6"><br />
<strong>2. TLB 结构与工作方式</strong></font> <br />
<br />
<strong>2.1 TLB 结构</strong><br />
<br />
E500 之 TLB0 与 TLB1 每项的数据格式相似，皆由页区分域、翻译域、访问控制域和存储属性位组成。<br />
<br />
<strong>2.1.1 页区分域 </strong><br />
<br />
页区分域 (Page Identificaion Fields) 即为查找 TLB 时的比对域。包括 EPN (Effective Page Number)，TS (Translation Address Space, 1 bit)，TID (Translation ID)，V (Valid, 1 bit)，SIZE (Page Size, 4 bits)。其中 EPN 即为虚页号。<br />
<br />
PowerPC 习惯上将地址转换时需要比对的位 (IS/DS | PID | EPN) 的组合，叫做一个地址空间。<br />
其中 IS/DS 为 Instruction/Data Address Space，各 1 bit，位于 MSR，0 为地址空间 0，1 则为地址空间 1，转换时其于 TLB_Entry 之 TS 相比较，相等才会输出物理页号；<br />
<br />
PID 为 Process ID，本意是用于区分不同进程的虚拟地址空间，存放于 PIDR 中，属上下文。转换时，比较 PIDR 与 TLB_Entry 之 TID 位，相等才会输出物理页号。BOOKE 规定需实现一个 PID 寄存器；E500 作了扩展，其实现有 3 个 PIDR (PID0 ~ 2)，则 E500 在转换时会形成 3 个虚拟地址。<br />
<br />
将 TLB_Entry 之 TID 置 0，则硬件会忽略 PID0 ~ 2 与 TID 的比较，PowerPC Linux 设计时，就将 TID 置 0。<br />
<br />
<br />
<strong>2.1.2 翻译域 </strong><br />
<br />
翻译域 (Translation Field) 即为经 TLB 翻译后输出的数据，其实即为物理页号，PowerPC 叫 RPN (Real Page Number)<br />
<strong><br />
<br />
</strong><strong>2.1.3 访问控制域</strong><br />
<br />
访问控制域 (Access Control Fields) 又称为 PERMIS，共 6 bits，分别指定该页可否被用户态读、写、可执行 (UR, UW, UX)；管理态（核心态）的读、写、可执行 (SR, SW, SX)<br />
<br />
<br />
<strong>2.1.4&nbsp; 存储属性位</strong><br />
<br />
存储属性位 (Storage Attribute Bits) ，其重要的 5 bits 为： W (Write through), I (caching Inhibited), M (Memory coherence), G (Guarded), E (Endianness)，一般简写为 WIMGE；<br />
<br />
E500 还实现有可用于系统软件的 X0~1，可用于用户软件的 U0 ~ U3<br />
<br />
此外E500 之 TLB1 还有一位无效保护位 IPROT，置位则该项不会被置无效。<br />
<br />
<br />
<strong>2.1.5 完整的 E500 TLB Entry 结构</strong><br />
<br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/cbc492f33adc7ce50b46e074.jpg" small="0" alt="" /></span><br />
<br />
<br />
<strong>2.2 TLB 工作方式</strong><br />
<br />
<br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/3fd2a87a6ac25bc32f73b314.jpg" small="0" alt="" /><br />
<br />
<br />
</span><br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/6df51994d7bb6c30d31b7016.jpg" small="0" alt="" /><br />
<br />
<br />
</span><br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/0a1402829b25dd916d811912.jpg" small="0" alt="" /><br />
<br />
</span><br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/279b91b3865a5389d8335a13.jpg" small="0" alt="" /></span><br />
<br />
<br />
<br />
<font color="#a64d79"><strong>3. TLB 控制接口</strong></font><br />
<br />
<strong>3.1&nbsp; 相关寄存器</strong><br />
<br />
<strong>3.1.1</strong> <strong>MAS0 ~ 4, MAS6, MAS7</strong><br />
<br />
MMU Assist Registers, 用于与 TLB Entry 之间的数据交换<br />
<br />
MAS0，32 bits，用于选择交换对象是 TLB0&nbsp; 还是 TLB1 (TLBSEL)，以及是TLB1 的哪个 Entry&nbsp; 或者 TLB0 的哪一路 (ESEL)：<br />
<br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/6dcdabfa63506aa79f5146f2.jpg" small="0" alt="" /></span><br />
<br />
<br />
<br />
MAS1，32 bits，用于存放 V, IPROT, TID, TS, TSIZE：<br />
<br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/6df51994d75c6c30d31b70f3.jpg" small="0" alt="" /></span><br />
<br />
<br />
<br />
MAS2，32 bits，用于存放 EPN | X0 | X1 | W | I | M | G | E：<br />
<br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/e71513b18ab2587a082302fe.jpg" small="0" alt="" /></span><br />
<br />
<br />
<br />
MAS3，32 bits，用于存放 RPN | U0 - U3 | UX | SX | UW | SW | UR |SR：<br />
<br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/3ecb3f8b307236519f2fb4fa.jpg" small="0" alt="" /></span><br />
<br />
<br />
<br />
MAS4，32 bits，用于加上 TLB Miss 的处理，存放默认的 TLBSEL,&nbsp; TIDSEL,&nbsp; TSIZE,&nbsp; X0, X1, WIMGE，当 I/D TLB Miss 出现时，硬件自动将 MAS4 中的值写到 MAS0 ~ 2 的相应域中：<br />
<br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/14a443c42b7890e538db49ff.jpg" small="0" alt="" /></span><br />
<br />
<br />
<br />
MAS6，32 bits，用于 tlbsx 查找 TLB&nbsp; 时指定 PID0 (SPID0) 和 AS (SAS)<br />
<br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/91feaa9bf49d4a9bc8eaf4c4.jpg" small="0" alt="" /></span><br />
<br />
<br />
<br />
MAS7，32 bits，E500v2 实现，用于支持 36 bits 物理地址，即其 MAS7[60:63] 用作 RPN 的高四位：<br />
<br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/5c177911bc4767e8a6ef3fc5.jpg" small="0" alt="" /></span><br />
<br />
<br />
<br />
<br />
<strong>3.1.2</strong> <strong>MMUCSR0</strong><br />
<br />
MMU Control and Status Register 0，用于控制 TLB 的批量无效。有 2 个有效位：位 61 和位 62，其余保留为 0。<br />
<br />
MMUCSR0[61]，置 1 则将 TLB0 的所有项置无效<br />
<br />
MMUCSR0[62]，置 1 则将 TLB1 的所有项置无效<br />
<br />
<br />
<strong>3.1.3 MMU 配置状态寄存器</strong><br />
<br />
MMUCFG, TLB0CFG, TLB1CFG，皆为只读。<br />
<br />
MMUCFG 存放当前实现的 PID Register 的数目，PID Register 中 PID 的有效位（e500 为 8），实现的 TLB 个数（e500 为 2，TLB0 和 TLB1）<br />
<br />
TLB0CFG 指示 TLB0 的特性，如：几路组相联 （e500v1 为 2，e500v2 为4），最小页大小和最大页大小（TLB0 皆为 4KB），是否支持 IPROT 位（TLB0 不支持），是否支持可变页大小（TLB0 不支持，则 AVAL = 0），有多少 Entry<br />
<br />
TLB1CFG 指示 TLB1 的特性，数据域与&nbsp; TLB0CFG 同。<br />
<br />
<br />
<strong>3.2 相关指令</strong><br />
<br />
tlbsx RA, RB --- TLB Search Indexed<br />
tlbre --- TLB Read Entry<br />
tlbwe --- TLB Write Entry<br />
tlbivax RA, RB --- TLB Invalidate Virtual Address Indexed<br />
tlbsync --- TLB Sync<br />
<br />
<br />
<strong>3.3 实例</strong><br />
<br />
<strong>3.3.1 查找 TLB</strong><br />
<br />
输入： MAS6，指定 PID0 (SPID0) 和 AS (SAS)<br />
执行 tlbsx RA, RB，在 TLB 中查找有效地址 RA + RB<br />
<br />
若命中，则将命中项之数据输出到：MAS0 ~ MAS3，MAS1[V] = 1，MAS0[TLBSEL] 指定命中的是 TLB0 还是 TLB1，MAS0[ESEL] 指定命中项是TLB1 的哪个 Entry&nbsp; 或者 TLB0 的哪一路。<br />
<br />
若没找到，则 MAS1[V] = 0，MAS2[RPN] 为 0 <br />
<br />
<br />
<strong>3.3.3 写 TLB </strong><br />
<br />
输入：MAS0 ~ 3 (MAS7 for E500v2)<br />
执行&nbsp; tlbwe<br />
<br />
其据 MAS0[TLBSEL]&nbsp; 和&nbsp; MAS0[ESEL]&nbsp; 选择将被写的 TLB 入口（若为 TLB0，还需借助 EPN[45:51] 用于索引组，ESEL 用于路选），然后将 MAS0 ~ 3 (MAS7 for E500v2) 中的数据写入 TLB。<br />
<br />
<br />
<strong>3.3.4 读 TLB</strong><br />
<strong><br />
</strong>输入：MAS0[TLBSEL], MAS0[ESEL], MAS2[EPN]<br />
执行&nbsp; tlbre<br />
输出：MAS1 ~ MAS3，若为 E500v2 且 HID0[EN_MAS7_UPDATE] 则将 RPN 的高 4 位置入&nbsp; MAS7<br />
<strong><br />
<br />
3.3.2 置无效某项</strong><br />
<br />
输入：无需借助 MAS 寄存器<br />
执行 tlbivax RA + RB<br />
<br />
EA = RA + RB，为虚拟地址<br />
EA[32:51] 用于匹配 TLB 项 （组选 ＋ EPN 匹配），其不进行 PID 和 AS 的比较，则若同一组内有相同的 EPN，皆会将其置无效。<br />
EA[60] 用于选择操作的对象是 TLB0 还是 TLB1，类似 MAS0[TLBSEL]<br />
EA[61] 为 1 则置无效 TLB0 或 TLB1 的所有项<br />
<br />
若 HID1[ABE] = 1 则该无效操作亦广播给其它 Core，置无效相应的项。<br />
<br />
注意： TLB1 之 IPROT 位为 1 可使匹配的项免于被置无效<br />
<br />
<br />
<font color="#6aa84f"><strong>4. TLB 相关异常</strong></font><br />
<br />
Instruction TLB Error&nbsp; 异常，由 Instruction&nbsp; TLB Miss&nbsp; 引起，用于从页表填充 TLB<br />
Data TLB Error 异常，由 Data TLB Miss 引起<br />
Instruction Storage 异常，由不允许的访问引起，如用户态读一个 UR 为 0（用户态不可读）的页<br />
Data Storage 异常，亦由不允许的访问引起<br />
<br />
<font color="#674ea7"><br />
</font><strong><font color="#674ea7">5. Reset 后 TLB 的状态</font><br />
</strong><strong><br />
</strong>E500 上电后， TLB0 和 TLB1 的所有项都会被硬件自动置无效，后将 TLB1 的第一项自动初始化为：<br />
<br />
<span><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/14814f13e821842c5baf53ae.jpg" small="0" alt="" /></span><br />
<br />
<br />
原因为： E500 在上电后，固定到虚拟地址 0xFFFF FFFC 处取指，但其既无实模式 (x86) 又无固定映射 (MIPS)，所以就要求 TLB 中至少有一项，映射到初始化代码处（位于 Flash 的 bootloader），故E500 规定，上电后 TLB1 的第一项始终映射 0xFFFF F000 到物理地址 0xFFFF F000 处，大小为 4KB。<br />
<strong><br />
</strong><br />]]></description></item></channel></rss>