程序语句控制的指令流控制的制作方法

文档序号:6365854阅读:160来源:国知局
专利名称:程序语句控制的指令流控制的制作方法
技术领域
本发明的实施例提出了一种用于执行程序的设备,该设备具有计算单元和签名模块。签名模块是用于对程序在计算单元上的执行进行指令流控制的部件。本发明的其他实施例提出了一种签名模块,该签名模块被构造来以便在通过计算单元执行程序时基于给计算单元的程序语句(Programmanwei sung)来算出签名并且将该签名存放在签名模块的签名寄存器中。本发明的其他实施例提出了一种用于基于如下指令算出签名并且用于将该签名存放在签名模块的签名寄存器中的方法所述指令由计算单元在执行程序期间被执行。
背景技术
当程序(软件)在计算单元(硬件)上被执行时,则通常期望该程序实际上也如曾由编译器在编译时所设置的那样被执行。然而,实际上,程序或代码的执行偏离最初规划的程 序流程。对此有责任的例如是硬件中的故障、干扰信号或者也是在计算单元上的有针对性的、恶意的操纵。硬件中的故障例如可以归因于不期望的线路短路、线路中断或者悬置的(haengend)开关元件(所谓的“固定故障(stuck-at fault)”),以便列举一些常常出现的类型的硬件故障。干扰信号可以在计算单元工作期间例如由于电磁场或者也以在针对计算单元所设置的温度范围之外的极端温度的形式而出现。对硬件的恶意操纵例如可以通过使所选择的接触部短路、线路中断或者对计算单元和/或连接到计算单元上的存储器的激光照射而实现。所列举的故障类型例如在计算单元本身之内、在存储有程序的存储器之内、在包括计算单元的系统的其他部件之内或者在计算机系统的部件之间的电连接中出现。为了在执行程序期间检测到这样的故障,可执行指令流控制。针对指令流控制的目的,通常在程序制订(Programmerstellung)期间算出校验值(Pruefwert),所述校验值由给计算单元的程序的指令得到。例如,指令的操作码(Opcode)可以被加起来,以便以这种方式形成校验和。在通常从程序开始直至程序结束包括所有位于其间的指令在内地被执行的线性程序中,因此可以算出唯一的校验和(或俗称校验值),所述唯一的校验和可以在程序结束处或者在程序结束之后被校验。针对该检验,与通过计算单元执行每个指令并行地用特定寄存器的内容结清(例如以作为位模式存在的opcode为形式的)该指令的值,例如将该指令的值加到寄存器内容上或者与寄存器内容逐位地进行异或运算(X0R)。一旦所有指令值以这种方式在特定寄存器中被考虑,则特定寄存器的所得到的值与参考校验值进行比较,以便确定在两个值之间是否存在一致性。如果存在一致性,则通常可以以程序的有序(ordnungsgemaess)执行为出发点,即程序曾实际上如在程序制订的时刻曾被规划的那样被执行。参考校验值例如可以作为常数被存放在程序代码中。根据曾以何种方式和利用何种编程语言制订程序,参考校验值可以被编译器(“compiler”)算出并且被写入到程序代码中。常常,程序在程序流中具有分支,这些分支也可以被视为“有条件的转移”。按照分支,程序可以在至少两个路径上继续,其中只有在程序运行时通过分析条件才得到关于两个或可能更多的路径中的哪个路径被选择的判定。应注意的是,具有多于两个的可能的分支路径的分支点通常能被分解成基本的分支点,即分别仅具有两个可能的分支路径的分支点。对于在程序运行期间所算出的值,这意味着该值取决于哪个路径曾多频繁地被通过。为了例如临近程序结束时或者在该程序流程之内的其他点处可以执行当前校验值与针对该点所限定的参考校验值之间的比较,存在将可被通过的不同路径之内的校验值彼此对准的可能性。这可以以如下形式来实现编译器将一个或多个对于程序流程本身多余的指令嵌入到路径中,所述指令改变校验值来使得所述的路径在与另一路径的聚集点处具有与所述另一路径相同的校验值。除了在程序之内出现的并且由程序的代码所限定的分支点之外,也会发生的是,程序的执行暂时被计算单元中断,以便执行或继续另一程序。这样的中断用英语术语“interrupt”来标识。在对程序编程时对于计算机系统和类似系统比较常使用的另一可能性在于,确定的程序调用在另一程序(例如程序库(“software library (软件库)”))中存在的函数。由于在程序库中限定的函数或子函数通常并不与主程序共同被编译,所以通常不可能在主程序的校验值算出中将子函数包括在内。如果针对子函数或子程序也要执行指令流控制,则子函数可以利用自己的校验值单独地被测试。子程序的校验值因此与主程序的 校验值无关。与计算单元从对主程序的处理到对子程序的处理的转变或者相反的转变有关联地出现的故障常常未被发现。

