买专利,只认龙图腾
首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

【发明授权】针对事务型数据处理执行模式的调用堆栈维护_ARM 有限公司_201580037126.9 

申请/专利权人:ARM 有限公司

申请日:2015-06-09

公开(公告)日:2021-01-12

公开(公告)号:CN106663026B

主分类号:G06F9/46(20060101)

分类号:G06F9/46(20060101)

优先权:["20140715 GB 1412534.8"]

专利状态码:有效-授权

法律状态:2021.01.12#授权;2017.08.01#实质审查的生效;2017.05.10#公开

摘要:提供了一种数据处理装置和数据处理方法,其涉及依据执行的数据处理指令而维护调用堆栈的处理器的操作。处理器被配置为在数据处理指令寻求访问与其它处理器电路共享的存储数据项时在事务执行模式中操作。当处理器进入它的事务执行模式时,它存储当前堆栈深度指示的副本并且此后,当在事务执行模式中操作时,对调用堆栈的其它修改与存储的堆栈深度指示的副本进行比较。如果要求的修改的相对堆栈位置处于相对于存储的副本的正向堆栈增长方向,则对调用堆栈的修改被标记为非推测性的。相反,如果对调用堆栈的修改要在不处于相对于存储的副本所指示的位置的正向堆栈增长方向的相对堆栈位置处做出,则该修改被标记为推测性的。在处于事务执行模式中时与维护调用堆栈相关联的写集合的大小因此能够被减小。

主权项:1.一种用于数据处理的装置,包括:处理器电路,被配置为执行数据处理指令,其中,所述处理器电路被配置为依据它执行的所述数据处理指令来维护调用堆栈数据结构,并且其中,所述处理器电路被配置为:当执行的所述数据处理指令访问与其它处理器电路共享的存储数据项时,在事务执行模式中操作;以及事务前堆栈指针存储电路,被配置为存储所述调用堆栈数据结构的堆栈深度指示,其中,所述处理器电路被配置为在进入所述事务执行模式前存储所述堆栈深度指示,其中,所述处理器电路被配置为:当在所述事务执行模式中操作时,确定对所述调用堆栈数据结构的修改相对于所述堆栈深度指示的相对堆栈位置,并且如果所述相对堆栈位置处于相对于由所述堆栈深度指示所指示的位置的正向堆栈增长方向,则与所述修改相关联地存储所述修改是非推测性的指示,并且如果所述相对堆栈位置不处于相对于由所述堆栈深度指示所指示的位置的正向堆栈增长方向,则与所述修改相关联地存储所述修改是推测性的指示。

