首页> 中国专利> 复杂指令集体系结构中的深度优先异常处理方法

复杂指令集体系结构中的深度优先异常处理方法

摘要

本发明提出了一种复杂指令集体系结构中的深度优先异常处理方法,包括以下步骤:在发生异常时,1)指令重排序缓冲器发出异常信息给各个模块,各个模块将自身寄存器置为无效,从而刷空流水线;2)译码部件将所述异常信息转换为预先定义的指令;3)译码部件根据所述预先定义的指令,索引只读存储器,找出与之相应的微指令,并将所述微指令送入发射部件;4)发射部件将没有数据相关的微指令送入执行部件执行;5)执行部件执行所述微指令,并将执行结果写入指令重排序缓冲器;6)检查指令重排序缓冲器中的第一条微指令是否异常;7)如果指令重排序缓冲器中的第一条微指令异常,则返回1)流水线刷空步骤;8)如果指令重排序缓冲器中的第一条微指令未发生异常,则指令重排序缓冲器将已经写回的第一条微指令提交,完成处理。

著录项

  • 公开/公告号CN101114218A

    专利类型发明专利

  • 公开/公告日2008-01-30

    原文格式PDF

  • 申请/专利权人 中国科学院计算技术研究所;

    申请/专利号CN200610088939.3

  • 发明设计人 段振中;范东睿;

    申请日2006-07-27

  • 分类号G06F9/38(20060101);

  • 代理机构11021 中科专利商标代理有限责任公司;

  • 代理人朱进桂

  • 地址 100080 北京市海淀区中关村科学院南路6号

  • 入库时间 2023-12-17 19:37:05

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2009-06-03

    授权

    授权

  • 2008-03-19

    实质审查的生效

    实质审查的生效

  • 2008-01-30

    公开

    公开

说明书

技术领域

本发明涉及到计算机系统领域,具体地说,涉及处理器内部异常处理领域。本发明提出了一种复杂指令集体系结构中的深度优先异常处理方法。

背景技术

在复杂指令集的计算机系统中,大部分指令都翻译为多条微指令,处理器中的指令流水线处理的是这些微指令,而不是翻译前的操作系统可见指令。这些微指令通常可以操作比复杂指令更多的寄存器资源,比如在复杂指令集中有8个可见的通用寄存器,在微指令集中可能会有32个或64个以上的可见通用寄存器。以32个可见的通用寄存器为例,其中的8个可以作为复杂指令集的通用寄存器,而剩下的24个寄存器则保留给微指令集的译码器作为临时寄存器或用作其它用途。当然,对于微指令集可见的通用寄存器之间还存在一个数据相关的问题。这个问题通常通过寄存器重命名来解决。在一条复杂的指令翻译成的多条微指令中,一些微指令在某种情况下会发生异常,在发生异常后,首先会执行若干条预处理微指令,预处理微指令保存寄存器现场,获取跳转的目标地址,然后跳转到操作系统可见的异常处理程序。这种机制存在一个问题,在发生异常后的预处理微指令中又可能发生异常,这样就形成了微指令异常的多层嵌套。这样就需要一种方法保证这些异常的顺序,正确的修复。另外,对于复杂指令集的指令,它们通常翻译为多个微指令,这多个微指令每一个都有可能发生异常,这些异常如何得到处理,而又不至于导致指令流程混乱甚至异常的死循环,本发明提出了一种在修复所有这些异常后返回到正常指令执行流程的方法。

发明内容

本发明提供了一种深度优先异常处理的方法,可以解决在异常预处理过程中又发生异常的问题,而且可以保证寄存器之间依赖关系的恢复,异常的正常修复,从而可以从断点处继续执行指令。

