带有根据页面大小指示符而进行散列的 局部标记的翻译后援缓冲器
本发明涉及翻译后援缓冲器的领域,更具体而言,涉及用于快速设计周期的翻译后援缓冲器体系结构。
现代的微处理器系统典型地运用虚拟寻址。虚拟寻址使系统能有效地创建比实际的物理存储空间更大的虚拟存储空间。把实际的物理存储空间分解成虚拟存储空间这一过程称为分页(paging)。分页将物理存储空间的线性地址空间分解为称作页面的固定块。页面允许利用较小的物理的主存储器加上低廉地后台存储器来实施大容量的线性地址空间。这种配置称为″虚拟存储″。分页允许通过与后台存储器来回进行交换的按页面管理存储器来实施虚拟存储。分页带来了另外的优点,包括减少了主存储器碎片、对不同页面有可选择的存储器写入策略,和为不同的页面所用的可变化的存储器保护方案。典型情况下,分页机制的出现对应用程序而言是透明的。
页面的大小是灵活性和性能之间的折衷。小的页面大小允许在虚存系统上进行更精确控制,不过会因分页操作而增加了开销。因此,许多CPU都支持页面大小的混合,例如,一个特定的MIPS实施方案支持4kB、16kB、64kB、256kB、1MB、4MB和16MB页面的任意混合。
处理器继而能够有利地使用虚拟地址在虚拟地址空间中操作。然而,常常必须将这些虚拟地址翻译成物理地址——实际的存储位置。实现将虚拟地址翻译成物理地址的一种方式就是:使用在主存储器中经常访问的和存储的翻译表。翻译表是存储在主存储器中的,因为它们在大小方面通常很大。令人遗憾的是,对存储在主存储器中的翻译表的经常访问势必会减慢总体的系统性能。
为了避免需要经常访问主存储器中的翻译表以实现地址翻译,现代的微处理器系统往往利用翻译后援缓冲器(TLB)来存储或高速缓存最近生成的虚拟地址到物理地址的译本。TLB是一种特殊类型的高速缓冲存储器。正如其它类型的高速缓冲存储器的情况一样,TLB典型地是由专门设计成可被快速访问的相对少量的存储器组成的。TLB典型地包括标记阵列和数据阵列两者,正如在高速缓冲存储器中提供的那样。在标记阵列内部,每个标记行都存储一个虚拟地址。然后,使这个标记行与数据阵列中对应的数据行相关联,在所述数据阵列中存储有对应虚拟地址的物理地址译本。因此,在从主存储器中的翻译表中寻找虚拟地址的译本之前,处理器首先查询TLB以确定虚拟地址的物理地址译本目前是否存储在该TLB中。如果虚拟地址和对应的物理地址都存储了在TLB中,那么所述TLB就在其输出端口处提供对应的物理地址,并且避免了消耗时间与资源的对主存储器的访问。因此为了简化TLB的操作并且减少变址需求,在TLB内通常提供一个内容可寻址存储器(CAM)。CAM是并行的模式匹配电路。在一个匹配操作模式中,所述CAM允许并行地搜索所有它的数据以查找匹配。
令人遗憾的是,常规的TLB需要定制的电路设计技术以实现CAM。利用定制的电路设计不是有利的,因为每个TLB及相关的CAM都需要大量的设计工作以便在处理器系统设计中实现相同的目的。当然,当处理器缺少CAM电路时,来自于处理器的信号将离开芯片而向CAM传送,从而导致时延。
因此,本发明的一个目的是,提供一种由传统可合成电路块构成的CAM体系结构。
依照本发明,提供一种翻译后援缓冲器(TLB),它包括:至少一个输入端口,用于接收虚拟地址的一部分;
随机存取存储器;一组寄存器;和可合成逻辑,用于根据所接收到的部分虚拟地址确定散列值以及用于将该散列值与寄存器组内已存储的一个散列值进行比较以确定这样的可能性,即在随机存取存储器内的某一行内存储着与虚拟地址相关联的物理地址并且与来自寄存器组中的一个寄存器相关联,在所述寄存器内部存储有所述散列值。
依照本发明的一个方面,提供了一种翻译后援缓冲器,包括:随机存取存储器;与存储器中一行相关联的第一寄存器;和散列电路,用于接收与一个其译本目前被存储在该存储器中的虚拟地址不同的虚拟地址,用于确定散列值和用于在第一寄存器中存储散列值;并且该散列电路用于在存储器的所述行中存储虚拟地址及其译本。
依照本发明的又一个方面,提供了一种翻译后援缓冲器,包括:RAM;和可合成逻辑,用于根据虚拟地址来确定RAM内部的至少一个可能的地址,以固定的关系对所述RAM进行搜索以查找与虚拟地址相关联的物理地址,该至少一个可能的地址是RAM内的一个仅有的已知地址以外的地址,它以固定的关系在所述RAM中存储与虚拟地址相关联的物理地址。
依照本发明的又一个方面,提供了一种为包含RAM和可合成逻辑的翻译后援缓冲器实现虚拟地址查找功能的方法,包括以下步骤:向可合成逻辑提供虚拟地址;将所提供的虚拟地址散列以提供散列结果;
根据散列结果确定在RAM内部的存储位置,相对于该位置来存储虚拟地址标识符和与之相关的物理地址;
将虚拟地址与虚拟地址标识符进行比较以确定物理地址是否对应于所提供的虚拟地址;并且当物理地址与所提供的虚拟地址相对应时,提供物理地址以作为输出值。
现在将参照附图来描述本发明,在附图中:
图1说明了现有技术中的SRAM电路的半导体管实施方案;
图1b说明了现有技术中的CAM电路的半导体管实施方案;
图2说明了现有技术中的从虚拟地址(VA)到物理地址(PA)的翻译过程;
图3说明了结合直接映射的高速缓冲存储器所实现的现有技术从VA到PA的翻译过程;
图4a总体上说明了利用可合成逻辑元件和随机存取存储器形成的翻译后援缓冲器;
图4b更详细地说明了由可合成逻辑元件形成的翻译后援缓冲器;
图4c概述了TLB的操作所采取的步骤;
图5更详细地说明了散列电路;和
图6说明了图5中所示的散列电路的变形。
CAM电路包括结构上类似于SRAM电路的存储电路。然而,CAM电路还包括搜索电路,它提供了并行检索操作模式的增添的益处,因此能够实现利用硬件并行地搜索CAM的内容。当为特定的数据值而搜索CAM时,所述CAM在CAM内找到那个数据值的匹配时提供匹配信号。CAM与SRAM之间的主要区别就在于:在CAM中,将数据提交给表示虚拟地址的CAM并且返回与所述数据有关的地址,而在SRAM中,向SRAM提供地址并且返回在那个地址上所存储的数据。
CAM的信元是这样排列的,使得每排信元都保存一个存储地址,并且那排信元通过匹配行而连接到数据阵列的对应字行上以便当在那个匹配行上发生匹配时能够实现那个字行中的数据阵列的存取。在完全关联的高速缓冲存储器中,CAM的每一排都保存对应的主存储位置的全地址,并且输入到CAM需要输入所述全地址。
Steven A Guccione等人的名为″A Reconfigurable ContentAddressable Memory(可重新配置的内容可寻址的存储器)″的现有技术出版物中,论述了FPGA内部实施CAM的方式。正如在现有技术的图1中看到的那样,在半导体管级别上,CAM电路101的实施方式非常类似于标准SRAM 100的实施方式。CAM和SRAM电路两者差不多是相同的,除增加了三个匹配半导体管103外,每一个都具有6个半导体管102,所述这三个匹配半导体管提供了CAM 101的并行检索能力。令人遗憾的是,使用标准的可编程逻辑装置并不方便于实现这类半导体管层电路。
在该现有技术的出版物中,论述了以FPGA实现的CAM。利用门级别的逻辑来实现CAM往往会导致不合理的CAM大小。在CAM内部触发器被用作为数据存储元件,其结果是利用FPGA实现的可达到的CAM电路的大小要取决于FPGA内可用的触发器的数量。以FPGA实现CAM会迅速地耗尽许多FPGA资源,因而不是一个可行的解决方案。令人遗憾的是,这已经导致早先的设计者推断只能在半导体管级别上高效地实现所述CAM。
该现有技术的出版物还提出在FPGA中使用查找表(LUT)来实现CAM。不是在FPGA内使用触发器来存储需要匹配的数据,这种实施方式提出了使用LUT来存储需要匹配的数据。通过使用LUT而不是使用触发器,可以得到更小的CAM结构。
令人遗憾的是,利用可合成元件来形成CAM不容易被实现,所以提供CAM的现有技术的处理器在其内具备CAM核心。在处理器内提供CAM核心不适当地使制造出的电路很昂贵,因为增加了设计复杂性。这类额外的设计复杂性不适合于小批量定制设计的处理器。
图2说明了从虚拟地址(VA)201到物理地址(PA)202的翻译过程。所述VA 201是32位地址,VA[31:0],而所述PA 202也是32位地址PA[31:0]。所述VA具有两个部分:虚拟页面号(VPN)203和页面偏移量(PO)204。所述VPN 203通常位于VA 201的较高部分,而所述PA 202通常位于较低部分,不过这不是必须的。典型地讲,对于32位的寻址方案而言,所述VPN是20位,而所述PA是12位。所述PA或较低的12位直接翻译成PA。所述VPN 203用于对TLB 205变址以便从中检索物理页面号(PPN)206。换句话说,所述VPN 203经历到PPN 206的翻译。将PA 202的较高部分中的PPN 206和PO组合成PA的较低部分提供了从VA到PA的译本。
图3说明了结合直接映射的高速缓冲存储器301所实现的从VA 201到PA 202的翻译过程。在翻译周期的开始,利用VA来访问高速缓冲存储器301和TLB 205两者。利用VA的页面偏移量部分来访问高速缓冲存储器301-该页面偏移量是翻译过程中未被修改的地址的部分。使用页面偏移量来对高速缓冲存储器301中所找到的标记阵列302和数据阵列303进行变址,其中使用所述页面偏移量来对高速缓冲存储器301内部的超高速缓冲存储器行302a进行变址。对TLB的访问是利用VA 201的VPN部分203执行的。所述TLB 205典型地包括TLB标记阵列304和TLB数据阵列305。TLB标记阵列304和TLB数据阵列305两者都包含来自于VPN 203的那些位,以便当向这些阵列中的每一个提供VPN时,构成VPN的那些位与那些存储在阵列304、305内部的位进行比较以定位TLB 205内的项。
一旦访问TLB数据阵列305并且在VPN和TLB数据阵列305a内的项之间发现匹配,就检索PPN 206并将所述PPN 206提供给高速缓冲存储器301并且使用所述PPN 206与从标记阵列302中检索出的标记302a进行比较。匹配表示高速缓存″命中″306。如果在VPN 203与TLB标记阵列304a内的项之间发现匹配,那么就生成TLB命中信号307。照此,访问高速缓存仅仅利用了PPN 206的各个位。上述示例说明了直接映射式高速缓冲存储器的使用;然而,同样的VA到PA的翻译本也适用于按组相关的高速缓存。当使用按组相关的高速缓存时,本领域技术人员认识到的是,高速缓存路线的大小小于或等于虚拟页的大小。
令人遗憾的是,当在SRAM中实现TLB时,要求对存储器作穷举搜索以支持CAM功能。因此,当TLB具有1024个虚拟地址及其对应的物理地址的存储器时,每一次地址翻译都需要多达1024次的存储器存取和比较操作。这类CAM实施方式是不切实际的,因为性能随CAM的大小而线性下降。
图4a总体上说明了利用可合成逻辑元件499和随机存取存储器(RAM)410所形成的TLB 400。经由VPN_IN输入端口450提供用于翻译的VPN,其中位VPN_IN[31:12]是从VA[31:0]提供到这个输入端口450的。经由CP0_PAGE_MASK输入端口451提供页面屏蔽信号。经由CP0_TRANSLATION输入端口452提供CP0_TRANSLATION输入信号。取决于使用TLB 400从VA到PA的译本,经由TLB_TRANSLATION输出端口453提供TLB_TRANSLATION输出信号。
图4b更详细地说明了由可合成逻辑元件形成的TLB 400,并且在图4c中,概括示出了TLB 400的操作步骤。在TLB操作的更详细说明中,经由VPN_IN输入端口450提供用于翻译的VPN(480),其中位VPN_IN[31:12]是作为VPN从VA[31:0]到这个输入端口450提供的。经由CP0_PAGE_MASK输入端口451提供页面屏蔽。向页面屏蔽编码器408提供这个页面屏蔽,用于根据表1来对页面屏蔽进行编码。 页面大小 屏蔽[2:0] 4KB 000 16KB 001 64KB 010 256KB 011 1M 100 4M 101 16M 110
表1:页面屏蔽编码
所述页面屏蔽编码器408用于接收其输入端口上的CP0_PAGE_MASK输入信号,并且用于使这个输入信号与3位向量MASK[2:0]进行相关。进一步向散列电路406提供所述3位向量MASK[2:0]。所述散列电路406经由第一输入端口406a来接收VPN_IN[31:12],并且经由第二输入端口406b来接收MASK[2:0]。散列向量H_VPN[5:0]是通过散列电路406的散列操作481而从其输出端口406c那里提供的。进一步向48个寄存器409中的每一个寄存器提供散列向量H_VPN[5:0]和MASK[2:0],其中每个寄存器包括多个触发器,共同称为491。每个寄存器409都具有两个输出端口。向比较电路403提供来自于其第一输出端口的第一输出信号。向48个散列电路406的其中一个的第二输入端口406b提供来自于第二输出端口的第二输出信号。这个散列电路上的第一输入端口接收VPN_IN[31:12]。所述散列电路406输出端口耦合到用于对寄存器输出和散列电路输出信号之间进行比较的48个比较电路403的其中一个。取决于两个输入信号的比较,如果所述信号是相同的则每个比较器都提供‘1’,如果它们是不同的则提供‘0’。来自48个比较器的每一个的输出信号hiti提供给48个单位的二输入多路复用器411中的一个。来自于每个多路复用器的输出端口耦合到触发器404。每个触发器404都生成在标记为tryi的输出端口提供的输出信号,其中对于0<i<47的情况下,这些输出信号try[0…47]一起被提供给优先级编码器电路401。所述优先级编码器电路进一步耦合到二进制解码器电路402,其中所述优先级编码器电路向二进制解码器电路402和RAM 410确立TLB_ENTRY[5:0]信号。在TLB 400内提供三个输出端口,ENTRY_FOUND输出端口454、ENTRY_NOT_FOUND输出端口455和TLB_TRANSLATION输出端口453,以分别提供ENTRY_FOUND、ENTRY_NOT_FOUND和TLB_TRANSLATION输出信号。
将对于从VA到PA的译本的地址存储在随机存取存储器(RAM)410中,其中所述RAM 410最好按行的形式具有48项。在使用中,每当执行新的翻译时,分别通过输入端口450、451和452向TLB电路400提供输入信号VPN_IN、CP0_PAGE_MASK和CP0_TRANSLATION。对于给定的索引i由TLB所执行的译本存储在RAM 410中。所述给定的索引对保存PPN的译本的RAM内的其中一行410a进行索引。所述散列电路406计算散列函数H(VPN_IN,MASK)并且在相应的6位寄存器hi中存储结果(490)。在3位寄存器mi中存储页面屏蔽(491)。
当利用TLB请求翻译时,经由输入端口提供VPN并且为所有的i计算散列函数H(VPN_IN,mi)并与hi相比(450)。这产生48位的向量hit0…hit47(492),所述48个位向量随后被加载到48位的寄存器try0…try47中(493)。为了确定所请求的VPN_IN是否存在于RAM中所存储的翻译表当中(482),只检查RAM中那些tryi已经确立的项或行。如果它产生‘1′(483),则确立48位的tryi向量中的一项。当然,可能在tryi向量中有不止一位被确立,但是优先级编码器401选择具有最低索引值的项以便对RAM内的项寻址。所述解码器402将这个索引转换成48位的一次命中的向量clr0…clr47(494)。当时钟脉冲从时钟电路(未示出)来临时,除与刚才用来寻到RAM的索引相对应的已清除的位之外,所述tryi向量被重新加载。每次一项地重复这个过程(483)。一旦如ENTRY_FOUND输出端口454上的ENTRY_FOUND信号所指示的那样查找到了所请求的项时,或当tryi中的所有位都为0时,所述过程就立即停止(484)。当tryi中的所有位都是‘0’时,那么就经由ENTRY_NOT_FOUND输出端口455来提供ENTRY_NOT_FOUND信号。在第一种情况下,翻译是成功的并且利用TLB_TRANSLATION输出端口453上的TLB_TRANSLATION信号从RAM 410那里提供用于翻译的信息(485)。在第二种情况下,翻译不成功,并且TLB报告TLB再填充异常。
图5更详细地说明了散列电路506。利用MASK[2:0]和VPN[31:12]向散列电路506输入信号,7对1多路复用器501依据提供给第二输入端口506b的MASK[2:0]信号从散列电路506那里提供H_VPN[5:0]输出信号。这个散列电路从VPN中选择6个最低位。所述选择受页面屏蔽的控制,因为″最低的″的定义随页面大小而变化。例如,对于4kB的页面大小来说,VPN的6个最低位(LSB)是位22:17,而对于16kB的页面大小来说,6个LSB是位19:14。由于TLB 400的每个TLB项都存储两个相邻的虚拟页,称作奇/偶对,因而对于4kB页面的6个LSB来说,奇/偶对是位18:13。因此,第12位确定是返回偶数(0)还是返回奇数(1)译本,而对于16kB的奇/偶对来说,所述位是20:15。然而,这个散列函数是冗余的,因为位H_VPN[5:0]的排序是不相干的。图6展示出了位的排序是不相干的。
图6说明了图5中所示的散列电路的变形。向第一输入端口606a提供VPN[31:12]信号,而向第二输入端口606b提供MASK[2:0]信号。所述屏蔽信号MASK[2:0]由位m0、m1和m2组成。在这个散列电路606内部有三个3对1多路复用器601至603。第一多路复用器601在其选择输入端口上接收下列位{m2, m2(m1+m2)},其中向多路复用器数据输入端口0至2分别提供来自VPN的位VPN[13:14]、VPN[19:20]、VPN[25:26]。由此,多路复用器601给H_VPN[5:0]输出信号提供第5位和第4位。第二多路复用器602在其选择输入端口上接收下列位{m2(m1+m0), m2m1+m2m2m0)},其中向标记为0至2的多路复用器数据输入端口分别提供来自于VPN的位VPN[15:16]、VPN[21:22]、VPN[27:28]。由此,多路复用器602给H_VPN[5:0]输出信号提供第3位和弟2位。所述第三多路复用器603在其选择输入端口上接收下列位:{m2m1, m2m1m0+m2m1)},其中向标记为0至2的多路复用器数据输入端口分别提供来自于VPN的位VPN[17:18]、VPN[23:24]、VPN[29:30]。由此,多路复用器603给H_VPN[5:0]输出信号提供第1位和第0位。
优选地,散列函数H_VPN[5:0]对于MASK[2:0]和对于VPN_IN[31:12]输入信号而言是均匀分布的。在TLB错失的情况下,查找RAM内起初为之确立tryi的所有项。循环数Nmiss可以用下式表示:
Nmiss=Σj=04848jpj(1-p)48-j(1+j)]]>
,其中p是比较器输出信号hiti被确立的概率。下列项:
48jpj(1-p)48-j]]>
,给出在try向量tryi中正好有j个位最初被确立的概率。当均匀散列函数H在它的输出信号上具有n个位的情况下,p=2-n,其中在图4b的情况下,n=6。
在TLB命中的情况下,需要对RAM 410进行至少一次访问,这与不访问RAM的情况下进行检测的TLB错失的状况相反,因为在TLB错失状况中,try向量tryi包含的全部是0。
为命中翻译在TLB中需要执行的平均循环数是由下列公式给出的:
Nhit=Σk=04747kpk(1-p)47-k(1+k2)]]>
对于TLB命中而言,在try向量tryi中一定存在至少一个‘1’。唯一的不定性就是向量内带有其余元素造成的。变量k用来表示对于k处于0…47的范围内、try向量tryi内被设置为‘1’的其余项的数量。如果k=0,那么在RAM内仅仅查出一项。因此,由于对于i=0时要使用一个时钟周期来查找第一位置中的译本,因此就要利用总共两个时钟周期来执行所述翻译。平均起来,需要花费2+k/2循环以从RAM410中返回所请求的译本。
就执行翻译和中断等待而言,要检查长的查找序列所需的时钟周期数,例如k高达25或25以上。下列关系式:
P{N25}=Σ254848jpj(1-p)48-j]]>
,给出了TLB将使用25个或25个以上的循环来完成翻译的概率。表2列出了在散列函数宽度(n)的范围内为了找到翻译Nhit,检测错失Nmiss需要花费的平均循环数和TLB操作占用25个周期数或更多周期数的概率。N Nhit HhitqNmiss P{N25}3 4.94 3.94 7.00 4.3 10-114 3.46 2.46 4.00 5.9 10-185 2.73 1.73 2.50 3.6 10-256 2.37 1.37 1.75 1.5 10-327 2.18 1.18 1.38 5.4 10-40
表2:作为散列位‘n’的数量的函数的TLB等待时间
从表2来看,很明显P{N25}是如此之小,以致即使具有4位散列函数,它也需要超过6000年的连续操作才能碰上TLB翻译需要25到48个之间的时钟周期的情况。
Nhitq(″命中快速″)列适用于连续地向TLB电路400施加VPN_IN的情况。从这个表来看,很明显当重点在于最重要的数即Nhit时,n=5或n=6就足够了。超过6位不会得到更大收获,因为当n=>20时Nhit趋近2.0。在TLB电路400中使用n=6的数值,因为散列函数可能不是很均匀。因此,TLB内使用的6位散列函数接近于5位真正均匀的散列函数的性能。
有利的是,当向TLB提供VA时,它被传送到对每一行的合成逻辑中,并且提供这样的结果,它由tryi向量内各个位中至少一个确立的位来表明。然后,为了提供PPN只要在物理上访问那些其结果表现出匹配已发生的那些行。因此,对于翻译过程只要访问TLB行的一小部分,由此导致实质的性能改善。
在不背离本发明的精神或范围的情况下,可以设想出许多其它的实施例。