全文数据:针对事务型数据处理执行模式的调用堆栈维护技术领域[0001] 本公开涉及数据处理。更具体地,它涉及对于在数据处理处于事务执行模式中时使用的调用堆栈数据结构的维护。背景技术[0002] 数据处理器可被配置为依据它所执行的数据处理指令对调用堆栈进行维护,具体地数据处理器在遇到函数调用时把返回地址推送给调用堆栈,并且在函数结束时从调用堆栈中弹出该返回地址。在当代的数据处理装置中,提供不止一个数据处理器例如,处理器核因为它带来性能增强是常见的。然而,关于由这多个处理器执行的数据处理的某些约束因此必须被重视以确保由多个处理器执行的数据处理的结果是可预测的并且是确定性的。此情形的一个示例涉及由数据处理器在访问例如,存储在系统存储器中的数据结构时进行的事务执行,其中该数据结构被共享给系统中的至少一个其它数据处理器。此数据结构的共享意味着必须遵循某些协议以避免不同的数据处理器对共享数据结构做出并发修改所导致的数据冲突。数据处理装置中的每个数据处理器然后可被配置为:当操作于事务执行模式即,在正尝试对共享数据结构的访问但尚未成功完成访问的时段期间时,以推测性的方式更新调用堆栈,从而使得如果针对共享数据结构的事务执行没有成功地完成,则数据处理器能够丢弃推测性修改并且“回滚”至数据处理序列中最后已知的非推测点。发明内容[0003] 根据第一示例配置,提供了一种装置,包括:处理器电路,被配置为执行数据处理指令,其中处理器电路被配置为依据它所执行的数据处理指令来维护调用堆栈数据结构,并且其中处理器电路被配置为在执行的数据处理指令访问与其它处理器电路共享的存储数据项时在事务执行模式中操作;以及事务前堆栈指针存储电路,被配置为存储调用堆栈数据结构的堆栈深度指示,其中处理器电路被配置为在进入事务执行模式前存储堆栈深度指示,其中处理器电路被配置为当在事务执行模式中操作时确定对调用堆栈数据结构的修改相对于堆栈深度指示的相对堆栈位置,并且如果相对堆栈位置处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则与修改相关联地存储该修改是非推测性的指示,并且如果相对堆栈位置不处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则与修改相关联地存储该修改是推测性的指示。[0004] 根据另一示例配置,提供了一种装置,包括:用于执行数据处理指令的装置;用于依据所执行的数据处理指令来维护调用堆栈数据结构的装置,其中用于执行数据处理指令的装置被配置为在执行的数据处理指令访问与其它用于执行数据处理指令的装置共享的存储数据项时在事务执行模式中操作;以及用于存储调用堆栈数据结构的堆栈深度指示的装置,其中堆栈深度指示在用于执行数据处理指令的装置进入事务执行模式前被存储;用于当在事务执行模式中操作时确定对调用堆栈数据结构的修改相对于堆栈深度指示的相对堆栈位置的装置;以及用于存储与修改相关联的指示的装置,其中如果相对堆栈位置处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则该指示显示修改是非推测性的,并且如果相对堆栈位置不处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则指示显示修改是推测性的。[0005] 根据另一示例配置,提供了一种处理器设备中的数据处理方法,包括:执行数据处理指令;依据所执行的数据处理指令来维护调用堆栈数据结构;当执行的数据处理指令将寻求访问与其它处理器电路共享的存储数据项时进入事务执行模式;存储堆栈深度指示,其中堆栈深度指示在进入事务执行模式前被存储;当在事务执行模式中操作时,确定对调用堆栈数据结构的修改相对于堆栈深度指示的相对堆栈位置;以及如果相对堆栈位置处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则与修改相关联地存储该修改是非推测性的指示,并且如果相对堆栈位置不处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则与修改相关联地存储该修改是推测性的指示。附图说明[0006] 将仅通过示例方式参照附图中所示的本发明的实施例来进一步描述本发明,在附图中:[0007]图1示意性地描述一个实施例中的数据处理装置,其示出能够各自访问存储器中的共享数据结构的两个处理器核;[0008] 图2A示出了类似C代码的示例序列;[0009]图2B示意性地描述一个实施例中图2A的代码中的函数调用和返回如何对应至推送给调用堆栈和自调用堆栈中弹出;[0010]图2C示意性地描述在一个实施例中针对图2A的代码的调用堆栈的内容和增长;[0011]图3示意性地更详细描述一个实施例中调用堆栈的内容与图2A中示出的代码的执行相对应的演进;[0012]图4A示意性地描述一个实施例中的存储单元;[0013]图4B和4C示意性描述图4A的存储单元的示例性使用;[0014]图5示意性地描述一个实施例中的处理器核和相关联的LI缓存;[0015]图6示意性地描述根据一个实施例的方法所采取的一系列步骤;以及[0016]图7示意性地描述一个实施例中为了监测事务中止以及对事务中止做出反应而采取的一系列步骤。具体实施方式[0017] 根据第一示例配置,提供了一种装置,包括:处理器电路,被配置为执行数据处理指令,其中处理器电路被配置为依据它所执行的数据处理指令来维护调用堆栈数据结构,并且其中处理器电路被配置为在执行的数据处理指令访问与其它处理器电路共享的存储数据项时在事务执行模式中操作;以及事务前堆栈指针存储电路,被配置为存储调用堆栈数据结构的堆栈深度指示,其中处理器电路被配置为在进入事务执行模式前存储堆栈深度指示,其中处理器电路被配置为当在事务执行模式中操作时确定对调用堆栈数据结构的修改相对于堆栈深度指示的相对堆栈位置,并且如果相对堆栈位置处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则与修改相关联地存储该修改是非推测性的指示,并且如果相对堆栈位置不处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则与修改相关联地存储该修改是推测性的指示。[0018] 本技术的发明人已经察觉到尽管在处理器操作于事务执行模式时对调用堆栈的修改被标记为推测性的配置是安全的理由在于,在处理器进入事务执行模式时如果尝试的事务没有成功完成,这肯定将允许处理器把调用堆栈的状态“回滚”至它过去具有的配置,但是所产生的、数据处理器必须相对于对调用堆栈的推测性修改维护的数据集合的大小会变得不可取的大。本技术解决这一问题并且使得此数据集合的大小可被减小。[0019]因此,提供了事务前堆栈指针存储电路,该电路能够存储由处理器在它对调用堆栈的管理和维护中使用的堆栈指针所指向的堆栈深度的指示,此堆栈深度指示在处理器进入它的事务执行模式前被存储至事务前堆栈指针存储电路。注意,进入事务执行模式例如可源自处理器基于要访问的存储的数据项的标识是与其它处理器电路共享的标识而认识到这么做的需要,或者在另一示例中可源自明确的“开始事务执行模式”指令的执行,该指令把处理器切换至事务执行模式。在后一示例的上下文中,“结束事务执行模式”指令然后也可被用于把处理器切换出事务执行模式。[0020] 此外,处理器然后针对它此后在处于事务执行模式中时对调用堆栈做出的每次修改,确定该修改相对于事务前堆栈指针存储设备中存储的指示将发生在哪里。修改的这个相对堆栈位置具体是相对于调用堆栈的堆栈增长方向而确定的,将理解的是,此堆栈增长方向可被描述为“向上”或向下取决于调用堆栈的具体配置、调用堆栈朝向增大还是减小存储器地址的方向增长,等等。然后,当做出对调用堆栈的修改时,处理器确定修改的相对堆栈位置相对于由事务前堆栈指针存储设备的内容指示的位置是否处于正向堆栈增长方向。如果发现需要对处于正向堆栈增长方向的相对堆栈位置进行修改,则与对调用堆栈的修改相关联地存储指示此修改是非推测性的指示。相反地,如果确定修改的相对堆栈位置相对于由事务前堆栈指针存储设备的内容指示的位置未处于正向堆栈增长方向,则与对调用堆栈的修改相关联地存储的指示被设定为指示该修改是推测性的。将理解的是,这些与修改相关联地存储的推测性非推测性指示可例如仅包括被置位或者未被置位的位。[0021] 处理器必须与调用堆栈相关联地维护以便在处于事务执行模式时正确地管理对调用堆栈的一些修改的推测性性质的数据集合的大小因此可被减小,因为那些修改的子集实际上未被标记为推测性的,而是被标记为非推测性的,因为这样的修改会在处理器未处于事务执行模式中以及以其它方式不运行某一类型的推测性执行时做出。这基于以下实现是可能的:在事务执行模式中尝试的事务没有成功完成的情形中,如果处理器通过将调用堆栈的状态回滚至它在处理器进入事务执行模式时所具有的状态来对此进行处置,并具体地将堆栈指针重置为它在该数据处理阶段所具有的值,则在事务执行模式中在相对于事务执行模式进入的堆栈深度处于正向堆栈增长方向的位置处做出的对调用堆栈的修改可被简单丢弃,因为它们不具有对在进入事务执行模式时或者在此之前写入的任何调用堆栈内容进彳丁覆与的可能性。[0022] 事务前堆栈指针存储电路可以各种方式来配置,但在一个实施例中,事务前堆栈指针存储电路被配置为存储由处理电路用于调用堆栈数据结构的堆栈指针的副本。因此,例如如果当前堆栈指针被装置存储在处理器的寄存器中,则该寄存器的内容可被复制到事务前堆栈指针存储电路中。确实,在一些实施例中事务前堆栈指针存储电路自身包括处理电路可访问的寄存器。这样的寄存器可附加地被配置为不可被由处理电路执行的数据处理指令访问。换而言之,此寄存器对于编程者可以是透明的,从而使得它的内容不可被外部代理修改。[0023] 对调用堆栈的修改可包括推送和弹出。在一些实施例中,如果相对堆栈位置未处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向并且修改是到调用堆栈数据结构的推送,则通过该推送而推送给调用堆栈数据结构的数据项被标记为推测性写入。因此,由装置存储以反映推送操作的结果的一个或多个数据项因此被标记为正在被推测性写入。相反地,如果相对堆栈位置未处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向并且修改是自调用堆栈数据结构的弹出,则通过该弹出而从调用堆栈数据结构中弹出的数据项被标记为推测性读取。因此,先前由装置存储以反映调用堆栈内容的增加并且弹出现在正寻求从调用堆栈移出的一个或多个数据项被更新以指示它它们已经被推测性读取。还应当注意,如果调用堆栈仅可由它所从属的处理器电路访问并且不可由其它处理器电路访问,那么这样的标记为推测性读取通常是冗余的,因为就提供的任何一致性机制而言,该数据项或这些数据项的推测性读取不能影响其它处理电路。[0024] 处理器电路可被配置为在多个存储位置中维护调用堆栈数据结构。例如,处理器电路可在存储器中维护调用堆栈数据结构,其中与其它处理器电路共享的数据项被存储在该存储器中。然而,在一些实施例中,装置还包括存储电路,其被配置为存储由处理器电路在执行数据处理指令时在存储器中访问的数据项的本地副本,其中处理器电路被配置为在存储电路中维护调用堆栈数据结构。此存储电路被配置为存储由处理器电路在存储器中访问的数据项的本地副本,即,换而言之通常是缓存,并且通常将被配置为具有相对较小的存储容量。本技术可在包括处理器电路和相关联的本地缓存的装置的上下文中找到特别可应用性,因为这样的缓存可具有相对受限的存储容量。[0025] 当装置包括这样的存储电路时,存储电路可包括一致性控制单元,一致性控制电路被配置为允许存储电路中被指示为非推测性的内容被驱逐至存储器并且如果存储电路中的内容被选择进行驱逐并且被指示为推测性的则生成错误状况。一致性控制单元因此在数据处理的任何给定阶段管理什么内容应当被保持在存储电路中的确定,特别是鉴于存储电路例如,缓存可具有相对受限的存储容量的事实。因此,一致性控制单元能够允许存储电路中被指示为非推测性的内容被驱逐到存储器通常在新内容被要求存储在存储电路中的时候,该新内容由于存储电路配置被要求存储在有效内容已经被存储于其中的预定位置。如果此预先存在的有效内容被标记为非推测性的,则一致性控制单元允许这样的驱逐进行,然而如果它被标记为推测性的,则一致性控制单元生成错误状况。在处理器操作于事务执行模式的上下文中,这通常将代表阻止处理器电路继续进行所尝试的事务的发展,因为不能保证对调用堆栈的进一步推测性修改能够被存储在存储电路中,并且生成的错误状况然后可导致事务尝试中止。[0026] 然而如果在事务执行模式中尝试的事务成功地完成,则存储电路中的推测性内容能够被更新为非推测性的,因为相对应的改变代表已经成功发生的确定性改变。因此,在一个实施例中当处理电路退出事务执行模式并且在事务执行模式中执行的数据处理指令已经成功完成了它们的数据处理操作时,一致性控制单元被配置为把存储电路中被指示为推测性的内容改变为被指示为非推测性的。[0027] 一致性控制单元可被配置为向其它处理器电路隐藏存储电路中被指示为推测性的内容。这使得装置中提供的任何一致性介质不需要进一步确保存储电路的任何推测性内容相对于其他处理电路被安全地处置。例如,一致性控制单元可被配置为:如果其它处理电路指示它正在访问对应的内容,则回应以这样的内容当前未存储在存储电路中的通知。[0028] 在一些实施例中,装置还包括中止处置电路,中止处置电路被配置为在处理电路操作于事务执行模式中时响应于待定事务已经失败的指示而执行回滚过程,其中回滚过程包括丢弃被指示为推测性的任何修改并且使用存储的堆栈深度指示重置当前的堆栈指针。这样,如果处理电路没有成功地退出事务执行模式并且尝试的事务必须被再次尝试,则由处理电路执行的数据处理能够被回滚重置到事务执行模式启动的点,因此由处理电路用于引用调用堆栈的当前堆栈指针被重置为存储的堆栈深度指示的值,即堆栈指针在进入事务执行模式时所具有的值。[0029] 根据另一示例配置,提供了一种装置,包括:用于执行数据处理指令的装置;用于依据所执行的数据处理指令来维护调用堆栈数据结构的装置,其中用于执行数据处理指令的装置被配置为在执行的数据处理指令访问与其它用于执行数据处理指令的装置共享的存储数据项时在事务执行模式中操作;以及用于存储调用堆栈数据结构的堆栈深度指示的装置,其中堆栈深度指示在用于执行数据处理指令的装置进入事务执行模式前被存储;用于当在事务执行模式中操作时确定对调用堆栈数据结构的修改相对于堆栈深度指示的相对堆栈位置的装置;以及用于存储与修改相关联的指示的装置,其中如果相对堆栈位置处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则该指示显示修改是非推测性的,并且如果相对堆栈位置不处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则指示显示修改是推测性的。[0030] 根据另一示例配置,提供了一种处理器设备中的数据处理方法,包括:执行数据处理指令;依据所执行的数据处理指令来维护调用堆栈数据结构;当执行的数据处理指令将寻求访问与其它处理器电路共享的存储数据项时进入事务执行模式;存储堆栈深度指示,其中堆栈深度指示在进入事务执行模式前被存储;当在事务执行模式中操作时,确定对调用堆栈数据结构的修改相对于堆栈深度指示的相对堆栈位置;以及如果相对堆栈位置处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则与修改相关联地存储该修改是非推测性的指示,并且如果相对堆栈位置不处于相对于由堆栈深度指示所指示的位置的正向堆栈增长方向,则与修改相关联地存储该修改是推测性的指示。[0031]图1根据一个实施例示意性地描述了包括两个数据处理装置12和14的数据处理系统10。每个数据处理装置12、14分别包括处理器核16、18并且因此将认识到数据处理系统10是多核系统。每个数据处理装置12、14访问相同的系统总线20,它能够经由系统总线访问除了其它目标之外存储器22。尽管处理装置12和14二者具有相同存储器22的访问权,但是根据已知的存储器分配和控制技术,存储器22中可存在仅一个数据处理装置能够访问并且其它数据处理装置被阻止访问或者至少也许阻止修改的区域。然而,如同所示,存储器22包含共享数据结构24被存储在其中的至少一个区域,两个数据处理装置12和14均能够访问该共享数据结构24。此共享数据结构24例如可以是数据库,但是本技术绝不限于这样的示例。共享数据结构24可代表更简单的数据结构,确实原则上甚至可仅代表两个数据处理装置可访问的单个数据项。[0032] 两个数据处理装置12和14均能够访问存储器22中相同的共享数据结构24的事实对数据处理装置操作的方式施加了某些约束,以便确保当两个数据处理装置具体是它们各自的处理器核寻求访问相同的共享数据结构24在上面提到的共享数据库的上下文中,例如此共享数据库内的相同数据项时不出现冲突。为了避免这样的冲突,每个处理器核16、18被配置为在寻求访问共享数据结构24时进入事务执行模式。每个处理器核例如可通过参考页表中的信息、参考缓存一致性协议以及缓存中存储的跟踪结构、或者参考其他已知的跟踪和信令结构来识别何时所访问的数据项是与另一处理器核共享访问的数据项。可替换地或者附加地,明确的“开始事务执行模式”和“结束事务执行模式”指令可被用于把处理器切换至事务执行模式或者切换出事务执行模式。这样的事务执行模式是本领域技术人员已知的,但是本质上当在事务执行模式中操作时处理器核被约束为以更保守的方式访问存储器22,根据该更保守的方式当做出对共享数据结构24或者其一部分的访问时,处理器核首先必须寻求获取并且然后成功地获取对数据结构或数据项的锁定,该锁定被布置为使得一旦获取到,则它暂时属于的处理器具有对该数据结构或数据项的排他性访问直至锁定被松开。这确保各种类型的已知数据冲突不能够作为不止一个处理器同时访问相同的数据结构或数据项的结果而发生,其中作为处理器16和18访问以及具体地修改此共享数据结构的具体次序的结果,会出现针对作为整体的数据处理系统10的不同处理结果。[0033] 本文描述的当前技术具体涉及在处理器操作于它的事务执行模式的上下文中已经识别的问题以及处理器然后维护调用堆栈的方式,这是由数据处理设备用于存储返回地址以及可能的其他相关联的处理器状态信息的已知数据结构,从而使得处理器能够随着在它所执行的数据程序指令的序列中遇到的函数调用和函数返回而正确地导航至正确的存储器地址并且更新相对应的处理器状态信息。处理器核16和18为了实现本技术而被构造的方式的一个特征是每个处理器核分别在它具备的内部寄存器组26和28内置有附加寄存器,其中堆栈指针SP的副本能够被存储在其中,它使用堆栈指针来引用它正在维护的调用堆栈。此堆栈指针副本何时被存储在为此目的提供的专用寄存器30、32的进一步细节将在下面参考以下图示来更详细地描述。每个数据处理装置12、14还分别具有一级LI缓存34和36。这些LI缓存中的每一个被配置为缓存存储器22的内容的小子集以供它的相关联处理器核使用,从而使得当处理器核寻求访问存储器22的内容时,与经由系统总线20以及可能经由存储器等级的其他元件例如二级L2缓存未示出访问存储器22中存储的数据项相关联的延迟能够被较大地避免。每个LI缓存34、36被提供各自的控制单元38、40,该控制单元维护对缓存的总体控制并且具体在所示实施例中以将参考以下图示更详细地描述的方式进行配置来支持本技术。[0034] 图2A示出一些类似C的代码,代码描述了可由图1中所示的数据处理系统10中的处理器核16、18中的一者执行的数据处理指令的序列的结构。图2A中所示的代码是函数调用的相对简单集合,其中一些函数调用被嵌入到另一函数调用,例如函数f2O被嵌入到函数HO内,同时函数f4O被嵌入到函数f3O内,函数f3O自身被嵌入到函数flO内。对于本技术特别重要的是函数f2的定义,函数f2包括操作tbeginO,在此操作点处执行这些指令的处理器为了寻求对存储器中存储的数据结构或数据项的访问将进入它的事务执行模式。由此具体注意,事务执行模式的进入以及跟随的事务操作被抽象于库调用内。[0035] 为了正确地进行在图2A中所示的定义代码,执行这些指令的处理器维护调用堆栈,它在程序指令的序列中遇到的函数调用的返回地址被推送给该调用堆栈,并且此后当函数完成时从调用堆栈弹出,从而使得处理器能够正确地遵循由编程者定义的经编程的指令序列。[0036]图2B提供了当处理器执行图2A中所示的数据处理指令时到调用堆栈的推送和自调用堆栈的弹出的描述。因此,当处理器在函数HO中遇到函数f2时,返回地址ret_f2被推送给调用堆栈并且在函数f2O的结尾处此地址以及可能一些更多的配置数据被从堆栈中弹出。注意,此在函数f2O的结尾处的弹出在图2B中被示出为tx_pop,这指代此弹出发生于处理器处于事务执行模式中时的事实,如将在下文更详细地描述。类似地,当处理器后面在函数fIO中遇到函数f3O时,返回地址ret_f3被推送给调用堆栈tX_push。然而,注意在此之后在函数f3O内,当遇到函数f4O时,返回地址ret_f4也被推送给调用堆桟,但这在图2B中被标记为non_tx_push,这是因为将在下文更详细地描述此返回地址ret_f4被处置的具体方式不同于返回地址ret_f3被处置的方式。[0037]图2C示意性地示出调用堆栈的内容和发展,执行图2A中所示的指令的处理器随着它施行那些指令而对调用堆栈进行维护。如图2C中所示,调用堆栈具有在页面上向下的正向堆栈增长方向,尽管应当注意这不应当被解释为处理器用于维护调用堆栈数据结构的存储器地址的特定排序一一随着正向堆栈增长而增加存储器地址或者减小存储器地址同样能够很好地进行,这取决于具体实现方式。对本论述特别重要的是图2C的右侧示出的、与图2A中示出的代码内的具体点相对应的标记⑴、2、⑶和4。这些点指示调用堆栈在到达代码的特定阶段时在该点处具有的堆栈深度。[0038] 处理器通过堆栈指针SP来维护它对当前堆栈深度的认识,专用寄存器被提供用于堆栈指针。另外,处理器被配置为在它进入事务执行模式的点处即在图2A和2B中所描述的示例中当它遇到tbegin函数时存储SP的副本。在图1中所示的实施例中,此堆栈指针的副本被执行图2A中所示的指令的相应处理器核16、18存储在专用寄存器30、32中。此后,当处理器仍然处于它的事务执行模式中时,它在它修改调用堆栈时引用此存储的堆栈指针的副本并且确定对调用堆栈的修改相对于由该存储副本指示的堆栈深度位置是否处于正向堆栈增长方向。因此,参考图2C所示的描述,在低于由被指示为SPOtbeigin的深度所指示的深度的堆栈深度处对调用堆栈的修改被确定为相对于存储的SP值处于正向堆栈增长方向,而在高于此点的堆栈深度位置处对调用堆栈的修改不处于正向堆栈增长方向。执行图2A所示的指令的处理器置有相关联的LI缓存,该LI缓存的控制单元被配置为将形成调用堆栈数据结构的一部分并且被存储在LI缓存中的数据项标记为非推测性的或者推测性的取决于当处理器处于它的事务执行模式时对调用堆栈的修改是否发生于相对于SP副本寄存器中存储的堆栈指针值SPOtbegin处于正向堆栈增长方向的堆栈深度处。如果在相对于此SP副本值处于正向堆栈增长方向做出修改,则缓存控制单元把LI缓存中相对应的条目标记为非推测性的,而如果它未处于相对于此SP副本的正向堆栈增长方向,则相对应的数据项被标记为推测性的。[0039] 这在图2B中通过图示的虚线的垂直划分来示出,该虚线将图示中与处理器的事务执行模式相对应的部分划分为“tx_zone事务区”和“non_tx_zone非事务区”。因此,在“tx_zone”发生的对调用堆桟的修改被标记为推测性的,而在“non_tx_zone”中对调用堆桟的修改被标记为非推测性的。这能够进一步参考图2C来理解,其中可以看出:函数f2O的返回地址ret_f2在原理上将被函数f3的返回地址ret_f3覆写。然而,本技术认识到,因为处理器在操作于它的事务执行模式中时寻求施行的事务执行可能不能成功地完成,处理器回滚到它在遇到tbeginO指令时具有的它的执行状态从而再一次尝试该事务执行可能是必要的。注意,处理器在处于它的事务执行模式时尝试的事务可能因为多种原因而不能成功地完成,例如被动态触发因为另一处理器当前正在访问期望的数据项,或者被人工触发例如,由于图2A中的函数fl所示的tabortO调用。如果对调用堆栈的、涉及f3的返回地址ret_f3的添加的修改被允许确定性修改LI缓存中的对应条目,则此修改将会是永久性的,对应的数据项也会被暂时驱逐至存储器,并且处理器将无法把调用堆栈的状态回滚至用于重新执行tbeginO函数从而触发对执行所需要的事务的新尝试在事务执行模式中的正确状态。这是因为在图2C的图示中调用堆栈中高于点SPOtbeginI的内容将包含函数f3O的返回地址,而不是函数f2O的返回地址,因为后者将会被前者覆写。因此,处理器将不能够在后面正确地从函数f2返回,因为所需要的返回地址将不再可用。[0040] 本技术通过提供以下方式来解决此问题:在处理器处于事务执行模式中时发生的对调用堆桟数据结构的修改与存储的值SPOtbegin进行比较从而确定它们应当被标记为推测性的还是非推测性的。然而应当认识到,这不仅是确保对处于“tx_ZOne”S卩,图2C中示出的上部网格状区域中的调用堆栈的修改的推测性特性被正确地处置,而且还与处置non_tx_ZOneg卩,图2C的下部区域中显示的轻度阴影区域中的调用堆栈修改有关。此后一方面在这里特别重要,因为当处理器处于它的事务执行模式中时仅使得对调用堆栈的所有修改被标记为推测性的并且确实这是现有技术采取的方式是可能的,因为这也会确保在事务执行模式的未成功完成的情形中即,当所尝试的事务没有成功完成时,处理器也能够正确地回滚至tbeginO调用点处所需要的状态。然而,尽管在图2A的示例中仅示出数据处理指令的相对简单集合,使得相对应的调用堆栈的相对简单和有限演进被显示在图2C中,但是原则上不存在对于会被执行的数据处理指令的数量的任何限制,并且确实当处理器处于它的事务执行模式时做出了其它函数调用。如果对调用堆栈的所有这些对应修改仅被标记为推测性的,那么调用堆栈的管理会变得相当繁重,因为对调用堆栈的推测性修改在事务执行模式中和非推测性修改不在事务执行模式中二者的副本将不得不被维护,潜在地导致与事务执行模式相关联的相对较大的写集合大小。这在任何数据存储容量有限的数据处理系统中可能是重要的,但是在诸如图1中所示的实施例中可能特别重要,其中在第一实例中调用堆栈数据结构由处理器在它的相关联的LI缓存内进行维护,其中缓存的存储容量当然通常被视为相比于主存储器中的可用容量是更加受限的。因而,根据本技术,尽管处理器处于它的事务执行模式,对于处理器电路维护的调用堆栈数据结构的一些修改被标记为非推测性的。这具有以下结果:缓存中的这些条目能够被安全地驱逐至主存储器,而没有影响在所尝试的事务没有成功完成时处理器正确地回滚它的执行状态的能力。另外,虽然图1中所示的实施例中的一个处理器核可被准许查看由存储器22中存储的已提交的数据项表示的另一处理器核的调用堆栈,如果它不被允许查看与此处理器核相关联的LI缓存中标记为推测性的内容,那么数据处理系统10内执行的事务的正确原子性atomicity被维护。注意,在事务执行成功完成时,整个调用堆栈被配置为被标记为非推测性的非事务的并且这些缓存的数据项然后可被自由地驱逐至存储器22。然而,如上所述,在无论动态触发还是人工触发例如,由于f4O中的tabortO调用的中止的情形中,事务中已经被推测性地修改的所有存储器和架构状态被回滚至在tbeginO的调用处呈现的状态,并且在这样的场景中寄存器集合26、28中指向堆栈的任何寄存器将回滚至它们的先前值并且堆栈指针将被重置为在图2A和2C中示出的点⑴处获取的快照的值。[0041]图3示出了由执行图2A中所示的数据处理指令序列的处理器电路维护的调用堆栈的演进的更详细表示。阶段A表示遇到函数Π的点处的调用堆栈,其中堆栈指针SP然后指示返回地址ret_fl表示当前堆栈深度。此后在阶段B处当遇到f2函数时,返回地址ret_f2被推送给堆栈并且堆栈指针指示与此返回地址的位置相对应的当前堆栈深度。当在阶段C处遇到tbeginO调用时,注意堆栈指针已经在正向堆栈增长方向轻微地移动,这是由于在遇到tbegin指令自身前一些附加配置信息已经被添加至调用堆栈。然后这是装置在它的与进入事务执行模式相对应的SP副本寄存器30或32中存储的堆栈深度SP值。此后,处理器主要通过将此任务委派给它的LI缓存的控制单元把它对调用堆栈做出的进一步修改与在它的SP副本寄存器中存储的堆栈指针的值相比较,从而确定这些修改应当被标记为推测性的还是非推测性的。因此,在图3中的阶段D处当遇到ref_f2指令时,弹出调用堆栈内容以返回当前堆栈指针来指示函数flO的返回地址ret_fl被标记为推测性的。然而,如将在下文参考图4A至4C更详细地描述的那样,把对调用堆栈的弹出修改标记为推测性的可能不是必要的,因为这仅表示对于处理器的推测性读取,并且只要还确保另一处理器不能够访问与执行所示指令的处理器核相关联的缓存的内容,那么只要缓存中的此条目仅被标记为已经被推测性地读取并且也没有被推测性地写入则它实际上可被安全地驱逐至主存储器而没有损坏所要求的事务原子性。推测性写入实际发生于图3中遇到f3O函数的阶段E处,因为这发生于调用堆栈中的一相对堆栈位置,该相对堆栈位置未处于相对于存储的在tbegin处获取的SP快照的正向堆栈增长方向。因此,在缓存中做出的保持返回地址ret_f3的条目被标记为推测性的。相比而言,在阶段F处当遇到对于f4的调用时,要求把f4O返回地址ret_f4推送给调用堆栈的修改被标识为处于相对于SP快照的正向堆栈增长方向,从而在缓存中做出的保持此返回地址值的条目被标记为非推测性的。此后,在阶段G处当遇到tabortO调用时,缓存中的任何标记为推测性的内容被丢弃并且仅被标记为非推测性的内容被保留即,在实践中任何标记为推测性的缓存行被标志为无效并且调用堆栈数据结构因此潜在地根据被存储到LI缓存中以及另外存储到存储器分级体系内例如,来自主存储器22的内容的组合被重构为它在阶段C处当遇到tbegin调用时的状态,一些缓存内容可能已经被暂时驱逐至主存储器22。[0042]图4示意性地示出了一个实施例中的缓存50,图1中所示的LI缓存34或36可根据该缓存50来进行配置。LI缓存50包括控制单元52和多个缓存行54,数据可被存储在缓存行中。控制单元52维护对缓存50的总体控制并且管理对缓存行54的更新。另外它维护相对于在缓存50所属的数据处理器系统中发现的存储器系统的余下部分的正确一致性控制。因而,缓存50被置于处理器和存储器分级体系的余下部分之间,此存储器分级体系潜在地仅包括诸如图1中所示的主存储器22,并且还可包括其它缓存级别。缓存行54被示出以与返回地址ret_f2的存储相对应的示例条目,该返回地址已经在此数据行的内容中被标记为“已修改MO”,这指示此数据已经被处理器修改并且最终应当在存储器分级体系中的余下部分中具体地,如果此数据行被驱逐,则在主存储器22中进行更新。注意,此ret_f2的数据行未被标记为已经被推测性读取SR或者推测性写入SW,因为这表示在处理器进入它的事务执行模式之前已经发生的对调用堆栈的修改。[0043]图4B描述了图4A中所示的示例缓存行条目的后续演进,其中在已经被填充以返回地址ret_f2之后,处理器遇到函数调用f3,并因此把返回地址ret_f3推送给调用堆栈。随着它发生,在此所示示例中,针对返回地址ret_f2和ret_f3的存储器地址足够相似以使得它们均将被缓存50存储在相同的缓存行中。从而当ret_f3由处理器推送给调用堆栈时,缓存50的缓存控制单元52使得此返回地址ret_f3驱逐缓存行中的当前内容S卩,返回地址ret_f2。由于此具有内容ret_f2的缓存行未被标记为被推测性写入SW,它可被驱逐到存储器分级体系内,例如首先被驱逐到L2缓存并且潜在地然后被进一步驱逐到主存储器22中。返回地址ret_f3然后填充此缓存行并且被类似地标志以“MO”状态“已修改”,但还被标记为已被推测性写入SW,因为处理器现在处于事务执行模式并且此修改未发生于相对于在处理器遇到tbeginO调用时的点处获取的堆栈指针SP的快照的正向堆栈增长方向。此后,当事务中止通过处理器遇到指令tabortO时,由于此缓存行被标记为已经被推测性写入,它的内容被无效状态“I”。[0044] 把图4B所示的缓存行内容的演进与图4C所示的内容相比较,图4C示出了当到达图3中的阶段D时的缓存行为,其中函数f2O的返回地址ret_f2自调用堆栈中弹出并且另外此对于调用堆栈的修改未发生于相对于tbeginO处的SP的快照的正向堆栈增长方向,因此由于处理器处于事务执行模式这被视为推测性修改。因而,当此缓存行的内容返回至处理器时,缓存行然后被标记为已经被推测性读取SR。然而如上文提到的那样,只要缓存50的控制单元52确保缓存中的任何内容或者至少任何已修改的内容不能够被数据处理系统中的另一处理器读取,那么将缓存中的缓存行标示为推测性读取原则上并不需要。这例如可通过以下配置来施行:其中,控制单元52在施行所要求的系统级存储器一致性时,仅通过否认这样的内容当前在缓存50内以任何有效的状态存在来对作为一致性协议的一部分接收的关于此存储器地址的任何查询进行回应。[0045] 图5示意性地描述了示出一种配置的处理器核60和LI缓存62,图1中所示的对应组件可以根据该配置来进行配置。LI缓存62的缓存控制64被配置为从处理器核60接收各种信息并且向处理器核返回一些信息。具体地,缓存控制64从处理器核接收它当前正操作于的处理模式的指示,从而使得缓存控制64能够依据处理器核当前是否处于它的事务执行模式TEM来适当地管理LI缓存62的内容的更新。这不需要是连续信号,但是处理器核60可以仅向缓存控制单元64指示它何时改变执行模式。处理器核60还被提供以中止处置单元66,其被配置为向缓存控制器60指示事务中止例如,当处理器核遇到tabort调用时以及从缓存控制单元64接收中止指示例如,当LI缓存62中被标志为已经被推测性写入SW的内容被选择进行驱逐基于它的对应存储器地址二者。这是所尝试的事务应当被中止的情形,因为把此内容驱逐至存储器分级体系中的余下部分会把它暴露至由数据处理系统的另一部分读取并且这会潜在地损坏所尝试的事务的原子性。可替换地,也可通过确保当此缓存条目被驱逐至存储器分级体系中的另一部分时将此缓存条目标记为已经被推测性写入进行维护来解决此问题,但是这可引发额外的配置复杂度,该复杂度能够通过以下相对简单的机制来避免:在尝试驱逐被标志为已经被推测性写入的缓存条目时,中止该事务。不论事务中止的原因如何,中止处置单元这里被实施为专用电路,尽管该单元可以是处理器核60执行的数据处理指令内编程的专用中止处置例程然后使得寄存器68的内容回滚至它们在图3中的阶段C处S卩,当遇到tbeginO调用时的状态。具体参考本技术,这包括中止处置单元66用当初始遇到tbeginO时获取的、在SP副本寄存器72中存储的堆栈指针的快照来替换当前堆栈指针寄存器70中的内容。[0046]图6示意性地示出在一个实施例的方法中采取的一系列步骤。流程可被视为始于步骤100,其中处理器执行它的指令序列。在步骤102处,确定是否遇到事务开始指令例如,tbeginO。在不是此情形时,流程简单地循环回步骤100。一旦遇到这样的事务开始指令,则流程前进至步骤104,其中堆栈指针的当前值被存储到专用堆栈指针副本寄存器内并且此后在步骤106处处理器进入它的事务执行模式。然后在步骤108,处理器继续它的指令序列执行,这包括发起它寻求对于存储器中的共享数据项或共享数据结构的事务性访问。在步骤110处确定是否作为继续数据处理指令序列的一部分要求对调用堆栈的修改。如果不要求,则流程简单地循环回步骤108。然而,当要求这样的修改时,在步骤112处确定此对于调用堆栈的修改是否会发生于相对于由专用SP副本寄存器中存储的堆栈指针副本指示的堆栈深度的正向增长方向。如果此修改处于此正向增长方向,则流程前进至步骤114,其中做出对调用堆栈数据结构的修改,将缓存中的任何相对应的一个或多个条目标志为非推测性的。可替换地,如果所要求的对调用堆栈的修改在步骤112被确定为未处于相对于由堆栈指针副本指示的堆栈深度的正向增长方向,则流程前进至步骤116,其中做出对调用堆栈数据结构的修改并且缓存中的任何相对应的一个或多个条目被标志为推测性的。在步骤114或步骤116之后,流程前进至步骤118,其中确定所尝试的事务是否已经成功完成。如果尚未成功完成,则流程返回步骤108以进行事务执行模式中的继续执行。然而,一旦所尝试的事务成功完成,则流程前进至步骤120,其中处理器退出它的事务执行模式并且在步骤122处任何标记为推测性的缓存内容被更新以被标志为非推测性的。流程然后返回步骤100。[0047] 将要注意的是,图6中所示的一系列步骤不包括当中止所尝试的事务时采取的步骤,并且这样的步骤被示出在图7中,其中这些步骤可被视为当处理器处于它的事务执行模式时与图6中所示的那些步骤并行运行。处理器在它的事务执行模式中的指令执行由步骤130表示。在步骤132处,持续地检查是否已经发生事务中止。如果没有,则流程简单地循环回步骤130。然而,当事务确实中止时,流程前进至步骤134,其中被标志为推测性的任何缓存内容被无效。另外在步骤136处,当前堆栈指针从当处理器进入它的事务执行模式时的时间点处获取的堆栈指针的存储副本中更新即,回滚至堆栈指针的存储副本并且在步骤138处除了当前堆栈指针寄存器之外的寄存器的任何其它内容也被恢复,这些寄存器被要求把处理器的状态回复至当它进入它的事务执行模式时它所具有的状态。流程然后返回至步骤130以用于处理器保留在事务执行模式中并且再一次尝试事务。[0048]尽管本文已经描述了具体实施例,但是要理解的是本发明不限于此并且在本发明的范围内可以对其做出许多修改和添加。例如,在不脱离本发明的范围的情况下,可以做出从属权利要求的特征和独立权利要求的特征的各种组合。