为了实现上述目的,根据本发明,提出了一种复杂指令集体系结构中的深度优先异常处理方法,包括以下步骤:在发生异常时,1)指令重排序缓冲器发出异常信息给各个模块,各个模块将自身寄存器置为无效,从而刷空流水线;2)译码部件将所述异常信息转换为预先定义的指令;3)译码部件根据所述预先定义的指令,索引只读存储器,找出与之相应的微指令,并将所述微指令送入发射部件;4)发射部件将没有数据相关的微指令送入执行部件执行;5)执行部件执行所述微指令,并将执行结果写入指令重排序缓冲器;6)检查指令重排序缓冲器中的第一条微指令是否异常;7)如果指令重排序缓冲器中的第一条微指令异常,则返回1)流水线刷空步骤;8)如果指令重排序缓冲器中的第一条微指令未发生异常,则指令重排序缓冲器将已经写回的第一条微指令提交,完成处理。

优选地,所述3)微指令查找步骤还包括:对所述预先定义的指令进行解码,并根据解码结果,索引只读存储器。

优选地,所述3)微指令查找步骤还包括:将所述微指令按序存放在指令重排序缓冲器中。

优选地,所述执行部件包括多个执行部件。

优选地,在所述6)异常检查步骤中,检查指令重排序缓冲器中排序靠前的多条微指令是否异常。

优选地,指令重排序缓冲器中排序靠前的多条微指令是指令重排序缓冲器中的第一条和第二条微指令。

优选地,指令重排序缓冲器中排序靠前的多条微指令是指令重排序缓冲器中的第一条到第四条微指令。

优选地,对于数据相关微指令,等待相关数据的产生,当已经产生所有相关数据时,将该数据相关微指令标记为没有数据相关的微指令。

附图说明

下面将参照附图,对本发明的优选实施例进行详细的描述,其中:

图1示出了应用本发明的微处理器的基本框图。

图2是预处理微指令异常嵌套时的处理流程图。

图3是ROQ的内部结构图,它是一个循环队列。

图4是未发生异常预处理的嵌套时指令的执行过程。

图5是发生异常预处理的嵌套时指令的执行过程。

图6描述了重命名模块中微指令对应的目标逻辑寄存器和物理寄存器之间的依赖关系。

图7是实现本发明的译码器的结构框图。

具体实施方式

下面结合附图说明本发明的具体实施方式。应该指出,所描述的实施例仅是为了说明的目的,而不是对本发明范围的限制。所描述的各种数值并非用于限定本发明,这些数值可以根据本领域普通技术人员的需要进行任何适当的修改。

图1是基于本发明的一种CPU结构框图。这类CPU的指令执行过程如下:取指部件101包括指令寄存器、指令高速缓存(cache)、指令旁路缓冲器、分支预测器等,可随实现系统的复杂度不同作相应的调节。取指部件101负责从指令高速缓存中取出相应的指令给译码部件102,译码部件102获得指令后从ROM 103中取微指令进行译码,译码后的微指令送到发射部件104和指令重排序缓冲器(ROQ)106,发射部件104含有重命名逻辑或积分板电路等,用来消除寄存器之间的写写相关和读写相关,发射部件104还负责将已经准备好数据的指令发送到执行部件105去执行,执行部件105将执行的结果信息写回到ROQ 106,ROQ 106中含有流水线中每条指令的状态信息,例如,是否执行完毕,是否提交等。对于分支指令还有分支写回、分支触发等状态。

图2示出的是异常预处理微指令发生多层嵌套时图1所示CPU的执行流程。在发生异常后,ROQ 106输出异常信息(步骤S202)给各个模块,各个模块将自身寄存器置无效,从而刷空流水线。异常信息被缓冲在译码部件102中的一个缓冲器中。这个异常信息在译码部件102中被编码为一条预先定义的指令(步骤S203),在下一拍对这个预先定义的指令进行解码,产生一个urom_pc去索引ROM 103,并将从ROM 103中取得的微指令发射给发射部件104(步骤S204),同时在ROQ106中也会按序存放相应的微指令,发射部件104将没有数据相关的微指令送入执行部件105执行(步骤S205),执行部件105可以不止一个,随具体设计而定。微指令在执行部件105中需要1拍或多拍,然后把产生的结果信息发给ROQ 106(步骤S206),在步骤S207中,ROQ 106在每一拍检查微指令头索引寄存器Roq_head所指向的微指令,可以检查头4条,头2条或只检查1条,随设计而定。如果这条微指令已经写回,并且没有异常产生,则这条指令可以提交(步骤S208),如果再次触发异常的话,流水线又被刷空,译码器102重新缓冲这个异常信息,并再次发出异常处理微指令,重现了上述的处理流程,这样就形成了一个深度优先遍历,在最深层的异常被处理完毕后,这种处理器结构会触发次深层次的异常,直到所有异常都被处理完毕后,复杂指令会得到执行。另外,对于数据相关微指令,等待相关数据的产生,当已经产生所有相关数据时,将该数据相关微指令标记为没有数据相关的微指令。

