<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jack&#039;s Lab &#187; 存储管理</title>
	<atom:link href="http://www.jackslab.org/?feed=rss2&#038;tag=%E5%AD%98%E5%82%A8%E7%AE%A1%E7%90%86" rel="self" type="application/rss+xml" />
	<link>http://www.jackslab.org</link>
	<description>好奇之心，改变之力</description>
	<lastBuildDate>Sun, 02 Jul 2017 02:48:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>PowerPC 体系结构之存储管理</title>
		<link>http://www.jackslab.org/?p=239</link>
		<comments>http://www.jackslab.org/?p=239#comments</comments>
		<pubDate>Tue, 22 Feb 2011 03:32:44 +0000</pubDate>
		<dc:creator>Jack Tan</dc:creator>
				<category><![CDATA[PowerPC]]></category>
		<category><![CDATA[体系结构]]></category>
		<category><![CDATA[基础设施]]></category>
		<category><![CDATA[ISA]]></category>
		<category><![CDATA[TLB]]></category>
		<category><![CDATA[存储管理]]></category>

		<guid isPermaLink="false">http://www.jackslab.org/?p=239</guid>
		<description><![CDATA[取 BOOKE 精要，兼顾 E500 规范。 E500 规范是 BOOKE 的 32-bit 实现，更详细些，大部与 BOOKE 兼容。 BOOKE 对存储管理的规范较抽象，没有非常多的细节（比如 TLB 每项的结构必须如此等等），涉及细节则多以 ...]]></description>
			<content:encoded><![CDATA[<p>取 BOOKE 精要，兼顾 E500 规范。 E500 规范是 BOOKE 的 32-bit 实现，更详细些，大部与 BOOKE 兼容。</p>
<p>BOOKE 对存储管理的规范较抽象，没有非常多的细节（比如 TLB 每项的结构必须如此等等），涉及细节则多以 E500 为例子。<br />
<strong><br />
<span style="color: #ff9900;"> 1. 概述</span></strong></p>
<p>E500 实现有两级 TLB，即：L1 TLB 和 L2 TLB。L1 TLB 可以理解为 L2 TLB 的部分缓存。访问 L1 TLB 的效率要比 L2 的效率高，相应的实现的花费也就高。L1 TLB 由硬件维护，不可编程精确控制。故下面的讨论皆针对 L2 TLB，为方便简称其为 TLB。</p>
<p>E500 没有对虚拟地址空间进行划分，即没有固定使用某段虚拟地址固定映射到某段物理地址 (MIPS，主要用于支持设备资源的固定映射以及方便内核对内存的管理)。而是引入了一个更灵活的设计：将 TLB 分为 TLB0 和 TLB1。</p>
<p>TLB0 即用于页映射的 TLB，可动态被替换，页大小固定为 4 KB。E500v1 实现为 2 路组相联，256 项；E500v2 实现为 4 路组相联，512 项。</p>
<p>TLB1 则设计用于映射大页（比如 16MB, 256MB &#8230;），支持可变页大小，E500v1 可支持 9 个页大小（最大 256MB），E500v2 则支持 11 个页大小（最大 4GB）。使用时可将某项设为永驻 TLB1 （通过置 Invalidation Protection 位，简写为 IPROT 位），不会被动态替换，实现为全相联，共 16 项，可将其理解为用于映射 16 个段的可编程固定映射机制。</p>
<p><span id="more-239"></span></p>
<p><span style="color: #3d85c6;"><strong>2. TLB 结构与工作方式</strong></span></p>
<p><strong>2.1 TLB 结构</strong></p>
<p>E500 之 TLB0 与 TLB1 每项的数据格式相似，皆由页区分域、翻译域、访问控制域和存储属性位组成。</p>
<p><strong>2.1.1  页区分域 </strong></p>
<p>页区分域 (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 即为虚页号。</p>
<p>PowerPC 习惯上将地址转换时需要比对的位 (IS/DS | PID | EPN) 的组合，叫做一个地址空间。<br />
其中 IS/DS 为 Instruction/Data Address Space，各 1 bit，位于 MSR，0 为地址空间 0，1 则为地址空间 1，转换时其于 TLB_Entry 之 TS 相比较，相等才会输出物理页号；</p>
<p>PID 为 Process ID，本意是用于区分不同进程的虚拟地址空间，存放于 PIDR 中，属上下文。转换时，比较 PIDR 与 TLB_Entry 之 TID 位，相等才会输出物理页号。BOOKE 规定需实现一个 PID 寄存器；E500 作了扩展，其实现有 3 个 PIDR (PID0 ~ 2)，则 E500 在转换时会形成 3 个虚拟地址。</p>
<p>将 TLB_Entry 之 TID 置 0，则硬件会忽略 PID0 ~ 2 与 TID 的比较，PowerPC Linux 设计时，就将 TID 置 0。</p>
<p><strong>2.1.2  翻译域 </strong></p>
<p>翻译域 (Translation Field) 即为经 TLB 翻译后输出的数据，其实即为物理页号，PowerPC 叫 RPN (Real Page Number)<br />
<strong> </strong></p>
<p><strong> </strong> <strong>2.1.3  访问控制域</strong></p>
<p>访问控制域 (Access Control Fields) 又称为 PERMIS，共 6 bits，分别指定该页可否被用户态读、写、可执行 (UR, UW, UX)；管理态（核心态）的读、写、可执行 (SR, SW, SX)</p>
<p><strong>2.1.4  存储属性位</strong></p>
<p>存储属性位 (Storage Attribute Bits) ，其重要的 5 bits 为： W (Write through), I (caching Inhibited), M (Memory coherence), G (Guarded), E (Endianness)，一般简写为 WIMGE；</p>
<p>E500 还实现有可用于系统软件的 X0~1，可用于用户软件的 U0 ~ U3</p>
<p>此外E500 之 TLB1 还有一位无效保护位 IPROT，置位则该项不会被置无效。</p>
<p><strong>2.1.5 完整的 E500 TLB Entry 结构</strong><br />
<a href="http://www.jackslab.org/wp-content/uploads/2011/02/tlb.entry_.structure.png"><img class="aligncenter size-full wp-image-250" title="tlb.entry.structure" src="http://www.jackslab.org/wp-content/uploads/2011/02/tlb.entry_.structure.png" alt="" width="571" height="390" /></a></p>
<p><strong>2.2 TLB 工作方式<br />
</strong></p>
<p><strong><a href="http://www.jackslab.org/wp-content/uploads/2011/02/tlb.org_.e500v1.png"><img class="aligncenter size-full wp-image-252" title="tlb.org.e500v1" src="http://www.jackslab.org/wp-content/uploads/2011/02/tlb.org_.e500v1.png" alt="" width="522" height="450" /></a></strong></p>
<p><strong><a href="http://www.jackslab.org/wp-content/uploads/2011/02/tlb.addr_.translate.png"><img class="aligncenter size-full wp-image-249" title="tlb.addr.translate" src="http://www.jackslab.org/wp-content/uploads/2011/02/tlb.addr_.translate.png" alt="" width="484" height="268" /></a></strong></p>
<p><strong><a href="http://www.jackslab.org/wp-content/uploads/2011/02/tlb.match.process.png"><img class="aligncenter size-full wp-image-251" title="tlb.match.process" src="http://www.jackslab.org/wp-content/uploads/2011/02/tlb.match.process.png" alt="" width="518" height="252" /></a></strong></p>
<p><strong><a href="http://www.jackslab.org/wp-content/uploads/2011/02/access.control.process.png"><img class="aligncenter size-full wp-image-240" title="access.control.process" src="http://www.jackslab.org/wp-content/uploads/2011/02/access.control.process.png" alt="" width="495" height="224" /></a></strong></p>
<p><span style="color: #a64d79;"><strong>3. TLB 控制接口</strong></span></p>
<p><strong> 3.1  相关寄存器</strong></p>
<p><strong>3.1.1</strong> <strong>MAS0 ~ 4, MAS6, MAS7</strong></p>
<p>MMU Assist Registers, 用于与 TLB Entry 之间的数据交换</p>
<p>MAS0，32 bits，用于选择交换对象是 TLB0  还是 TLB1 (TLBSEL)，以及是TLB1 的哪个 Entry  或者 TLB0 的哪一路 (ESEL)：</p>
<p><a href="http://www.jackslab.org/wp-content/uploads/2011/02/mas0.png"><img class="aligncenter size-full wp-image-242" title="mas0" src="http://www.jackslab.org/wp-content/uploads/2011/02/mas0.png" alt="" width="539" height="99" /></a></p>
<p>MAS1，32 bits，用于存放 V, IPROT, TID, TS, TSIZE：</p>
<p><a href="http://www.jackslab.org/wp-content/uploads/2011/02/mas1.png"><img class="aligncenter size-full wp-image-243" title="mas1" src="http://www.jackslab.org/wp-content/uploads/2011/02/mas1.png" alt="" width="529" height="99" /></a></p>
<p>MAS2，32 bits，用于存放 EPN | X0 | X1 | W | I | M | G | E：</p>
<p><a href="http://www.jackslab.org/wp-content/uploads/2011/02/mas2.png"><img class="aligncenter size-full wp-image-244" title="mas2" src="http://www.jackslab.org/wp-content/uploads/2011/02/mas2.png" alt="" width="538" height="101" /></a></p>
<p>MAS3，32 bits，用于存放 RPN | U0 &#8211; U3 | UX | SX | UW | SW | UR |SR：</p>
<p><a href="http://www.jackslab.org/wp-content/uploads/2011/02/mas3.png"><img class="aligncenter size-full wp-image-245" title="mas3" src="http://www.jackslab.org/wp-content/uploads/2011/02/mas3.png" alt="" width="532" height="102" /></a></p>
<p>MAS4，32 bits，用于加上 TLB Miss 的处理，存放默认的 TLBSEL,  TIDSEL,  TSIZE,  X0, X1, WIMGE，当 I/D TLB Miss 出现时，硬件自动将 MAS4 中的值写到 MAS0 ~ 2 的相应域中：</p>
<p><a href="http://www.jackslab.org/wp-content/uploads/2011/02/mas4.png"><img class="aligncenter size-full wp-image-246" title="mas4" src="http://www.jackslab.org/wp-content/uploads/2011/02/mas4.png" alt="" width="536" height="100" /></a></p>
<p>MAS6，32 bits，用于 tlbsx 查找 TLB  时指定 PID0 (SPID0) 和 AS (SAS)</p>
<p><a href="http://www.jackslab.org/wp-content/uploads/2011/02/mas6.png"><img class="aligncenter size-full wp-image-247" title="mas6" src="http://www.jackslab.org/wp-content/uploads/2011/02/mas6.png" alt="" width="540" height="96" /></a></p>
<p>MAS7，32 bits，E500v2 实现，用于支持 36 bits 物理地址，即其 MAS7[60:63] 用作 RPN 的高四位：</p>
<p><a href="http://www.jackslab.org/wp-content/uploads/2011/02/mas7.png"><img class="aligncenter size-full wp-image-248" title="mas7" src="http://www.jackslab.org/wp-content/uploads/2011/02/mas7.png" alt="" width="539" height="99" /></a></p>
<p><strong>3.1.2</strong> <strong>MMUCSR0</strong></p>
<p>MMU Control and Status Register 0，用于控制 TLB 的批量无效。有 2 个有效位：位 61 和位 62，其余保留为 0。</p>
<p>MMUCSR0[61]，置 1 则将 TLB0 的所有项置无效</p>
<p>MMUCSR0[62]，置 1 则将 TLB1 的所有项置无效</p>
<p><strong>3.1.3 MMU 配置状态寄存器</strong></p>
<p>MMUCFG, TLB0CFG, TLB1CFG，皆为只读。</p>
<p>MMUCFG 存放当前实现的 PID Register 的数目，PID Register 中 PID 的有效位（e500 为 8），实现的 TLB 个数（e500 为 2，TLB0 和 TLB1）</p>
<p>TLB0CFG 指示 TLB0 的特性，如：几路组相联 （e500v1 为 2，e500v2 为4），最小页大小和最大页大小（TLB0 皆为 4KB），是否支持 IPROT 位（TLB0 不支持），是否支持可变页大小（TLB0 不支持，则 AVAL = 0），有多少 Entry</p>
<p>TLB1CFG 指示 TLB1 的特性，数据域与  TLB0CFG 同。</p>
<p><strong> 3.2 相关指令</strong></p>
<p>tlbsx RA, RB &#8212; TLB Search Indexed<br />
tlbre &#8212; TLB Read Entry<br />
tlbwe &#8212; TLB Write Entry<br />
tlbivax RA, RB &#8212; TLB Invalidate Virtual Address Indexed<br />
tlbsync &#8212; TLB Sync</p>
<p><strong>3.3 实例</strong></p>
<p><strong>3.3.1 查找 TLB</strong></p>
<p>输入： MAS6，指定 PID0 (SPID0) 和 AS (SAS)<br />
执行 tlbsx RA, RB，在 TLB 中查找有效地址 RA + RB</p>
<p>若命中，则将命中项之数据输出到：MAS0 ~ MAS3，MAS1[V] = 1，MAS0[TLBSEL] 指定命中的是 TLB0 还是 TLB1，MAS0[ESEL] 指定命中项是TLB1 的哪个 Entry  或者 TLB0 的哪一路。</p>
<p>若没找到，则 MAS1[V] = 0，MAS2[RPN] 为 0</p>
<p><strong>3.3.3 写 TLB </strong></p>
<p>输入：MAS0 ~ 3 (MAS7 for E500v2)<br />
执行  tlbwe</p>
<p>其据 MAS0[TLBSEL]  和  MAS0[ESEL]  选择将被写的 TLB 入口（若为 TLB0，还需借助 EPN[45:51] 用于索引组，ESEL 用于路选），然后将 MAS0 ~ 3 (MAS7 for E500v2) 中的数据写入 TLB。</p>
<p><strong>3.3.4 读 TLB</strong><br />
<strong><br />
</strong>输入：MAS0[TLBSEL], MAS0[ESEL], MAS2[EPN]<br />
执行  tlbre<br />
输出：MAS1 ~ MAS3，若为 E500v2 且 HID0[EN_MAS7_UPDATE] 则将 RPN 的高 4 位置入  MAS7<br />
<strong> </strong></p>
<p><strong>3.3.2  置无效某项</strong></p>
<p>输入：无需借助 MAS 寄存器<br />
执行 tlbivax RA + RB</p>
<p>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 的所有项</p>
<p>若 HID1[ABE] = 1 则该无效操作亦广播给其它 Core，置无效相应的项。</p>
<p>注意： TLB1 之 IPROT 位为 1 可使匹配的项免于被置无效</p>
<p><span style="color: #6aa84f;"><strong>4. TLB 相关异常</strong></span></p>
<p>Instruction TLB Error  异常，由 Instruction  TLB Miss  引起，用于从页表填充 TLB<br />
Data TLB Error 异常，由 Data TLB Miss 引起<br />
Instruction Storage 异常，由不允许的访问引起，如用户态读一个 UR 为 0（用户态不可读）的页<br />
Data Storage 异常，亦由不允许的访问引起</p>
<p><strong><span style="color: #674ea7;">5. Reset 后 TLB 的状态</span></strong></p>
<p>E500 上电后， TLB0 和 TLB1 的所有项都会被硬件自动置无效，后将 TLB1 的第一项自动初始化为：</p>
<p><a href="http://www.jackslab.org/wp-content/uploads/2011/02/tlb1.entry0_.png"><img class="aligncenter size-full wp-image-253" title="tlb1.entry0" src="http://www.jackslab.org/wp-content/uploads/2011/02/tlb1.entry0_.png" alt="" width="409" height="299" /></a></p>
<p>原因为： E500 在上电后，固定到虚拟地址 0xFFFF FFFC 处取指，但其既无实模式 (x86) 又无固定映射 (MIPS)，所以就要求 TLB 中至少有一项，映射到初始化代码处（位于 Flash 的 bootloader），故E500 规定，上电后 TLB1 的第一项始终映射 0xFFFF F000 到物理地址 0xFFFF F000 处，大小为 4KB。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jackslab.org/?feed=rss2&#038;p=239</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