发明内容
在此所公开的技术教导的实施例提出了一种用于执行程序的设备,所述设备具有计算单元和签名模块,其中签名模块被构造来基于指令算出签名并且将该签名存放在签名寄存器中。在通过计算单元执行程序时,可出现对中断例程或者子函数的调用。在本上下文中,用于执行程序的设备被构造来以便当对中断例程进行调用时,借助中断例程的程序语句从签名模块中读出并且存储与所中断的程序相关的签名,并且在离开中断例程之前借助中断例程的程序语句将所存储的签名写入签名寄存器中。附加地或者可替换地,用于执行程序的设备可以被构造来以便当对子函数进行调用时,在调用子函数之前借助引起签名的相对改变的程序语句将签名寄存器中的签名与子函数的签名相适配,并且在从子函数返回之后借助另一引起签名的相对改变的程序语句使签名寄存器中的签名与从其曾进行子函数调用的程序段的签名相适配。所公开的技术教导的至少一个目标是借助指令签名保护程序流免受故障侵袭或者也免受随机故障影响,尤其是在确定的程序结构的情况下免受故障侵袭或者也免受随机故障影响。尤其是安全控制器是针对恶意的故障侵袭的经常的目标,但是其他类型的计算机系统和/或计算单元也遭受这样的故障侵袭。如前面所提及的那样,指令签名的基本原理是,在程序运行时将校验和(签名)中的所执行的指令加起来并且在预先给定的位置处相对参考值对这些所执行的指令进行校验。为了保护嵌套的函数或中断例程(英语为!“interrupt routine”或“interruptservice routine (ISR,中断服务例程)”),迄今在硬件中采用自动的堆栈存储器机制(“stacking”),以便在调用函数或中断例程时保护签名值。由于需要使用自动的堆栈存储器,所以迄今的方法常常要求现有标准处理器(譬如基于ARM架构的处理器)中的架构改变,以便可以实施跨函数调用的指令流控制。堆栈存储器访问此外可导致更低的性能。要注意的另一点是,存储器并且尤其是所谓的“随机存取存储器”(RAM, random access memory)是嵌入式系统上的有限资源并且由于签名而因此附加地载荷。在此所公开的技术教导涉及用于指令签名的方法和设备的技术领域,该技术教导在没有(也用于中断和子函数的)自动的硬件堆栈存储器机制的情况下对于指令签名处理的目的而言也能胜任。然而,基本上在此所公开的技术教导并不排除使用这样的硬件堆栈存储器机制。根据在此所公开的技术教导,不仅与中断例程的调用有关联地而且与子函数的调用有关联地借助程序语句来控制随之而来的对签名或签名寄存器的重配置,使得硬件相关的堆栈存储器使用可以被避免。借助程序语句(即受软件控制地)对存放在签名寄存器中的签名进行访问。根据程序语句的目的和类型,对签名寄存器的访问可以是(中间)存储签名、(回)写签名或者是更新签名(为了对准签名)。其他形式的涉及签名的数据处理同样基本上 是可设想的。根据另外的实施例,用于执行程序的设备此外还可以被构造来在执行所调用的中断例程或者所调用的子函数期间执行对签名的检验。在所调用的中断例程或者所调用的子函数的范围中对签名的检验可以用于确定是正确地调用中断例程还是正确地调用子函数,即例如以提供到中断例程或者子函数中的进入保护(Einsprungschutz)。尤其是与子函数有关联地可设想的是,计算单元和/或程序存储器曾被操纵来使得不是调用按规划的子函数而是调用另一子函数,由此对于潜在的侵袭方会得到进一步的操纵可能性。然而,通过早期检测到有故障的进入到子函数中可以防止或者减小这样的操纵可能性。根据实施例,用于执行程序的设备此外还可以被构造来借助程序语句保护在调用中断例程或者子函数的时刻执行的例程的签名模块的状态和/或激活针对中断例程或子函数的签名算出。此外,用于执行程序的设备可以被构造为在离开中断例程之前或者当进行从子函数返回时,借助程序语句恢复在调用中断例程或者子函数的时刻所执行的例程的签名模块的状态。对在调用中断例程或者子函数的时刻所执行的或曾执行的例程的签名模块的状态的保护和恢复是对硬件堆栈存储器使用的替换方案。此外,对于软件开发者而言,相比于利用纯硬件支持的签名管理方法所实现的那样呈现出影响签名模块管理的更多且更为灵活的可能性。根据其他实施例,在进行调用子函数之前,签名可以通过相对应的程序语句被更新用于使签名适配,使得在有序调用子函数时使在调用子函数时的签名与和子函数的起始相关的起始参考签名相一致。这是前面已经提及的到子函数中的进入保护的可能的扩展方案。根据其他实施例,签名可以通过相对应的程序语句被更新以使签名适配,使得在从子函数有序返回到程序或到在调用子函数的时刻所执行的例程时,将在该程序的所限定的点处的签名与该程序的和该所限定的点相关的参考签名相一致。以这种方式可以提供从子函数返回到程序的相对可靠的退出保护(Aussprungschutz )。所限定的点例如可以被设置紧接在从子函数返回到该程序的返回点之后,使得紧接在执行返回之后可以确定该返回曾经是否正确。根据其他实施例,可与从子函数的返回相关有终止参考签名值(Endreferenzsignaturwert),在有序执行子函数时在签名寄存器中的签名与该终止参考签名值相一致并且该终止参考签名值也与在进行调用的程序段中的作为参考签名值的返回目的地(Ruecksprungziel)相关,其中在签名寄存器中的签名在返回时保持不变并且由进行调用的程序段进行检验,或者借助签名的相对改变被更新,使得在进行调用的程序段中的一点处使在有序执行时的所得到的签名值与和在进行调用的程序段中的该点相关的第二参考签名值相一致。根据其他实施例,起始参考签名值和/或终止参考签名值可以作为子函数的名称或者地址的函数被导出。根据其他实施例,起始参考签名值和/或终止参考签名值可以随机、成对地不同地、针对函数组相同地或者针对所有函数分别相同地被选择。函数组例如可以包括多个函数,这些函数用于类似的目的(例如执行确定的类似算出、访问确定的数据源等等)或者满足其他类似标准(例如程序库的归属性等等)。函数分组的标准也可以由程序员预先给定。根据实施例,用于执行程序的设备此外还可以被构造为,在中断例程或者子函数的上下文中借助程序语句更新签名,使得在有序执行中断例程或者子函数时使在中断例 程或者子函数的所限定的点处的签名与和中断例程或者子函数的该所限定的点相关的参考签名相一致。根据在此所公开的技术教导而设置的借助程序语句影响签名或签名寄存器的可能性呈现出如下可能性将在中断例程或者子函数之内的签名算出引入(mitaufnehmen)到对进行调用的例程或程序的签名处理中。根据其他实施例,对子函数的调用可以以间接函数调用的形式来进行。签名的适配可以包括基于子函数的唯一的标识符来确定更新值和借助更新值修改签名。在间接函数调用的情况下会发生,只有在程序运行时才判定可能的多个函数中的哪个函数要被调用,或要调用的函数究竟被存储在何处。这也影响签名算出,因为同样只有在运行时才可以判定以何种方式要适配签名、也就是签名要适配何值,以便该签名在进入到间接调用的函数时与在间接调用的函数之内所限定的参考签名相一致。根据实施例,间接调用的子函数的唯一的标识符可以以如下内容中的至少一个
-子函数的存储器地址,
-子函数的名称,
-标识符的相关性映射(Zuordnungsabbildung)的结果,
-在标识符的相关性表(Zuordnungstabelle)中的条目,以及 -对于所有间接调用的函数都是相同的固定常数,
为基础。在程序运行时,所述的数据与子函数唯一地相关,必要时也已经事先相关。由于基于唯一的标识符确定更新值,所以利用该信息可以修改签名,使得该签名与间接调用的函数的起始签名相一致,至少在有序的程序流程的情况下相一致。根据其他实施例,确定更新值可包括对更新值映射的分析和对更新值表的分析中的至少一个的分析。在前一段中涉及间接调用的子函数的唯一的标识符期间,此处指的是签名的实际更新值,该签名的实际更新值负责使在程序流程之内的确定的点处的签名与分配给该点的参考签名相一致,而与在一个或多个分支点处执行何种程序路径无关。因为在用于选择的程序路径中执行的指令在编译时常常是已知的,所以可能的是,确定更新值映射或更新值表,唯一的标识符(或者由此导出的变量)作为自变量被引入所述更新值映射或所述更新值表。根据其他实施例,签名模块可包括签名寄存器。根据其他实施例,签名模块可以包括用于提供被存放到签名寄存器中的签名的签名算出单元。通常,存储在签名寄存器中的签名值根据确定的计算规则与新指令值链接。计算规则可以包括将所存储的签名寄存器内容与新指令值借助算术运算(例如加法、乘法)或者有限主体中的运算(例如循环码、多项式除法)进行链接 。根据实施例,签名模块可以包括用于从计算单元接收中断信息的与计算单元的中断信息接口和用于设置签名算出单元的活动状态的中断信息分析单元,使得签名算出单元在存在中断信息的至少一个第一条件的情况下是活动的,而签名算出单元在存在至少一个第二条件的情况下是不活动的并且签名寄存器在相对应的不活动时间段中保持最后被算出单元所确定的签名。当签名算出单元是活动的时,在执行中断例程期间基于中断例程的程序语句算出签名并且将该签名存放在签名寄存器中。签名模块通过中断信息接口获得关于何种中断例程目前被计算单元执行的信息。签名模块因此可以校验针对该中断例程是否要执行签名算出,这可以取决于签名模块当前处于哪个状态下。如果由计算单元传送的中断信息在至少一个第一条件方面与签名模块的状态相一致,则签名模块要执行签名算出并且与此相应地是“活动的”。此外,签名模块是不活动的,即不执行签名算出。要注意的是,所提及的至少一个第二条件必要时可以是与所述至少一个第一条件互补的条件。所公开的技术教导可以实现根据所调用的/运转的中断例程可以将所基于的硬件(处理器)的例外条件(“例外(exc印tion)”或“陷阱(trap)”)与不同的配置以例外条件精细的方式相关。这例如可以是特定的权利或者也可以是确定的硬件元件的激活/去激活。所公开的技术教导因此是对中断例程的一般转换的替换方案,该替换方案以相同的方式和方法适用于所有中断例程。所公开的技术教导能够实现中断精细的硬件配置。由此可能的是,节约了费事的软件重配置或提出了此外不可能或不可能如此简单地实现的应用场景。所公开的技术教导利用了例外/中断标识符、如陷阱级(Traplevel)或者中断级(Interruptlevel),以便与此有关地从多个硬件配置中选择一个。这些配置可以固定地被预先给定或者也可以是软件可编程的。所选择的配置接着对要执行的中断例程有影响。所公开的技术教导可以被使用,以便利用该技术教导也在具有中断能力的处理器系统中实施指令流签名,而不必干预这些处理器系统的如堆栈存储器管理(堆栈管理)那样的架构。为此,签名模块可以以软件可编程的方式与确定的中断例程相关。只有当该例程是活动的时,签名算出才运转。一旦离开或中断该例程,该签名算出就停止,而一旦返回转移(zurueckspringen)到该例程中,该签名算出就又起动。通过改变签名资源的模块相关性和模块管理,这样从简单的签名模块变成完全具有多线程能力地可使用的模块。在此要注意的是,术语“中断例程”并不排除基本任务。刚刚所阐述的事实情况也可以以如下方式来描述。在迄今的解决方案中,在出现中断时将签名自动地(由计算单元)置于堆栈上。根据所公开的技术教导,指令签名的算出分别可以针对仅一个或多个确定的中断号而被激活。在出现中断时,通常出现当前中断号的改变。由此导致,在出现中断时隐含地将签名算出关断(因为计算单元的中断号不再与签名模块的中断号相一致)。在从中断返回时,接着实现(由计算单元促使的)到原始中断号的转换并且因此又激活算出。与在中断中完全关断签名算出的实施方案相比,根据所公开的技术教导的设备或方法可以处理嵌套的中断。这如下地起作用在中断之内,可以首先将当前签名值保护在局部变量中并且紧接着可以针对当前中断号激活签名算出。在中断结束时,接着该签名算出被去激活并且所保护的值被修复。该实施方案可以在任何时刻被另一中断所中断,而不出现签名问题。如果接通/关断并非隐含地基于中断号来发生,而是简单地仅硬接通或者关断,则这是不可能的。对此的原因在于,在嵌套的中断的情况下,在前的中断的状态并不能够可靠地受保护。此外,在中断时,被中断的签名值或接通信号的修复在未隐含结合到中断号的情况下通常是不可能的(当例如签名曾在中断的时刻被接通时,签名恰好在返回时又必须被激活。该签名不允许已被中断例程早于例如中断的最后指令而被激活)。所公开的技术教导的其他实施例提出了一种签名模块,该签名模块被对准,以便在通过计算单元执行程序时基于给计算单元的程序语句算出签名并且将该签名存放在签名模块的签名寄存器中,其中签名模块包括算出单元(Berechnungseinheit)、中断信息接口和中断信息分析单元。算出单元被构造用于基于在计算单元上所执行的程序语句生成签名值。中断信息接口被构造用于从计算单元接收中断信息。中断信息分析单元被构造用于 基于中断信息确定算出单元的活动状态,使得算出单元在满足中断信息的至少一个第一条件时是活动的,以便在执行中断例程期间基于中断例程的程序语句计算签名并且将该签名存放在签名寄存器中,以及在满足至少一个第二条件时,算出单元是不活动的并且签名寄存器保持最后由算出单元所确定的签名。根据其他实施例,中断信息可以包括中断标识符,该中断标识符说明哪个中断当前在计算单元上被执行。根据其他实施例,中断信息分析单元可以包括标识符寄存器,在所述标识符寄存器中可以存储有经配置的中断标识符,该经配置的中断标识符说明对于带有相对应的中断标识符的当前中断例程而言,算出单元是活动的。标识符寄存器例如可以借助程序语句而是可配置的,使得与确定的中断例程有关联地可以判定,对于该中断例程而言是否要执行签名算出。在该情况下,中断例程可以将其自己的中断标识符写入标识符寄存器中,即相对应地重配置标识符寄存器。中断标识符大多在计算单元的接口上是可支配的,使得就此而言不需要改变计算单元或处理器。根据其他实施例,中断信息分析单元可以包括用于将中断标识符与经配置的中断标识符进行比较的比较器。根据其他实施例,标识符寄存器可以被配置来存储算出单元的经配置的活动状态,所述经配置的活动状态在确定算出单元的活动状态时被考虑。可替换地,经配置的活动状态也可以被存储在签名模块的另一存储元件中。经配置的活动状态可以被理解为一类活动标志。根据其他实施例,签名模块可以包括用于借助程序语句来配置标识符寄存器的配
置接口。根据可替换的实施例,签名模块如前面所述地那样被构造,以便在通过计算单元执行程序时基于给计算单元的程序语句算出签名并且将该签名存放在签名模块的签名寄存器中。签名模块在该情况下包括用于基于在计算单元上所执行的程序语句生成签名值的算出单元,并且包括用于从计算单元接收至少一个指令信息的指令信息接口,所述至少一个指令信息说明当前由计算单元所执行的指令直接还是间接地做出反应。基本上,也可能的是,在进入点处(即在转移/函数调用的目的地点处)执行签名更新。为了提供提高的安全性,签名更新可以在此处与该位置是直接还是间接地做出反应有关地进行。因此,可以保证间接的进入目的地实际上仅间接地做出反应,而直接的进入目的地实际上仅直接地做出反应。指令信息接口用作在计算单元与签名模块之间的通信装置(的部分),通过该通信装置通知,当前在计算单元中执行的命令是直接还是间接地做出反应,或该通信装置通知,如下指令是直接还是间接地做出反应。该信息被签名模块记录,以便影响签名算出和/或附加地保护签名算出。此外,签名模块可以被构造来以便在签名算出中考虑通过指令信息接口提供的信
肩、O鉴于方法方面,所公开的技术教导的实施例提出了一种用于基于指令算出签名的方法,所述指令由计算单元在执行程序期间被执行。该方法也被设置用于将签名存放在签名模块的签名寄存器中,其中在通过计算单元执行程序时可以出现对中断例程或者子函数 的调用。该方法包括
当接收到中断请求时,从签名模块中借助与中断请求相关的中断例程的程序语句读出与所中断的程序相关的签名,
借助中断例程的程序语句存储该签名,以及
在离开中断例程之前借助中断例程的程序语句将所存储的签名写到签名模块中。可替换地或者附加地,该方法可以包括如下动作当对子函数进行调用时在调用子函数之前借助引起签名相对改变的程序语句使签名寄存器中的签名与子函数的签名相适配,以及
在从该子函数返回到程序的从其中进行子函数调用的程序段之后,借助其他的引起签名相对改变的程序语句来使签名寄存器中的签名与该程序段的签名相适配。根据实施例,该方法此外还可以包括在执行所调用的中断例程或者所调用的子函数期间检验签名。根据实施例,该方法此外还可以包括
针对在调用中断例程或者子函数的时刻所执行的例程借助程序语句来保护签名模块的状态;以及
在离开中断例程之前或者当返回到子函数时借助程序语句来恢复在调用中断例程或者子函数的时刻所执行或曾执行的例程的签字模块的状态。根据实施例,该方法此外还可以包括激活中断例程或者子函数的签名算出。根据实施例,当进行从子函数的返回时,签名通过相对应的程序语句被更新用于使签名适配来使得在从子函数有序返回到程序时,在该程序的所限定的点处的签名与该程序的和所限定的点相关的参考签名相一致。根据其他实施例,在从子函数返回之后,签名通过相对应的程序语句被更新用于相对改变签名来使得在从子函数有序返回到程序时,在该程序的所限定的点处的签名与该程序的和所限定的点相关的参考签名值相一致。根据其他实施例,从子函数的返回可以与终止参考签名值相关,签名寄存器中的签名在有序执行子函数时与该终止参考签名值相一致并且该终止参考签名值也与在进行调用的程序段中的作为参考签名值的返回目的地相关,其中签名寄存器中的签名在返回时保持不变并且由进行调用的程序段借助签名的相对改变来更新,使得在进行调用的程序段中的点处使得到的签名值在有序执行时与和在进行调用的程序段中的该点相关的第二参考签名值相一致。起始参考签名值和/或终止参考签名值可以作为子函数的名称或者地址的函数被导出。可替换地,起始参考签名值和/或终止参考签名值可以随机地被选择或者针对所有函数分别是相同的。根据其他实施例,签名的更新可以在中断例程或者子函数的上下文中借助程序语句来进行,使得在有序执行中断例程或者子函数的情况下使 在中断例程或者子函数的所限定的点处的签名与和中断例程或者子函数的所限定的点相关的参考签名值相一致。
根据其他实施例,可以以间接的函数调用的形式进行子函数的调用,并且签名的适配包括基于子函数的唯一的标识符来确定更新值和借助更新值修改签名。间接被调用的子函数的唯一的标识符可以基于如下内容中的至少一个
-子函数的存储器地址,
-子函数的名称,
-标识符的相关性映射的结果,
-标识符的相关性表中的条目,以及 -对于所有间接调用的函数都是相同的固定常数。更新值的确定可以包括对更新值映射的分析和对更新值表的分析中的至少一个的分析。根据其他实施例,该方法此外还可以包括通过签名模块的中断信息接口从计算单元接收中断信息;设置签名算出的活动状态,使得签名算出在存在至少一个第一条件时是活动的并且签名算出在存在至少一个第二条件时是不活动的;以及如果签名算出是不活动的,则在相对应的不活动时间段上保持最后所确定的签名。根据其他实施例,该方法此外还可以包括分析中断标识符,该中断标识符说明在计算单元上当前执行何种中断。根据其他实施例,该方法此外还可以包括将经配置的中断标识符存储在中断信息分析单元的标识符寄存器中,其中经配置的中断标识符说明,对于具有相对应的中断标识符的当前的中断例程,签名算出是活动的。根据其他实施例,该方法此外还可以包括将中断标识符与经配置的中断标识符进行比较,以便从比较的结果中推断出签名算出的活动状态。根据其他实施例,该方法此外还可以包括存储签名算出的经配置的活动状态,所述签名算出的经配置的活动状态在确定签名算出的活动状态时被考虑。根据其他实施例,该方法此外还可以包括借助程序语句配置标识符寄存器。根据其他实施例,该方法此外还可以包括在存储与被中断的程序相关的签名之前接收中断请求并且执行相对应的上下文转变(Kontextwechsel )。在此所公开的技术教导的其他实施例提出了一种带有程序代码的计算机程序,用于当计算机程序运转在计算机上时执行前面所限定的方法。所公开的技术教导的其他实施例提出了一种用于制订前面所提及的计算机程序的方法。用于制订计算机程序的方法例如可以是用于从源文本将计算机程序编译或者翻译成机器代码的方法。所公开的教导的另一实施例涉及相对应的编译器。鉴于与子函数和/或从子函数的返回有关联的特征,要指出的是,如“当进行子函数的调用时”或者“当进行从子函数的返回时”这样的表述不一定要被理解为时间说明(Zeitangabe),而是更确切地说表达在两个事件之间的一般关系。因此,通过所提及的表述进一步详细说明的事件或者动作也可以在调用或返回之前或者之后进行一些指令。作为用于使动作或者事件容许地远离调用或者 返回的条件,必要时可以考虑如下陈述在动作或事件与调用或返回或在进行调用的函数中的返回的目的地之间,程序要线性地运转,也就是说,不包括分支点、聚集点和/或可选路径。