图3所示的是ROQ 106的结构,ROQ 106中的微指令是按顺序存放的。微指令头索引寄存器Roq_head指向ROQ 106队列头的指令,微指令尾索引寄存器Roq_tail指向队列尾的下一项。ROQ 106是用来保证指令的精确异常,当其中一条微指令发生异常时其后所有的微指令的执行结果都会被取消。当ROQ 106中的一条微指令发生异常后,这个异常的信息会发给取指部件101、译码部件102、发射部件104等。

图4是异常预处理在没有嵌套的情况下复杂指令的执行过程,当一条复杂指令发生异常后,首先安排一段预处理微指令进行压栈、权限检查等操作,最后通过远跳(far jump)指令,跳转到复杂指令的异常处理程序。

图5是在发生异常预处理的三层嵌套时复杂指令的执行过程,从图中可以看出首先处理的是第三层的异常,这个第三层的异常是由第二层异常的预处理微指令产生的,在处理完后处理器返回到断点重新执行这条指令,结果再次发生异常,此时最多只会触发第二层的异常,第三层的异常在第一次触发时已经被修复了,在第二层的异常返回后处理器会再次执行这条发生异常的指令,结果导致第三次触发异常,此时第三层和第二层的异常都已经得到修复了,所以只会触发第一层的异常,同样,首先是一段预处理,进行压栈、权限检查等操作,然后跳到异常处理程序,异常处理程序处理完成后返回到这条指令执行,此时这条指令就能通过执行了。

为了在异常触发后取消已经建立的寄存器依赖关系,需要为每个寄存器依赖指定微指令编号。图6示出的是重命名模块中为寄存器建立依赖和取消依赖关系的一种方法。如图6所示,在遇到指令2时,逻辑寄存器编号1被映射到物理寄存器编号3,在遇到指令6时,逻辑寄存器编号2被映射到物理寄存器编号1,在遇到指令8时,逻辑寄存器编号3被映射到物理寄存器编号5,指令3,4,5和7没有和寄存器建立对应关系,这是因为这些指令没有对应的目标寄存器,即这些指令只执行而不写回。最后在遇到指令9时,逻辑寄存器编号1被映射到物理寄存器编号7,此时同样的逻辑寄存器号1映射了两个物理寄存器号3和7,它们的区别在于对应的指令编号不同,分别为2和9。如果指令8发生了一个异常的话,重命名模块收到这个异常,将每一个依赖关系与这个异常的指令编号进行比较,如果依赖关系所在的指令在发生异常的指令之后,则这个依赖关系需要取消掉。因此,图6中的逻辑寄存器号1到物理寄存器号7的依赖关系被取消,其它的依赖关系保留。

图7是为实现这种异常嵌套处理的译码器102的内部结构框图。执行部件105在执行过程中发现异常,它把异常通过结果总线711送给ROQ 106,ROQ 106在适当的时机发出例外总线710给译码部件712,译码部件712收到这个信号后将ir 703置无效,并把这个异常缓冲在例外缓冲器702中。在下一拍,rom_pc生成器705选择例外缓冲器702的异常信息进行译码,生成urom_pc701,并索引uROM 704,产生的微指令通过微指令选择器707送给微指令生成器708进行进一步译码并输出到解码总线上。如果发生异常嵌套的话,异常信息又会缓冲到指令缓冲器703中。这样又一次异常处理开始了。其中rom_pc生成器705是一个二路选择器,负责从例外缓冲器702和指令缓冲器703中取相应的信息进行译码,其中例外缓冲器702的信息优先处理。微指令选择器707也是一个二二路选择器,负责从uROM 704和简单解码器706中选择微指令进行送给微指令生成器708。同样,uROM 704比简单解码器706的优先级要高。这是因为异常信息需要得到及时处理。按照这种译码器结构设计就可以处理复杂指令异常预处理时发生的异常嵌套。