权利要求:1.一种装置,包括:处理器电路,被配置为执行数据处理指令,其中,所述处理器电路被配置为依据它执行的所述数据处理指令来维护调用堆栈数据结构,并且其中,所述处理器电路被配置为:当执行的所述数据处理指令访问与其它处理器电路共享的存储数据项时,在事务执行模式中操作;以及事务前堆栈指针存储电路,被配置为存储所述调用堆栈数据结构的堆栈深度指示,其中,所述处理器电路被配置为在进入所述事务执行模式前存储所述堆栈深度指示,其中,所述处理器电路被配置为:当在所述事务执行模式中操作时,确定对所述调用堆栈数据结构的修改相对于所述堆栈深度指示的相对堆栈位置,并且如果所述相对堆栈位置处于相对于由所述堆栈深度指示所指示的位置的正向堆栈增长方向,则与所述修改相关联地存储所述修改是非推测性的指示,并且如果所述相对堆栈位置不处于相对于由所述堆栈深度指示所指示的位置的正向堆栈增长方向,则与所述修改相关联地存储所述修改是推测性的指示。2.如权利要求1所述的装置,其中,所述事务前堆栈指针存储电路被配置为存储由所述处理电路用于所述调用堆栈数据结构的堆栈指针的副本。3.如权利要求1或权利要求2所述的装置,其中,所述事务前堆栈指针存储电路包括所述处理电路可访问的寄存器。4.如权利要求3所述的装置,其中,所述寄存器被配置为不可由所述处理电路执行的数据处理指令访问。5.如权利要求1至4中任一项所述的装置,其中,如果所述相对堆栈位置不处于相对于由所述堆栈深度指示所指示的位置的正向堆栈增长方向并且所述修改是到所述调用堆栈数据结构的推送,则通过所述推送被推送给所述调用堆栈数据结构的数据项被标志为推测性写入。6.如权利要求1至4中任一项所述的装置,其中,如果所述相对堆栈位置不处于相对于由所述堆栈深度指示所指示的位置的正向堆栈增长方向并且所述修改是自所述调用堆栈数据结构的弹出,则通过所述弹出从所述调用堆栈数据结构中弹出的数据项被标志为推测性读取。7.如任一前述权利要求所述的装置,还包括:存储电路,被配置为存储由所述处理器电路在执行所述数据处理执行时在存储器中访问的数据项的本地副本,其中所述处理器电路被配置为在所述存储电路中维护所述调用堆栈数据结构。8.如权利要求7所述的装置,其中,所述存储电路包括一致性控制单元,所述一致性控制单元被配置为:允许所述存储电路中被指示为非推测性的内容被驱逐至所述存储器,并且如果所述存储电路的内容被选择进行驱逐并且被指示为推测性的,则生成错误状态。9.如权利要求8所述的装置,其中,所述一致性控制单元被配置为:当所述处理电路退出所述事务执行模式并且所述事务执行模式中执行的数据处理指令已经成功完成它们的数据处理操作时,把所述存储电路中被指示为推测性的内容改变为被指示为非推测性的。10.如权利要求7至9中任一项所述的装置,其中,所述一致性控制单元被配置为向所述其它处理器电路隐藏所述存储电路中被指示为推测性的内容。11.如任一前述权利要求所述的装置,还包括:中止处置电路,所述中止处置电路被配置为:当所述处理电路在所述事务执行模式中操作时,响应于待定事务已经失败的指示而执行回滚过程,其中,所述回滚过程包括丢弃被指示为推测性的任何修改并且使用存储的堆栈深度指示重置当前堆栈指针。12.—种装置,包括:用于执行数据处理指令的装置;用于依据执行的所述数据处理指令来维护调用堆栈数据结构的装置,其中,所述用于执行数据处理指令的装置被配置为:当执行的所述数据处理指令访问与其它用于执行数据处理指令的装置共享的存储数据项时,在事务执行模式中操作;用于存储所述调用堆栈数据结构的堆栈深度指示的装置,其中,所述堆栈深度指示在所述用于执行数据处理指令的装置进入所述事务执行模式前被存储;用于当在所述事务执行模式中操作时确定对所述调用堆栈数据结构的修改相对于所述堆栈深度指示的相对堆栈位置的装置;以及用于存储与所述修改相关联的指示的装置,其中,如果所述相对堆栈位置处于相对于由所述堆栈深度指示所指示的位置的正向堆栈增长方向,则所述指示显示所述修改是非推测性的,并且如果所述相对堆栈位置不处于相对于由所述堆栈深度指示所指示的位置的正向堆栈增长方向,则所述指示显示所述修改是推测性的。13.一种处理器设备中的数据处理方法,包括:执行数据处理指令;依据执行的数据处理指令来维护调用堆栈数据结构;当执行的所述数据处理指令将寻求访问与其它处理器电路共享的存储数据项时,进入事务执行模式;存储堆栈深度指示,其中,所述堆栈深度指示在进入所述事务执行模式前被存储;当在所述事务执行模式中操作时,确定对所述调用堆栈数据结构的修改相对于所述堆栈深度指示符的相对堆栈位置;以及如果所述相对堆栈位置处于相对于由所述堆栈深度指示所指示的位置的正向堆栈增长方向,则与所述修改相关联地存储所述修改是非推测性的指示,并且如果所述相对堆栈位置不处于相对于由所述堆栈深度指示所指示的位置的正向堆栈增长方向,则与所述修改相关联地存储所述修改是推测性的指示。

百度查询: ARM 有限公司 针对事务型数据处理执行模式的调用堆栈维护

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。