专利名称:复杂指令系统中tlbr内部例外的处理方法和处理器的制作方法
技术领域:
本发明涉及微处理器设计,更具体地,涉及一种复杂指令系统中 TLBR内部例外的处理方法和处理器,能够对复杂指令系统中的页表进 行快速高效地替换。
背景技术:
实现复杂指令集(典型地,如X86指令集)的一种通常做法是将一 条复杂指令译码成一条或多条微码,然后通过微码发射部件乱序发射 到各个功能部件执行。微码被发射到功能部件的同时也被送到一个被 称为ROQ的队列中,通过该队列维护微码的顺序提交,保证精确例外和 程序的正确语义。图1给出了按照这种方式工作的CPU结构框图,本发 明的后续说明均基于图l给出的处理器基本结构。
对图l中各部分简要描述如下
取指和部分译码(101):从内存中取复杂指令流(如x86指令),对
指令流进行恰当的长度划分和基本译码后送到微码生成部件产生正确
的微码。为了提高处理性能,通常在这里还放置指令CACHE和指令TLB 部件,由于这些部件和本发明关系不大,在图中没有示出。
微码生成部件(102):从取指和部分译码部件获得复杂指令(如 x86指令)的长度及部分译码信息,并据此产生正确的微码送到后续部 件发射执行。
微码乱序发射部件(103):主要完成微码的发射。具体涉及的细 节包括从寄存器堆读取操作数,对寄存器进行重命名,检测后续功能 部件和ROQ队列是否可以容纳待发射的微码等等。同样地,出于性能考
虑,在一些具体的实施例中通常将寄存器重命名、读取寄存器堆和微 码发射分别放在独立的模块中完成(图中没有具体示出)。
ROQ队列(重排序缓冲队列)(104):维护微码的正确顺序,保证
程序的正确语义和精确例外。ROQ是整个处理器的控制中心,当一条复
杂指令的所有微码都执行完以后,即将该复杂指令提交。
执行单元(105):典型的执行单元如访存单元、定点单元和浮点 单元等。执行单元用来完成微码要求的运算,然后将运算结果通过结
果总线写回到ROQ中。
访存微码在开始真正的访存之前,首先需要将程序员给出的线性 地址转换成相应的物理地址。在处理器设计中为了加速这一转换过程, 在硬件上提供一个快速查找表TLB,其中每个线性地址和一个物理地址 对应。处理器中TLB的典型结构如图2所示,每个TLB表项包括Valid(有 效位)、线性地址、物理地址和页表属性等域
(1) Valid:如果该域为l,表示该TLB表项是有效的;反之该TLB 表项是无效的;
(2) 线性地址程序员编程时使用的地址空间的地址。在访存时 用线性地址域索弓ITLB找到匹配的表项,然后从匹配的表项中取出物理 地址域,形成实际内存访问使用的物理地址;
(3) 物理地址物理内存页的基地址,访问TLB时先用线性地址 索引出物理内存页的基地址,然后和页内偏移相加形成最后访存的物 理地址。
在进行虚实地址变换的时候,由于TLB中保存的页表数目有限, 当在TLB中査询页表不命中的时候,需要进行TLB页表替换。现有的实 现复杂指令集,典型的如x86指令集的处理器中,实现TLB页表替换的 的方法如下当一条复杂指令的某条需要访存的微码在访存功能部件 中发现TLB MISS时,这一事件被功能部件作为一个特殊的内部例外记 录下来,然后随着这条访存微码通过结果总线被送到ROQ中。ROQ发现 这一条复杂指令发生了TLB MISS,于是往例外总线上送出刷流水线的 控制信号,这样流水线被刷空。微码生成部件开始发送针对TLB MISS 的TLB Refill例外处理的微码,待TLB MISS这一例外事件处理完成时 再重新对引起该内部例外的复杂指令取指、译码、发射和执行。
上述处理方法在某些情况下会引起较高的性能损失。假定一条复 杂指令被翻译成图3所示的微码序列,图中的省略号表示略去了一些和
本发明无关的微码。如果在执行前n-l个load操作的时候都TLB命中, 而在执行Load regn, addrn的时候引起TLB Ref ill内部例外(例如 addrn的对应的物理地址和addrl-addrn对应的物理地址不在同一内存 页面,而且是第一次访问addrn对应的物理页面,此时必定会引起TLB Miss),那么原来的处理方法将前面顺利做完的n-l条load微码取消, 待处理完load regn, addrn引起的TLB Ref ill内部例外以后重新取指 并执行该复杂指令。事实上既然前n-l个load己经能够顺利做完,只需 要在TLB Refill以后重新执行第n个load微码就可以了。更坏的情况 是,如果在执行一条复杂指令时发生多次TLB Miss,那么则会将该指 令取消并重新尝试执行多次。
本发明提供的方法和处理器能基本解决上面的问题。
发明内容
本发明的目的是提出一种复杂指令系统中TLBR内部例外的处理 方法和处理器,能够对复杂指令系统中的页表进行快速高效地替换。
为了实现上述目的,根据本发明,提出了一种复杂指令系统中 TLBR内部例外的处理方法,包括从内存中获取复杂指令流,对指令 流进行长度划分和基本译码;缓存指令流中的复杂指令及所述复杂指 令的长度及部分译码信息;根据缓存的复杂指令及所述复杂指令的长 度及部分译码信息,产生与复杂指令相对应的微码;以及在检测到一 微码在执行时发生TLBR内部例外时,保持例外以前己经完成的部分微 码的执行结果,并取消例外微码之后的所有微码,并进行TLB替换,在 TLB替换成功之后,重新生成发生例外的微码及其后面的微码并从发生 例外的微码处开始执行。
优选地,所述进行TLB替换的步骤包括生成并执行用于TLB替换 的微码序列;如果用于TLB替换的微码序列中的微码发生TLBR内部例外 而形成嵌套时,先处理内层的TLBR内部例外。
优选地,如果TLB替换不成功,则触发外部例外以便由系统程序 员处理。
优选地,所述TLBR内部例外包括TLB MISS。
根据本发明,还提出了一种复杂指令系统中TLBR内部例外的处理 器,包括取指和部分译码模块,用于从内存中获取复杂指令流,对 指令流进行长度划分和基本译码并传送到指令队列;指令队列,用于 缓存取指和部分译码模块传送来的己经取指和部分译码的复杂指令及 所述复杂指令的长度及部分译码信息;微码生成部件,根据从指令队 列获取的复杂指令及所述复杂指令的长度及部分译码信息,产生与复 杂指令相对应的微码并发送到微码执行单元;微码执行单元,在R0Q 队列的控制下,执行微码生成部件发送来的微码,以及R0Q队列,在检 测到一微码在微码执行单元中执行时发生TLBR内部例外时,保持例外 以前已经完成的部分微码的执行结果,并取消例外微码之后的所有微 码,并控制微码生成部件进行TLB替换,并在TLB替换成功之后,由微 码生成部件重新生成发生例外的微码及其后面的微码并发送到微码执 行单元执行。
优选地,所述指令队列为先入先出队列,并由三个指针head—dec、 head—cmt和tai1—dec来维护,其中,指针head—dec指向正在译码的 复杂指令;指针head—cmt指向正在执行中但是还没有提交的复杂指 令;以及指针tail—dec指向队列中的第一个空项。
通过参考以下结合图对所采用的优选实施例的详细描述,本发明
的上述目的、优点和特征将变得显而易见,其中
图l是示出了能够应用本发明的微处理器基本框图2是示出了TLB的典型结构示例的示意图3是示出了作为示例的某条复杂指令翻译后的微码序列的示意
图4是用于说明内部例外和外部例外执行路径的区别的示意图; 图5是示出了根据本发明实施例的复杂指令系统中页表替换的微 处理器的方框图6是示出了在图5的系统中指令队列的状态图示的示意图7是示出了根据本发明实施例的用内部例外机制处理TLB页面 替换的流程图8是示出了可能引起TLBR内部例外的复杂指令的执行的流程 图;以及
图9是示出了访存部件的基本结构的示意图。
具体实施例方式
下面将参考附图来描述本发明的优选实施例。
一条复杂指令在执行的过程中可能引起多种例外,本发明中所有 这些例外被定义为2类(l)外部例外,即在执行一条复杂指令的过程 中发生的例外导致程序执行路径的改变。例如如果一条复杂指令在访 存时,对应的内存页表项为空,那么将触发page fault外部例外。在 这种情况下,操作系统执行一个page fault外部例外处理程序,将要 访问的内存页表项设置好,然后重新执行引起例外的复杂指令;(2) 内部例外,即在执行一条复杂指令的过程中发生的例外事件不会引起 程序执行路径的改变。比如一条复杂指令在访存时发生了TLB MISS, 但是对应的内存页表项是有效的,这个时候可能引起一个TLBR内部例 外。在内部例外发生时,ROQ通过例外总线信号告诉微码生成部件发送 内部例外处理微码,将内存页表中的有效页表项调入TLB翻译后援缓冲 器中,这样在重新执行引起TLB Refill例外的复杂访存指令时就能正 常访存。这里,通常的内部例外包括内存页脏、内存依赖预测错误以 及TLB重填等。
内部例外和外部例外的图示如图4所示,从图中可以更加清楚地 看到它们的区别。外部例外引起了复杂指令(如x86指令)执行路径的改 变,而内部例外则不会改变复杂代码(如x86代码)的执行路径。
基于内部例外机制的页表替换,其基本工作机制如图5所示。可 以看出,图5和图1的主要区别在于取指和部分译码部件与微码产生部 件之间插入了一个先入先出指令队列,增加这个队列是为了能缓存前 端已经取指和部分译码完成的复杂指令。队列中每条复杂指令的生命 周期从该复杂指令从取指和部分译码部件送入指令队列开始,到这条
复杂指令的所有微码在功能部件中执行完毕并已经在ROQ中提交为止。 这样,如果某条复杂指令在功能部件中发生了TLB MISS,在TLB MISS
内部例外以前己经完成的部分微码的执行结果可以保留,只在完成了 TLB替换后,继续做未完成的工作。这样就不需要因为发生TLB MISS 内部例外而重新取该复杂指令,但依然可以知道该指令所需提供的译 码信息。
该指令队列可以按照典型的先入先出循环队列组织,其基本工作 方式如下微码产生部件中的队列控制逻辑维护2个队列头指针 (head—dec, head—cmt)和一个队列尾指针tai1—dec。其中head—dec指 向第一条等待译码的复杂指令,head一cmt指向正在功能部件中运算但 是还没有提交的第一条复杂指令,该复杂指令已经被译码完毕,但是 可能会因为内部例外而重新译码。微码产生部件每译码一条复杂指令 就将heacLdec指针移向下一条复杂指令;ROQ每提交一条复杂指令就将 head—cmt指针移向队列中的下一条复杂指令。如果head—cmt指向的复 杂指令在执行过程中发生内部例外(如TLBMISS),贝UROQ通过例外总线 通知微码产生部件重新对head—cmt指向的复杂指令译码,同时修改 heacLdec指针为head—cmt指针。如果队列中还有空项,tail—dec指针 指向队列尾的第一个空项。取指和部分译码部件每处理完一条复杂指 令,就将该部分译码的复杂指令放入指令队列尾,当队列满时则停止 往指令队列中送复杂指令。运行过程中队列的典型状态如图6所示。
用内部例外机制进行页面替换的基本流程如图7所示。当用一个 线性地址在TLB中索引时找不到与之对应的物理地址时,即表明发生了 TLB MISS (翻译后援缓冲器不命中)(702)。此时,访存部件将该微码 置上TLBR(翻译后援缓冲器重填)内部例外(即需要替换TLB表项),并 通过结果总线将这一例外信息送入到ROQ中(703) 。ROQ检测到该微码引 起了TLBMISS,需要重新发射微码将内存中的页表项填回TLB后才能重 新执行,于是将队列中发生例外的微码后面的所有微码取消(704)。之 所以要取消,是因为后续的微码可能依赖于前面发生TLB MISS的微码 的访存结果。随后,ROQ部件通过例外总线通知微码生成部件发送进行 TLB表项替换操作的微码序列(705),该微码序列随后被发射部件送到
各个功能部件执行(706h需要注意的是,由于进行TLB表项替换的微 码序列也需要访存,因此可能再度引发TLBMISS(707),因此会在TLBR 内部例外中嵌套新的TLBR内部例外。当发生TLBR内部例外嵌套时,先 处理最内层的TLBR内部例外,然后再处理往外一级的TLBR内部例外, 最后直到最外层的TLBR内部例外得到处理。这样当处理TLBR内部例外 的过程中发生TLBR内部例外时,需要回到步骤705,先处理最近发生的 TLBR内部例外,当最里层的TLBR内部例外处理完以后,继续处理外层 的TLBR内部例外。进行TL:B表项替换的微码序列的主要功能,是查询和 MISS的线性地址对应的内存页表中的页表项(709)。如果该页表项有 效,就将其填入处理器的TLB中;反之,如果该页表项在内存页表中不 存在或无效,则触发Page Fault外部例外(710),由系统程序员处理。 如果发生Page Fault外部例外,则需要改变程序的执行路径,即跳转 到Page Fault外部例外的处理程序去执行,这种情况下ROQ通知前端刷
空指令队列中的所有指令,转到外部例外的处理程序入口取指执行 (711)。如果在内存页表中找到了和MISS的线性地址对应的页表项,那 么就将该页表项装入到处理器的TLB中,完成此次TLB表项替换。在TLB 页面替换完成后,前端指令队列中的hea(Lcmt指针仍然指向因TLBR内 部例外而停顿的复杂指令,此时调整head一dec指针使之指向head—cmt 所指向的复杂指令,重新译码、执行该队列中后续的所有指令。微码 生成部件每成功译码一条复杂指令就修改head一dec指针使之指向未译 码的下一条复杂指令;而head—cmt指针只有当其指向的复杂指令在ROQ
中被提交时(即该复杂指令的所有微码都已经成功完成)才能指向下一 条未提交的复杂指令,heacLcmt先前指向的复杂指令所在队列项被释 放,以用来存放新入队的复杂指令。当指令队列因为外部例外(如Page Fault外部例外)被刷空时,head—dec指针和head—cmt指针复位。
图8给出了可能发生例外的复杂指令在使用了本发明的处理器中 的执行流程。首先译码并第一次尝试执行该复杂指令(801),如果该复 杂指令的微码在执行过程中没有任何例外(803),则所有微码正确完成 并通过结果总线提交到ROQ中,ROQ随后删除已经顺利完成的复杂指令 的所有微码,并通知前端指令队列控制逻辑修改head—cmt指针使之指 向下一条未提交的复杂指令。但是如果该复杂指令的微码在功能部件
中发生例外,那么需要分TLBR内部例外和其它例外两种情况处理。如 果是其它例外(806),则很可能引起程序执行路径的改变,因此在处理 完例外以后需要清除指令队列中的所有队列项,复位heacLcmt 、 heactdec和tai1—dec指针,重新取指并执行下一条复杂指令(809);如 果发生了TLBR内部例外(807),那么在完成TLB表项的替换后需要修正 head—dec指针使之指向发生内部例外的复杂指令(即head一cmt指针指 向的复杂指令),微码生成逻辑随后尝试重新译码并执行该复杂指令 (808),需要注意,在重新执行的过程中仍然可能发生例外。
前面已经提到前端引进的指令队列的基本操作以及基于内部例 外机制的TLB页面替换流程。下面说明本发明如何使得引起TLBR内部例 外的复杂指令在触发TLBR之前完成的工作可以保留,只在TLBR内部例 外处理之后继续做该指令未完成的工作。首先需要提及,前端的微码 生成部件对于操作复杂程度不同的复杂指令其生成微码的方法不同 对于简单的复杂指令只需要通过组合逻辑就能直接生成微码输出;而 对于操作复杂的复杂指令,微码产生部件需要查询一个uRom来获得翻 译后的微码输出。根据这一差别,下面分成操作简单的复杂指令和操 作复杂的复杂指令两种情况进行讨论
(1) 对于操作简单的复杂指令(例如x86中M0V访存指令),微码生 成部件直接生成对应于该复杂指令的微码。如果head一cmt指向的是一 条简单复杂指令而且该指令在执行过程中发生了内部例外(如TLB Miss),那么微码生成部件重新译码head—cmt指针指向的复杂指令,然 后送到后续的功能部件重新执行。这样一来,在再次执行的时候就不 需要重新取指和进行部分译码,从而避免了因为重新取指而引起的较 大访存延迟。虽然在发生TLBR内部例外以后仍然需要微码生成部件重 新产生该复杂指令的微码,但是由于这种复杂指令操作简单,译码(直 接通过组合逻辑完成)能以很高的效率完成,和取指时的访存延迟相 比,重新译码的开销可以忽略不计。
(2) 对于操作复杂的复杂指令,微码生成部件从uRom中查找该复 杂指令的微码,将其取出后送到后续的发射模块。如果head一cmt指向
的是一条操作复杂的复杂指令而且该指令在执行过程中发生了内部例
外(如TLBMiss),则首先保存ROQ中该复杂指令引起例外的微码前面所 有已经正确做完的微码状态,然后通过例外总线将发生例外的微码的 uRomPC送到微码产生部件。微码产生部件在送完内部例外处理微码后, 不需要重新译码head一cmt指向的复杂复杂指令,而是用uRomPC从uRom 中索引,从引起内部例外的微码处送后续的微码。
本发明可以用在使用了TLB的实现复杂指令集的处理器中。具体 实施可以参考图5实现,但是需要进一步作如下方面的考虑
(1) 需要在前端取指和译码部件与微码生成部件之间设置一个指 令队列,用来存放尚未成功提交的复杂指令,对该队列的操作方式在 发明内容部分已经进行过详细说明;
(2) 需要对访存部件的结构进行恰当设计以便充分利用本专利中 提出的内部例外机制。本发明中一种推荐的访存部件基本结构如图9 所示,此结构可以作为基本功能部件集成到图l所示的处理器结构中。 当访存微码,典型的如加载/存储从发射部件送到访存部件时,首先需 要经过一级流水计算线性地址(901);然后用计算的线性地址索引数据 cache (902),与此同时査DTLB,实现虚实地址变换(903); cache tag 比较用来选择正确cache:-ine中的数据(904),同时可以进行一些必要 的访存权限检査;最后,访存微码进入到访存队列开始访存调度(905)。 如果在访问DTLB时发现TLB MISS,此时记录一个TLBR内部例外,待微 码进入到访存队列后,通过结果总线送到ROQ中,由ROQ通知微码生成 部件发送TLBR内部例外的处理微码。
尽管以上己经结合本发明的优选实施例示出了本发明,但是本领 域的技术人员将会理解,在不脱离本发明的精神和范围的情况下,可 以对本发明进行各种修改、替换和改变。因此,本发明不应由上述实 施例来限定,而由所附权利要求及其等价物来限定。
权利要求
1、一种复杂指令系统中TLBR内部例外的处理方法,包括从内存中获取复杂指令流,对指令流进行长度划分和基本译码;缓存指令流中的复杂指令及所述复杂指令的长度及部分译码信息;根据缓存的复杂指令及所述复杂指令的长度及部分译码信息,产生与复杂指令相对应的微码;以及在检测到一微码在执行时发生TLBR内部例外时,保持例外以前已经完成的部分微码的执行结果,并取消例外微码之后的所有微码,并进行TLB替换,在TLB替换成功之后,重新生成发生例外的微码及其后面的微码并从发生例外的微码处开始执行。
2、 根据权利要求l所述的方法,其特征在于所述进行TLB替换的步骤包括生成并执行用于TLB替换的微码序列;如果用于TLB替换的微码序列中的微码发生TLBR内部例外而形成 嵌套时,先处理内层的TLBR内部例外。
3、 根据权利要求l所述的方法,其特征在于如果TLB替换不成功, 则触发外部例外以便由系统程序员处理。
4、 根据权利要求l所述的方法,其特征在于所述TLBR内部例外包 括TLB MISS。
5、 一种复杂指令系统中TLBR内部例外的处理器,包括 取指和部分译码模块,用于从内存中获取复杂指令流,对指令流进行长度划分和基本译码并传送到指令队列;指令队列,用于缓存取指和部分译码模块传送来的已经取指和部 分译码的复杂指令及所述复杂指令的长度及部分译码信息;微码生成部件,根据从指令队列获取的复杂指令及所述复杂指令 的长度及部分译码信息,产生与复杂指令相对应的微码并发送到微码 执行单元; 微码执行单元,在ROQ队列的控制下,执行微码生成部件发送来 的微码,以及R0Q队列,在检测到一微码在微码执行单元中执行时发生TLBR内 部例外时,保持例外以前己经完成的部分微码的执行结果,并取消例 外微码之后的所有微码,并控制微码生成部件进行TLB替换,并在TLB 替换成功之后,由微码生成部件重新生成发生例外的微码及其后面的 微码并发送到微码执行单元执行。
6、 根据权利要求5所述的处理器,其特征在于所述ROQ队列通过 例外总线通知微码生成部件发送用于TLB替换的微码序列,并将所述微 码序列发送到微码执行单元执行。
7、 根据权利要求5所述的处理器,其特征在于所述ROQ队列在TLB 替换不成功的情况下,触发外部例外以便由系统程序员处理。
8、 根据权利要求5所述的处理器,其特征在于所述TLBR内部例外 包括TLB MISS。
9、 根据权利要求5所述的处理器,其特征在于所述指令队列为先 入先出队列,并由三个指针head—dec、 head—cmt和tai1—dec来维护, 其中,指针heacLdec指向正在译码的复杂指令;指针head—cmt指向正在执行中但是还没有提交的复杂指令;以及指针tai 1—dec指向队列中的第一个空项。
全文摘要
根据本发明,提出了一种复杂指令系统中TLBR内部例外的处理方法,包括从内存中获取复杂指令流,对指令流进行长度划分和基本译码;缓存指令流中的复杂指令及所述复杂指令的长度及部分译码信息;根据缓存的复杂指令及所述复杂指令的长度及部分译码信息,产生与复杂指令相对应的微码;以及在检测到一微码在执行时发生TLBR内部例外时,保持例外以前已经完成的部分微码的执行结果,并取消例外微码之后的所有微码,并进行TLB替换,在TLB替换成功之后,重新生成发生例外的微码及其后面的微码并从发生例外的微码处开始执行。
文档编号G06F9/22GK101114216SQ20061008893
公开日2008年1月30日 申请日期2006年7月27日 优先权日2006年7月27日
发明者范东睿, 楠 袁, 龙国平 申请人:中国科学院计算技术研究所