以x86的处理器为例,在x86系列的处理器中有很多复杂指令,常见的如串拷贝指令,软中断int n指令,间接跳转指令等。这些指令所对应的微指令被存放在一块rom(如图1所示的ROM 103)中。译码部件从存储器中取得复杂指令后,会按照这种指令的操作码域和其它的相关域去索引这个rom,取出微指令给后端。后端包括重命名逻辑和发射部件。X86可见的通用寄存器有8个,即eax、ebx、ecx、edx、esi、edi、ebp、esp,对应于微指令的8个普通寄存器。另外,还为微指令集分配了24个临时寄存器。这24个寄存器用来缓冲各执行部件的运算结果,包括加法部件、乘法部件、除法部件、访存部件等。由于微指令执行时会对这32个寄存器产生数据相关,这种相关通过后端的重命名逻辑进行重命名,从而消除了假相关。重命名后的微指令被按序存放到指令重排序缓冲器中。指令重排序中的微指令有3种状态,空状态、映射状态、写回状态。当指令重排序中的某一项的状态为空时,表示这项可以存放一条微指令,只是目前没有被使用。映射状态表示当前的表项已经存放了一条微指令,这个微指令是从重命名部件发射过来,而且这条指令正在执行部件执行或正在记分板中等待发射,还没有运算结果产生。写回状态表示当前的指令在执行部件已经执行完毕,并且执行结果已经写到寄存器堆中,只等待处理器做最后的确认。

重排序缓冲器中微指令的提交是按序进行的,首先提交队列头的已经写回的微指令,提交的信息会发给重命名部件,重命名部件根据得到的提交信息去修改相应目标寄存器的状态信息。如果队列头的微指令附带了异常的话,提交信息无效,异常信息会送到译码部件和重命名部件,重命名部件对异常信息进行分析,然后取消所有曾经建立的依赖关系,译码部件则获取其中的异常矢量,把这个异常编码为一个特殊的指令,并记录发生的异常所在的指令地址,然后从rom中取相应的微指令执行,通过微指令得到跳转到的异常处理程序地址,在进行压栈、保存关键现场等预处理操作后,转入正式的异常处理程序。在异常处理程序执行完成后重新执行这条指令,此时第一个异常已经得到修复,不会再触发了,只可能触发下一个异常。如果再压栈,保存关键现场的过程中又发生了异常,译码部件缓冲获得的新矢量,继续缓冲此异常所在的指令地址,重新发出同样的微指令,此时唯一的区别是异常的编号变了,这个异常编号会作为一个微指令常量送到相应的微指令域中。此时,指令重排序缓冲区被清空,其它各种功能部件也都作了清除工作。同样,在第二层的异常预处理微指令中也要进行压栈、保存现场等操作,最后通过一条特殊的跳转指令跳到操作系统可见的例外处理程序。在例外处理程序返回后,从被中断的指令继续执行,这样由于在例外处理程序中已经对故障进行了修复,在遇到那个故障点就不会再发生异常了,而只会处理最顶层的那个异常。处理完毕后,顶层异常所对应的故障也得到修复,处理器继续往下执行。处理器是以如下的顺序执行异常处理的:在最深层次的异常处理程序执行完后,重新执行次深层次的异常处理程序,在次深层次的异常处理程序执行完后,重新执行再次深层次的异常处理程序,依此类推,最后执行最顶层次的异常处理程序。这种方法类似于排序算法中的深度优先遍历。

最后所应说明的是:以上实施例仅仅用以说明而非限制本发明的技术方案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解:依然可以对本发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利要求范围当中。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号