以下参照所附的附图更为详细地描述了本发明的实施例。其中
图I示出了用于执行程序的具有计算单元和签名模块的设备的示意性方框电路 图2示出了直接的子函数调用的示意 图3示出了间接的子函数调用的示意 图4示出了根据所公开的技术教导的另一实施例的用于执行程序的设备的示意性方框电路 图5示出了中断请求和关联的返回的示意 图6A、6B示出了类似于图5的示意图,然而具有两个中断请求和两个分别关联的返
回;
图7A、7B示出了用于处理中断请求和与此有关联的用于签名算出的动作的示意性流程图;以及
图8示出了根据所公开的技术教导的实施例的用于算出签名的方法的示意性流程图。
具体实施例方式在以下参照所附的附图阐述实施例之前,要指出的是,相同的元件或相同功能的元件被配备有相同的或者类似的附图标记并且省去了对这些元件的重复描述。具有相同的或者类似的附图标记的元件的描述因而彼此是可互换的。通过在此所公开的技术教导能够实现的是,存在到子函数中的完整的进入/退出保护并且可以将指令签名使用在中断中,而为此不必存在硬件堆栈。该教导因而适于给现有的处理器(譬如具有ARM架构的处理器)配备指令机制而不改变架构。在不使用硬件堆栈存储器机制(即没有硬件堆栈地)借助指令签名保护程序流时,尤其是对子函数调用、对间接转移和对中断(“interrupt”)的保护是重要的(von Relevanz)。以下举出针对这些关键点以及针对其他措施的技术方法和设备,这些技术方法和设备使指令签名集成到标准处理器中变得容易。图I示出了用于执行程序140的设备100的示意性方框电路图。该设备100包括计算单元110和签名模块120。计算单元110与存储器130在工作中(operativ)相连接,在该存储器130中不仅存储有带有要执行的指令的程序代码而且存储有要由该程序140处理的数据。然而,存储器130的这样的使用对于在此所公开的技术教导的目的而言并非是必需的,使得程序代码和要处理的数据也会被存储在不同的存储器中。例如可设想的是,程序代码被存储在只读存储器(“Read-Only Memory”,ROM)中,而要处理的数据被存储在并且可以被存储在随机存取存储器(“Random Access Memory”,RAM)中。为了通过计算单元110执行程序140,程序140被加载到存储器130中。程序140包括多个程序语句ANW I至ANW I。程序140的程序语句在存储器130之内被加载到该程序的语句地址空间(Anweisungs-Adressraum)中。程序140包括用于管理或控制签名算出并且同样被加载到程序的语句地址空间中的语句,更确切地说,在图I的例子中被加载到存储器中的存储器位置132和134上。以下还将更详细地深入讨论用于管理或控制签名算出的语句。存储器130也包括程序140的数据地址空间。在数据地址空间中例如存储有程序的局部变量,这些局部变量在程序运行时可被计算和/或被改变。对程序140的局部变量等等的访问通常由计算单元110通过对存储器130的读/写访问来进行。此外,但是也可能的是,例如如打印机或者扫描仪这样的外围设备直接访问存储器130。 当程序140被加载到存储器130中时,计算单元110可以通过对存储器130的存储访问来读取语句。为此目的,计算单元110包括命令指针寄存器112,在该命令指针寄存器12中存储有命令指针,该命令指针指向在程序140的语句地址空间中的地址,在该地址处通常有接下来的要被计算单元110执行的语句。接下来的要执行的语句被计算单元加载到指令寄存器114中,以便计算单元110可以被控制为使得属于所述语句的指令可以以所设置的方式被执行。以这种方式,计算单元110处理例如存放在程序140的数据地址空间中的数据。在执行属于所述语句的(多个)指令之后,命令指针被增加,以便指向随后的语句。也可能的是,将命令指针的被程序140确定的值加载到命令指针寄存器112中,由此可 以执行程序流程中的分支和有条件的转移。由于硬件中的故障或者由于外部影响可能在执行程序140期间出现故障。例如,在程序140的语句数据空间之内的存储器130可具有缺陷(例如具有固定故障(英语“stuck-at fault”)的存储器单元,使得关联的位持续具有逻辑值“0”或者“I”)。这种故障也可以通过例如用激光照射存储器芯片而有针对性地被激发。在存储器130与计算单元110之间的常常由总线提供是连接上也可出现故障。如果计算单元110由于这样的故障而获得有错误的指令,则程序140不再以被编译器(英语^compiler”)设置的方式来执行。为了检测到有错误的指令,该设备100包括签名模块120。该签名模块120被连接到在存储器130与计算单元110之间的连接上,通常尽可能地靠近计算单元110,以便签名模块120以高概率获得与计算单元110同样的数据。作为对图I中所示的配置的替换方案,也可设想的是,签名模块120通过计算单元110的接口访问指令寄存器114并且因此可以读出指令寄存器114。签名模块120包括签名寄存器122和签名算出单元124。在由存储器130传送到计算单元110的每个新指令的情况下,该指令被签名算出单元124 —同读取并且根据签名算出规则来算出新签名值,该新签名值被存储在签名寄存器122中。通常,签名的当前值也被引入到签名算出规则中,所述签名的当前值直至那时已被存储在签名寄存器122中。签名算出规则例如可以包括XOR逻辑运算和/或多项式除法。根据给计算单元110的每个新指令,存储在签名寄存器122中的签名具有如下值所述值由给计算单元的在前指令和由给计算单元的当前指令得到。所述值可以已经事先被编译器算出并且被存储在程序140中。程序140可以包含用来将由编译器确定的值与在程序140运行时所算出的并且在签名寄存器122中存放的值进行比较的语句。在这两个值相一致时,可以以高概率以如下情况为出发点如在编译时由编译器曾设置的那样执行程序140。此外,可能检测到故障并且程序140可以对其以适当的方式作出反应,例如通过结束程序执行、输出相对应的故障报告
坐坐寸寸o在执行程序140时,可发生的是,不与主程序共同被编译的子程序或者子函数被调用。因此,编译器可以在编译主程序时将子程序或者子函数通常并不包括到签名算出中。对于子程序或者子函数,可以设置自己的签名算出。但是,子程序/子函数的调用和从子函数/子函数的返回接着并不在签名算出的范围中受保护。为了针对子程序或者子函数可以 算出自己的校验和,通常会需要与转变到子程序/从子程序转变有关联地保护或修复签名模块120的签名寄存器122。这通常会通过硬件堆栈存储器机制来进行,其中计算单元在子函数调用时在堆栈存储器138上自动地保护签名寄存器122并且在返回时又被堆栈存储器修复。堆栈存储器138在图I中作为存储器130的部分示出,但是也会被实施为独特的存储器结构或者是其他存储器的部分。堆栈存储器的管理通常是计算单元110的任务。因此,术语“硬件堆栈存储器机制”在此被理解为使得硬件本身大致被置于堆栈(Stack)上或被堆栈提取(无需为此存在明确的程序语句)。计算单元110在迄今的解决方案中针对保护和修复签名模块120的签名寄存器122而设计,这可能需要在计算单元110之内的相对应的预防措施。除了调用子程序和/或子函数之外,多个计算机系统也支持在执行程序时的中断(英语-“interrupt”),以便在其间执行另外的程序。在该情况下,在迄今的解决方案中只要签名算出在执行中断期间不是针对所有中断而一般性地被去激活,也就采用由计算单元110进行的硬件堆栈存储器机制。图I图示了针对签名算出的目的而不用硬件堆栈存储器机制就能胜任的可能性的一些方面。程序140包括可以用来控制签名模块120并且在用于签名算出的中断、子程序调用和/或子函数调用时与中断例程、子程序或子函数有关联地可被配置的程序语句。堆栈存储器接着并不自动地由计算单元110被签名模块的状态填满,而是这明确地借助相对应的程序语句来发生。作为例子在图I中示出了两个语句132和134,这两个语句132和134被存储在程序140的语句地址空间中。语句132涉及签名寄存器132的准备,而语句134涉及签名寄存器122的后处理(Nachbereitung),其中准备和后处理涉及上下文转变,如例如在调用子程序、子函数和/或中断例程时出现的那样。当计算单元110的命令指针到达语句132时,属于语句132的指令由计算单元110来执行。该指令例如可以涉及将签名寄存器122的值存储在程序140的局部变量中。该局部变量可以在程序的数据地址空间中被存储在存储器位置136上。例如,在中断例程开始时以这种方式可以存储在中断时刻被执行的程序的签名。临近中断例程的结束,前面所保护的签名又被写回到签名寄存器122中,这由程序语句124促使。从写回签名的时刻起,中断例程通常将不再改变签名寄存器122,即签名算出在该时刻已被去激活或者签名的写回在即将从中断例程返回之前发生。通常,程序140是中断例程。
在子程序或者子函数的情况下,准备可以存在于,将签名寄存器122中的签名更新或适配,使得该签名在执行子程序/子函数期间与参考签名相一致,所述参考签名针对子程序或子函数中的确定的点以代码被寄存(只要直到那时没有故障在程序执行中出现,该故障要通过签名模块120检测到)。相对应的内容适用于签名寄存器122的后处理并且从子程序或者子函数的返回与曾执行何种子程序或子函数无关地,并且与在子程序之内曾通过何种运转路径无关地,对签名寄存器122的受程序控制的后处理负责,在从子程序或子函数返回之后的点处使已调用该子程序或者该子函数的函数中的签名又与针对所述点所寄存的参考签名值相一致(只要直到那时没有故障在程序执行中出现,该故障要通过签名模块120来检测到)。图2示出了在此所公开的对于直接的函数调用的技术教导的一些方面的示意性函数调用图。直接的函数调用是已在编译时固定其目的地地址的函数调用。为了保护在直接函数调用时的进入和退出,在编译程序时或在制订二进制程序代码时为每个函数生成起始签名SIGa和终止签名SIGe。为了生成这些签名,存在三种变型方案这些值可以针对每 个函数随机地生成,由相应的函数的地址导出或者针对所有函数都是相同的(最后的变型方案仅提供有限的进入/退出保护)。与值如何被选择无关地,程序流的保护接着如图2中概略绘制地那样进行。在进行调用的函数(调用方(Caller))中,起始签名SIGa (n_l)被选择为使得在进入到函数n中时,指令签名的值恰好对应于SIGA(n)。可替换地,在预先给定的值SIGA(n-l)的情况下,在进入之前执行签名的更新,使得在进入到函数n中时,指令签名的值恰好对应于SIGa (n)。在函数n中,通过适配或更新(在函数中的第一分支之前的任意位置处)校正签名,使得在到达函数的结束时(并且在有序执行函数时),指令签名的值恰好是SIGe (n)。在进行调用的函数中,在返回之后类似地执行签名的更新,使得在函数结束时达到值SIGe(n-1)。图3示出了在此所公开的对于间接函数调用的技术教导的一些方面的示意性函数调用图。对于根据所公开的技术教导对间接函数的保护建议,SIGa和SIGe由要保护的函数的函数标识号被导出(这例如可以是地址an (如在图2中在直接函数调用的情况下那样))。保护的基本思想在于,在调用子函数之前和之后基于函数标识号算出和应用更新值,使得进行调用的函数和被调用的函数的起始签名和终止签名被正确地算出(只要没有物理侵袭、硬件故障等出现)。对于起始签名的更新值的算出,使用映射fA,函数标识号作为自变量被引入到该映射fA中,即fA (an)。一旦确定何种函数借助间接函数调用要被调用、即确定函数标识号,映射fA (an)就可以被分析。为了算出终止签名的更新值,使用另一映射fE,同样将函数标识号an作为自变量引入到该映射中、即fE (an)。终止签名SigE (n)的更新在返回到进行调用的函数之后被执行。由于已知了子函数的终止签名SigE (n),则可以借助函数标识号& 算出合适的更新值fE(an),使得只要程序有序地被执行,就在进行调用的函数之内在更新之后的点处的签名对应于分配给该点的参考签名。由于在确定更新值之后基于运行时的函数标识号来算出更新值,因此也可以通过指令签名监控来保护函数调用,所述指令签名监控在编译时刻并不已知,而是在运行时才得到。
间接转移可以类似于间接的函数调用被保护。对于间接转移,基于目的地址来算出合适的更新值(Updatewert)。图4示出了根据所公开的技术教导的另一实施例的设备100的方框电路图。图4中所示的设备100被设计,在中断请求时能够实现在相对应的中断例程之内的签名算出,其中对于签名不需要硬件堆栈存储器机制。除了已经与图I有关联地阐述的部件之外,计算单元110还包括中断请求处理装置116、用于中断标识符的寄存器117和指令处理装置118。签名模块120包括中断信息接口 123和中断信息分析单元,所述中断信息分析单元包括多个子部件。尤其是,中断信息分析单元包括标识符寄存器125、用于签名模块120的算出单元124的活动状态的存储单元126、比较器127和逻辑门128。在通过计算单元110接收到中断请求时,该中断请求被输送给中断请求处理装置 116。该中断请求处理装置116可以标识中断请求并且提供中断标识符,该中断标识符被存储在用于中断标识符的寄存器117中。通过由计算单元110提供的接口可以为计算机系统的外围设备和其他组件提供中断标识符。以这种方式,签名模块120也可以分析中断标识符。签名模块120通过中断信息接口 123接收中断标识符并且将该中断标识符转交给比较器127。比较器127被构造来将当前中断标识符与标识符寄存器125的内容进行比较。如果这两个值相一致,则这意味着签名模块120目前针对当前中断例程被配置。比较器127的输出与逻辑“与”门128的输入端相连接。逻辑“与”门128的另一输入端与用于算出单元124的活动状态的存储单元126相连。在逻辑门128的输出端上输出算出单元124的释放信号。根据比较器127与逻辑门128的相互作用得到当所述当前中断标识符与标识符寄存器125的内容相一致并且算出单元124的活动状态具有逻辑值“真”时,算出单元124的释放信号具有值“I”或“真”。因此,在这些条件下,签名算出通过算出单元124来进行。此外,在签名寄存器122中保持所述签名。标识符寄存器125能够实现签名模块120针对所选择的中断例程是活动的,而针对其他中断例程是不活动的。在计算单元110的上下文转变、如中断请求或者函数调用的情况下,设备100能够尤其是也保护签名模块120的状态并且在稍后时刻又修复所述签名模块120的状态。程序140可以包含如下语句所述语句促使计算单元110及其指令处理装置118访问签名模块120的寄存器之一,以便在那里执行写访问或者读访问。计算单元110因此可以受程序控制地访问标识符寄存器125和/或签名寄存器。对标识符寄存器125的访问通常是写访问并且用于针对(必要时刚被调用的)中断例程配置签名模块120,使得在中断例程的范围中可以执行签名算出,而不干扰或破坏另一(中断)例程的前面所执行的签名算出。在该情况下,中断标识符被写入到寄存器125中。程序130例如可以通过对计算单元110的寄存器117的分析来确定该值。这在图4中通过从程序的数据地址空间到签名模块120的中断信息分析单元125、126的箭头来示出。对签名寄存器122的访问可以是读访问或者写访问并且用于签名的保护或修复。保护或修复又受程序控制地或程序促使地进行。与此相应地,程序130在签名保护的情况下指示计算单元110读取存储在签名寄存器122中的值并且写入程序130的数据地址空间中的局部变量中,更确切地说,写到用附图标记136标识的存储器地址。在修复时,读取局部变量并且该值被写到签名寄存器122中。这在图4中通过双向箭头来表征,该双向箭头示意性地将签名寄存器122与程序的数据地址空间相连。类似于图4中所示的签名模块的签名模块可以代替或除了中断信息接口之外还包括指令信息接口。签名模块可以通过指令信息接口从计算单元接收关于当前指令曾是直接地还是间接地被响应的信息。借助该附加的信息,签名模块可以影响签名算出和/或附加地保护签名算出。通过指令信息接口提供的信息因此可以在签名算出中被考虑。图5示意性地图示了在中断请求和在执行中断请求之后的相对应的返回时的过程。在此,例如设备100可以如在图4中所示的那样来使用。设备100首先处于中断0的中断例程被执行的状态中。中断例程0的签名算出是活动的。针对算出单元124的经配置的活动状态的标识符寄存器125和相关联的存储单元126在图5中示出并且包含针对经配置的中断标识符的值0和针对活动状态的值I。在执行中断例程0期间,针对中断I接收中断请求。计算单元执行上下文转变,以 便执行中断例程I。由于与上下文转变有关联地也改变当前中断的编号并且因此不再与标识符寄存器125中的经配置的标识符相一致,签名算出被关断或被设置为不活动的(图5中的虚线)。计算单元110现在开始执行中断例程I。作为第一语句I)执行签名寄存器122的保护。第二语句2)激活中断例程I的签名算出。该签名算出包含签名模块120的标识符寄存器125的重配置。紧接着第二语句2),由此“I”代表在标识符寄存器125中的中断例程I。在中断例程的称作“受保护区域”的程序段中,现在可以执行针对其设置中断例程的实际语句或者指令。在执行受保护区域中的语句之后,中断例程I为即将来临的到中断例程0的返回做准备。为此,基于程序语句3)又将“0”写到标识符寄存器125中。因为计算单元110还处于中断例程I中,所以现在不再执行签名算出。借助程序语句4)恢复签名寄存器122并且必要时恢复签名模块的配置寄存器。中断例程I由此结束并且计算单元110又转变回到中断例程O。一旦计算单元110已实施上下文转变并且在寄存器117中将当前中断标识符“0”录入,签名算出就又被接通。图6A和6B示出了类似于图5的图解,然而针对三个中断例程0、1和2参与的情况。针对中断例程0和2要分别执行签名算出。而针对位于其间的中断例程1,没有签名算出要被执行。这例如由负责的程序开发者来判定。在从中断0转变到中断I时,计算单元110(在图6A和6B中也用CPU标识(英语“central processing unit (中央处理单元)”))如惯常地那样改变寄存器117的内容,以便指向当前被执行的中断例程或以便记住当前被执行的中断例程。由于签名模块120还针对中断例程0被配置,所以在执行中断例程I期间不执行签名算出,这对应于程序开发者的判定。在从中断I转变到中断2时,中断例程2重配置签名模块120,使得针对中断例程2执行签名算出(图5中的语句“针对Intrpt #2的SIG开”)。之前还保护签名寄存器122的内容,在该签名寄存器中始终还存在签名的值,如针对中断例程0在中断请求I的时刻存在的那样。在中断例程2之内存在受保护的区域,在所述受保护的区域中可以执行中断例程2的实际指令并且中断例程2的签名算出是活动的。在中断例程2结束时,借助中断例程2的程序语句负责签名寄存器122和配置寄存器125、126又根据局部变量被修复。签名模块120现在又被配置,如针对在中断例程0中的签名算出所设置的那样。在从中断例程2返回到中断例程I中之后,没有签名算出被执行,因为计算单元110的中断标识符(寄存器117)并不与签名模块120的经配置的标识符相一致。而在返回到中断例程0之后,签名算出以在中断请求I的时刻被存储在签名模块 120中的值继续。在图6A和6B的下部区段中示出了表格,该表格表示寄存器内容和计算单元110及签名模块120的状态如何随时间改变。计算单元110的中断标识符(“CPU Intpt#”)基本上与由计算单元110执行的上下文转变同步地改变。经配置的标识符“SIG Intpt#”借助有针对性的程序语句来改变。这在中断例程2之内在程序语句“针对Intpt #2的SIG开”的范围中并且在临近中断例程2的结束时借助程序语句“SIG寄存器和CFG寄存器根据局部变量修复”来发生。签名模块120的活动状态“SIG开/关”在最下面的行中示出并且由两个处于其上的行的逻辑运算而得到。图6A和6B中的图示并未示出签名模块的经配置的活动状态,如被存储在存储元件126中那样,而是为了简化而此处假设活动状态始终为“活动的”。图7A和7B示出了流程图和通信图的混合形式,从其中得到的是在中断请求时在签名模块120与程序140之间的交互。在接收到中断请求之前,在开始执行例程的程序语句,如在701处所示的那样。必要时,签名模块120执行相对应的签名算出,如用附图标记702所表示的那样。用703表征中断请求,该中断请求被计算单元110接收到并且促使计算单元110转变到相对应的中断例程中。以转变到新中断例程为条件,停止签名算出(附图标记704)。由于在新中断例程之内要进行签名算出,所以程序语句705负责将签名模块120的签名寄存器122和配置寄存器125、126保护在新中断例程的一个或多个局部变量中。第二程序语句706针对在新中断例程之内的签名算出配置签名模块120。由于签名模块120的重配置,签名算出在707处又被激活。中断例程的随后的程序语句708因此被签名模块120监控。可选地,在中断例程期间执行对签名的检验。为此目的,借助程序语句709读出签名寄存器122。在710处,所读出的值与参考签名进行比较,该参考签名被中断例程的编译器写到中断例程的代码中。当确定有偏差时,例如可以输出故障报告并且结束中断例程。而如果这些值相等,则图7B中的方法继续,如通过连接点A和A ’表示的那样。在711处,签名模块120的配置针对旧例程又被修复。这在712处导致签名算出停住。借助程序语句713,现在也又以在接收到中断请求703的时刻在签名寄存器中存在的值来修复签名寄存器122。通过特定的程序语句714,计算单元从中断例程返回到在前的例程。特定的程序语句714例如可以是RET命令。在返回到在前的例程之后,签名算出在715处隐含地又被接通,因为中断标识符相一致。在前的被中断的例程以接下来的即将到来的程序语句716继续。由此,对中断请求703的包括签名算出在内的处理结束。图8示出了用于基于指令算出签名的方法的示意性流程图,所述指令由计算单元在执行程序期间被执行。在分支802处,首先在中断请求(UNTERBR.)与子函数的调用之间进行区分。如果涉及中断请求,则动作804至810被执行,然而这些动作804至810中的一些是可选的。在中断请求的情况下,计算单元110执行上下文转变直至804。在由于上下文转变而起动的中断例程的范围中,现在在806处将签名存储在中断例程的数据地址空间中。可选地,在808处执行在中断例程中被限定的其他指令。通常,其他指令用于满足中断例程所想要的目的(例如从如计算机键盘这样的外围设备取数据)。为了使中断例程结束,在806处存储的签名又被写回到签名寄存器122中,如通过动作810所示出的那样。如果在分支802处存在子函数调用,则分支802之后是动作812,在动作812,使存储在签名寄存器122中的签名适配。在814处,接着由计算单元110调用子函数。动作812和814可以在顺序方面互换。可选地,在816处执行在子函数中被限定的其他指令。通常,其他指令用于满足子函数所想要的目的(例如执行确定的算出)。从子函数的返回在818处进行并且在820处重新使签名寄存器中的签名适配。在此,动作818和820也可以在顺序上相反。紧接着在两个不同路径中的动作810和820,该方法又结合并且接着结束。所公开的技术教导也涉及一种用于在可编程的设备上被执行的程序的指令流控制设备,其中指令流控制设备被配置来执行如下操作
执行程序语句,用于配置指令签名;
通过可编程的设备执行由程序限定的指令中的至少一个;
通过指令流控制设备处理由程序限定的指令中的至少一个;
其中所述由程序限定的指令中的至少一个修改指令流签名;
执行另一程序语句,用于修复指令签名。此外,所公开的技术教导涉及一种用于在可编程的设备上被执行的程序的指令流控制设备,该指令流控制设备包括
用于基于在可编程的设备上被执行的指令的指令标识符生成校验值的校验值生成单
元;
用于存储校验值的校验值存储器;
用于从可编程的设备的指令处理单元接收中断信息的中断信息接口 ;以及中断信息分析单元,用于设置校验值生成单元的活动状态,使得校验值生成单元在存在中断信息的至少一个第一条件时是活动的,并且校验值生成单元在存在至少一个第二条 件时是不活动的并且校验值存储器保持最后被校验值生成单元确定的校验值。所公开的技术教导也涉及一种用于对在可编程的设备上执行的程序进行指令流控制的方法,该方法包括执行程序语句,用于配置指令签名;
通过可编程的设备执行由程序限定的指令中的至少一个;
通过指令流控制设备处理由程序限定的指令中的至少一个;
其中所述由程序限定的指令中的至少一个修改指令流签名;以及 执行另一程序语句,用于修复指令签名。所公开的技术教导也涉及一种用于对在可编程的设备上执行的程序进行指令流控制的方法,该方法包括
基于在可编程的设备上执行的指令的指令标识符生成校验值;
存储校验值; 从可编程的设备接收中断信息;以及
设置校验值的生成的活动状态,使得校验值的生成在存在中断信息的至少一个第一条件时是活动的,并且校验值的生成在存在至少一个第二条件时是不活动的以及保持最后所确定的校验值。尽管曾与设备有关联地描述了一些方面,但是应理解的是,这些方面也是相对应的方法的描述,使得设备的块或者部件也应被理解为相对应的方法步骤或者被理解为方法步骤的特征。与此类似地,与方法步骤有关联地或者作为方法步骤描述的方面也为相对应的设备的相对应的块或者细节或者特征的描述。方法步骤中的一些或所有可以通过硬件设备(或者在使用硬件设备的情况下)、譬如微处理器、可编程的计算机或电子电路来执行。在一些实施例中,最为重要的方法步骤中的一些或多个可以通过这种设备来执行。根据确定的实施要求可以将本发明的实施例用硬件或者用软件来实施。实施方案可以在使用数字存储介质、例如软盘、DVD、蓝光盘、CD、ROM、PROM、EPROM、EEPROM或者闪存存储器、硬盘或者其他磁性或光学存储器的情况下来执行,在所述数字存储介质上存储有电子可读的控制信号,所述电子可读的控制信号与可编程的计算机系统可以共同作用或者共同作用,使得相应的方法被执行。因此,数字存储介质可以是计算机可读的。根据本发明的一些实施例因此包括数据载体,该数据载体具有电子可读的控制信号,所述电子可读的控制信号能够与可编程的计算机系统共同作用,使得在此所描述的方法之一被执行。通常,本发明的实施例可以被实施为具有程序代码的计算机程序产品,其中当计算机程序产品运转在计算机上时,所述程序代码忙于执行该方法之一。程序代码例如也可以被存储在机器可读的载体上。其他实施例包括用于执行在此所描述的方法之一的计算机程序,其中计算机程序被存储在机器可读的载体上。换言之,根据本发明的方法的实施例因此是如下计算机程序所述计算机程序具有用于当计算机程序在计算机上运转时执行在此所描述的方法之一的程序代码。根据本发明的方法的另一实施例因此是数据载体(或者数字存储介质或者计算机可读的介质),在所述数据载体上记下用于执行在此所描述的方法之一的计算机程序。根据本发明的方法的另一实施例因此是数据流或者信号序列,所述数据流或所述信号序列是用于执行在此所描述的方法之一的计算机程序。数据流或者信号序列例如可以被配置来通过数据通信连接(例如通过因特网)来传送。
另一实施例包括处理装置、例如计算机或者可编程的逻辑部件,所述处理装置被配置或者被适配来执行在此所描述的方法之一。另一实施例包括计算机,在该计算机上安装有用于执行在此所描述的方法之一的计算机程序。根据本发明的另一实施例包括设备或者系统,该设备或该系统被设计,以便将用于执行在此所描述的方法中的至少一个的计算机程序传输到接收机。传输例如可以以电子方式或者以光学方式进行。接收器例如可以是计算机、移动设备、存储设备或者类似的设备。该设备或者该系统例如可以包括用于将计算机程序传输到接收机的文件服务器。在一些实施例中,可编程的逻辑部件(例如现场可编程门阵列、FPGA)被用于执行在此所描述的方法的一些或者所有功能。在一些实施例中,现场可编程门阵列可以与微处理器共同作用,以便执行在此所描述的方法之一。通常,这些方法在一些实施例中从任意硬件设备方面来执行。该任意硬件设备可以是通用硬件、如计算机处理器(CPU)或者对于该 方法特定的硬件、譬如ASIC。上面所描述的实施例仅仅是本发明的原理的阐明。应理解的是,在此所描述的装置和细节的修改方案和变型方案对于其他专业人员变得清楚。因此,意图的是,本发明仅仅通过所附的权利要求书的保护范围来限制,而不是通过在此借助对实施例的描述和阐述表示的特定细节来限制。
权利要求
1.ー种用于执行程序的设备,该设备具有计算单元和签名模块,其中签名模块被构造来以便基于指令算出签名并且将所述签名存放在签名寄存器中,其中在通过计算单元执行程序时出现对中断例程或者子函数的调用,其中所述用于执行程序的设备被构造来以便 当对中断例程进行调用时,借助中断例程的程序语句从签名模块中读出并且存储与所中断的程序相关的签名,并且在离开中断例程之前借助中断例程的程序语句将所存储的签名写到签名模块中,或者 当对子函数进行调用时,在调用子函数之前借助引起签名相对改变的程序语句来使签名寄存器中的签名与子函数的签名相适配,并且在从子函数返回之后借助其他的引起签名相对改变的程序语句使签名寄存器中的签名与如下程序段的签名相适配从所述程序段曾进行子函数调用。
2.根据权利要求I所述的设备,其中,所述用于执行程序的设备此外还被构造为,在执行所调用的中断例程或者所调用的子函数期间执行对签名的检验。
3.根据权利要求I或2所述的设备,其中,所述用于执行程序的设备此外还被构造为,针对中断例程或者子函数激活签名算出。
4.根据权利要求I至3之一所述的设备,其中,所述用于执行程序的设备此外还被构造为,借助程序语句针对在调用中断例程或者子函数的时刻所执行的例程保护签名模块的状态,并且在离开中断例程或者子函数之前借助程序语句针对在调用中断例程或者子函数的时刻所执行的例程恢复签名模块的状态。
5.根据权利要求I至4之一所述的设备,其中,在对子函数进行调用之前,通过用于适配签名的相对应的程序语句更新签名,使得在有序调用子函数时使在调用子函数时的签名与和子函数的起始相关的起始參考签名值相一致。
6.根据权利要求I至5之一所述的设备,其中,在从子函数返回之后,通过用于相对改变签名的相对应的程序语句更新签名,使得在有序地从子函数返回到程序时使在程序的所限定的点处的签名与所述程序的和该限定的点相关的參考签名值相一致。
7.根据权利要求6所述的设备,其中,与从子函数的返回相关有终止參考签名值,签名寄存器中的签名在有序执行子函数时与所述终止參考签名值相一致,并且所述终止參考签名值也与在进行调用的程序段中作为參考签名值的返回目的地相关,其中签名寄存器中的签名在返回时保持不变并且由进行调用的程序段进行检验或者借助签名的相对改变被更新,使得在进行调用的程序段中的点处,得到的签名值在有序执行时与和在进行调用的程序段中的该点相关的第二參考签名值相一致。
8.根据权利要求5至7之一所述的设备,其中,起始參考签名值和/或终止參考签名值作为子函数的名称或者地址的函数被导出。
9.根据权利要求5至7之一所述的设备,其中,起始參考签名值和/或終止參考签名值随机地、成对地不同地、针对函数组相同地或者针对所有函数分别相同地被选择。
10.根据权利要求I至9之一所述的设备,此外还被构造为,在中断例程或者子函数的上下文中借助程序语句更新签名,使得在有序执行中断例程或者子函数时使在中断例程或者子函数的所限定的点处的签名与和中断例程或者子函数的所限定的点相关的參考签名值相一致。
11.根据权利要求I至10之一所述的设备,其中,对子函数的调用以间接函数调用的形式来进行,并且其中签名的适配包括基于子函数的唯一的标识符来确定更新值并且借助更新值修改签名。
12.根据权利要求11所述的设备,其中,间接调用的子函数的唯一的标识符基于如下内容中的至少ー个 -子函数的存储器地址, -子函数的名称, -标识符的相关性映射的結果, -在标识符的相关性表中的条目,以及 -对于所有间接调用的函数都是相同的固定常数。
13.根据权利要求11至12之一所述的设备,其中,确定更新值包括对更新值映射的分析和对更新值表的分析中的至少ー个的分析。
14.根据权利要求I至13之一所述的设备,其中,签名模块包括签名寄存器。
15.根据权利要求I至14之一所述的设备,其中,签名模块包括用于提供存放在签名寄存器中的签名的签名算出単元。
16.根据权利要求15所述的设备,其中,签名模块包括带有用于从计算单元接收中断信息的计算单元的中断信息接口和中断信息分析単元,所述中断信息分析単元用于设置签名算出単元的活动状态,使得签名算出単元在存在中断信息的至少ー个第一条件时是活动的,并且签名算出単元在存在至少ー个第二条件时是不活动的,并且签名寄存器在相对应的不活动时间段中保持最后由算出単元所确定的签名。
17.—种签名模块,其被构造来以便在执行程序时通过计算单元基于给计算单元的程序语句来算出签名并且将所述签名存放在签名模块的签名寄存器中,其中签名模块包括 算出単元,用于基于在计算单元上执行的程序语句生成签名值; 中断信息接ロ,用于从计算单元接收中断信息;以及 中断信息分析単元,用于基于中断信息确定算出単元的活动状态,使得算出単元在满足中断信息的至少ー个第一条件时是活动的,以便在执行中断例程期间基于中断例程的程序语句算出签名并且将所述签名存放在签名寄存器中,以及算出単元在满足至少ー个第二条件时是不活动的并且签名寄存器保持最后由算出単元所确定的签名。
18.根据权利要求17所述的签名模块,其中,中断信息包括中断标识符,所述中断标识符说明哪个中断当前在计算单元上被执行。
19.根据权利要求17或18所述的签名模块,其中,中断信息分析単元包括标识符寄存器,在所述标识符寄存器中能存储有经配置的中断标识符,所述经配置的中断标识符说明算出単元对于带有相对应的中断标识符的当前中断例程而言是活动的。
20.根据权利要求19所述的签名模块,其中,中断信息分析単元包括用于将中断标识符与经配置的中断标识符进行比较的比较器。
21.根据权利要求19至20之一所述的签名模块,其中,标识符寄存器被配置来存储算出单元的经配置的活动状态,在确定算出单元的活动状态时考虑所述经配置的活动状态。
22.根据权利要求19至21之一所述的签名模块,其还包括用于借助程序语句来配置标识符寄存器的配置接ロ。
23.ー种签名模块,其被构造来以便在执行程序时通过计算单元基于给计算单元的程序语句来算出签名并且将所述签名存放在签名模块的签名寄存器中,其中所述签名模块包括: 用于基于在计算单元上执行的程序语句生成签名值的算出単元; 用于从计算单元接收至少ー个指令信息的指令信息接ロ,所述指令信息说明当前由计算单元执行的指令直接地还是间接地作出响应。
24.根据权利要求23所述的签名模块,其被构造来以便在签名算出中考虑通过指令信息接ロ所提供的信息。
25.ー种用于基于指令算出签名并且用于将所述签名存放在签名模块的签名寄存器中的方法,所述指令由计算单元在执行程序期间被执行,其中在通过计算单元执行程序时出现中断请求或者对子函数的调用,其中所述方法包括 当接收到中断请求时,从签名模块中借助与中断请求相关的中断例程的程序语句读出与所中断的程序相关的签名, 借助中断例程的程序语句存储所述签名,并且 在离开中断例程之前借助中断例程的程序语句将所存储的签名写到签名模块中,或者 当对子函数进行调用时,在调用子函数之前借助引起签名改变的程序语句来使签名寄存器中的签名与子函数的签名相适配,以及 在从子函数返回到程序的从中实现子函数的调用的程序段之后,借助其他的引起签名相对改变的程序语句来使签名寄存器中的签名与所述程序段的签名相适配。
26.根据权利要求25所述的方法,此外还包括在执行所调用的中断例程或者所调用的子函数期间检验签名。
27.根据权利要求25或26所述的方法,此外还包括 针对中断例程或者子函数激活签名算出。
28.根据权利要求25至27之一所述的方法,此外还包括 针对在调用中断例程或者子函数的时刻所执行的例程借助程序语句来保护签名模块的状态;以及 在离开中断例程之前或者当进行从子函数的返回时借助程序语句来使在调用中断例程或者子函数的时刻所执行的例程的签名模块的状态恢复。
29.根据权利要求25至27之一所述的方法,其中,当进行从子函数的返回时,签名通过相对应的程序语句被更新以使签名适配,使得在从子函数有序返回到程序时,在程序的所限定的点处的签名与程序的和所限定的点相关的參考签名值相一致。
30.根据权利要求25至29之一所述的方法,其中,在从子函数返回之后,签名通过相对应的程序语句被更新以相对改变签名,使得在从子函数有序返回到程序时,在程序的所限定的点处的签名与程序的和所限定的点相关的參考签名值相一致。
31.根据权利要求30所述的方法,其中,与从子函数的返回相关有终止參考签名值,签名寄存器中的签名在有序执行子函数时与所述终止參考签名值相一致,并且所述终止參考签名值也与在进行调用的程序段中的作为參考签名值的返回目的地相关,其中签名寄存器中的签名在返回时保持不变并且由进行调用的程序段借助签名的相对改变来更新,使得在进行调用的程序段中的点处,得到的签名值在有序执行时与和在进行调用的程序段中的该点相关的第二參考签名值相一致。
32.根据权利要求29至31之一所述的方法,其中,起始參考签名值和/或终止參考签名值作为子函数的名称或者地址的函数被导出。
33.根据权利要求29至31之一所述的方法,其中,起始參考签名值和/或终止參考签名值随机地被选择或者针对所有函数分别是相同的。
34.根据权利要求25至33之一所述的方法,此外还包括在中断例程或者子函数的上下文中借助程序语句对签名进行更新,使得在有序执行中断例程或者子函数的情况下,在中断例程或者子函数的所限定的点处的签名与和中断例程或者子函数的所限定的点相关的參考签名值相一致。
35.根据权利要求25至34之一所述的方法,其中,以间接的函数调用的形式进行子函数的调用,并且其中签名的适配包括基于子函数的唯一的标识符来确定更新值和借助更新值修改签名。
36.根据权利要求35所述的方法,其中,间接被调用的子函数的唯一的标识符基于如下内容中的至少ー个 -子函数的存储器地址, -子函数的名称, -标识符的相关性映射的結果, -在标识符的相关性表中的条目,以及 -对于所有间接调用的函数都是相同的固定常数。
37.根据权利要求35至36之一所述的方法,其中,更新值的确定包括对更新值映射的分析和对更新值表的分析中的至少ー个的分析。
38.根据权利要求25至37之一所述的方法,此外还包括 通过签名模块的中断信息接ロ从计算単元接收中断信息; 设置签名算出的活动状态,使得签名算出在存在至少ー个第一条件时是活动的并且签名算出在存在至少ー个第二条件时是不活动的;以及 如果签名算出是不活动的,则在相对应的不活动时间段上保持最后所确定的签名。
39.根据权利要求38所述的方法,此外还包括 分析中断标识符,所述中断标识符说明当前何种中断在计算单元上被执行。
40.根据权利要求38或39所述的方法,此外还包括 将经配置的中断标识符存储在中断信息分析単元的标识符寄存器中,其中所述经配置的中断标识符说明,对于具有相对应的中断标识符的当前的中断例程,签名算出是活动的。
41.根据权利要求40所述的方法,此外还包括 将中断标识符和经配置的中断标识符进行比较,以便根据比较的结果推断出签名算出的活动状态。
42.根据权利要求40或41之一所述的方法,此外还包括 存储签名算出的经配置的活动状态,所述签名算出的经配置的活动状态在确定签名算出的活动状态时被考虑。
43.根据权利要求40至42之一所述的方法,此外还包括 借助程序语句配置标识符寄存器。
44.根据权利要求25至43之一所述的方法,此外还包括在存储与被中断的程序相关的签名之前接收中断请求并且执行相对应的上下文转变。
45.一种带有程序代码的计算机程序,用于当计算机程序在计算机上运转时执行根据权利要求25至44之一所述的方法。
46.一种用于制订根据权利要求45所述的计算机程序的方法。
47.一种用于制订根据权利要求45所述的计算机程序的编译器。
全文摘要
本发明涉及程序语句控制的指令流控制。公开了一种用于基于由计算单元在执行程序期间被执行的指令算出签名的设备和方法。该方法包括当接收到中断请求时从签名模块中借助与中断请求相关的中断例程的程序语句读出与所中断的程序相关的签名,借助中断例程的程序语句存储该签名并且在离开中断例程之前借助中断例程的程序语句将所存储的签名写到签名模块中,或者当对子函数进行调用时,在调用子函数之前借助引起签名相对改变的程序语句使签名寄存器中的签名与子函数的签名相适配,以及在从子函数返回到程序的从中实现子函数的调用的程序段之后,借助其他的引起签名相对改变的程序语句来使签名寄存器中的签名与所述程序段的签名相适配。
文档编号G06F21/00GK102708013SQ201210057989
公开日2012年10月3日 申请日期2012年3月7日 优先权日2011年3月7日
发明者B.加梅尔, S.佐内卡尔布, S.曼加尔德 申请人:英飞凌科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1