用于监测程序代码的执行的方法和设备与流程

文档序号:11545457阅读:206来源:国知局
用于监测程序代码的执行的方法和设备与流程

本发明的各种实施例及其实现涉及由监测程序、特别是在与执行要被监测的程序代码的处理器不同的处理器中实现的监测程序来监测程序代码的执行。



背景技术:

这些监测程序尤其适用于监测跳转指令(诸如例如跳跃指令)的执行。

跳转指令是在被存储在存储器中的程序代码的执行期间使得程序的读取从第一指令去往位于以下存储位置的第二指令的指令:该存储位置的地址没有直接跟随第一指令的地址。

在程序代码的运行期间,由于在存储器中存储程序代码时的错误,或者由于程序代码的指令之一的错误读取,或者由于外部攻击者注入错误,可能出现执行错误。

已知用于监测程序代码的执行的装置,例如国际专利申请公开第“2008075166a1”中描述的装置,其允许了跳跃指令的正确执行被验证并且在相反的情况下生成错误信号。

然而,在这一应用中,指令的执行以及其执行的监测由相同的中央处理单元来控制,这意味着中央处理单元的软件的修改以便将监测代码合并到其中。另外,优选的是,中央处理单元不监测其本身。



技术实现要素:

因此,根据一个实施例,提供了用于监测程序代码的执行的设备和方法,其中监测代码可以由不同于处理单元的监测单元来执行并且监测代码的执行不需要对存储要被监测的程序代码的存储器的访问的具体管理。

根据一方面,提供了一种用于由监测程序代码来监测程序代码的执行的方法,其中

-将程序代码存储在存储器中,该存储器包括存储位置,每个存储位置能够存储程序代码的至少一个指令字并且具有大于程序代码的指令字的大小的存储容量,

-针对包括要被监测的程序代码的至少一个指令的每个存储位置,将监测程序代码的监测指令的至少一部分存储在包含要被监测的所述至少一个指令的存储位置的空闲部分中,

-从程序存储器同时提取要被监测的所述至少一个指令以及所述监测指令的所述至少一部分,以及

-执行要被监测的所述至少一个指令以及所述监测指令。

因此,要被监测的程序代码和监测代码被存储在相同的存储器中,其中监测指令至少一部分被包含在与包含要被监测的指令相同的存储字内。因此获得了要被监测的指令与监测指令的同步执行,并且变得能够例如由两个不同的中央处理单元来执行程序代码和监测代码,而没有依靠对存储器的访问的具体仲裁。一方面,这避免了必须修改单个处理单元的软件,另一方面,获得了程序代码和监测代码的同步执行。

监测指令的大小可以大于空闲部分的大小。在这种情况下,监测指令的第一部分可以被存储在包含要被监测的所述至少一个指令的存储位置的空闲部分中,并且所述监测指令的第二部分被存储在先于包含要被监测的所述至少一个程序代码指令的存储位置的至少一个存储位置的空闲部分中。

根据一个实施例,包含要被监测的所述至少一个指令的存储位置可以包括若干指令字,并且指定与监测指令相关的所述至少一个指令的信息可以被存储在先于包含要被监测的所述至少一个程序代码指令的存储位置的至少一个存储位置的空闲部分中。

监测代码的另一指令的至少一部分可以被存储在位于跟随在包括要被监测的所述至少一个程序代码指令的存储位置的地址之后的地址的存储位置中,要被监测的指令例如是指向所述跟随的存储位置的跳转指令。

根据另一方面,提供了一种由监测程序代码来监测程序代码的设备。

根据这一方面的一般特征,设备可以包括存储器,存储器包括存储位置,每个存储位置能够存储程序代码的至少一个指令字并且具有大于程序代码的指令字的大小的存储容量,每个存储位置包括能够存储监测程序代码的监测指令的至少一部分的空闲部分,其中设备可以包括用于要被监测的所述至少一个指令和所述监测指令的所述至少一部分的同时提取的装置,以及用于要被监测的所述指令和所述监测指令的所述至少一部分的同时执行的装置。

监测指令的大小可以大于空闲部分的大小,并且包含要被监测的所述至少一个指令的存储位置的所述空闲部分可以能够接收监测指令的第一部分,并且先于包含要被监测的所述至少一个程序代码指令的存储位置的存储位置的空闲部分可以能够包含监测指令的第二部分。

根据一个实施例,包含要被监测的所述至少一个指令的存储位置可以包括若干指令字,并且先于包含要被监测的所述至少一个程序代码指令的存储位置的至少一个存储位置的空闲部分因此包括指定与监测指令相关的所述至少一个指令的信息。

位于跟随在包括要被监测的所述至少一个程序代码指令的存储位置的地址之后的地址的存储位置可以能够包含监测代码的另一指令的至少一部分,要被监测的指令是指向所述跟随的存储位置的跳转指令。

附图说明

本发明的其他优点和特征在检查非限制性实施例及其实现以及附图的详细描述时将变得很清楚,在附图中:

图1到5图示本发明及其实现方式的实施例。

具体实施方式

图1图示了数据处理系统,其包括程序存储器mem、中央处理单元cpu(例如处理器)、监测单元am(例如另一处理器)和编译器cpl。

监测单元am在本示例中包括两个寄存器r1和r2、能够被重置为值t并且在时钟信号的末尾(cadence)时能够被递减的计数器cpt、以及被配置用于在周期t的期满时(在计数器的值达到0时)比较两个寄存器r1和r2的内容的比较器cmp。这一周期t尤其取决于各种处理器的流水线架构,并且大于处理器cpu执行从存储器mem提取的指令所需要的时间。

存储器mem经由数据总线1耦合至中央处理单元cpu以及监测单元am。例如,总线1可以是32比特的并行总线,其第一部分11(例如是28比特)耦合至处理单元cpu,并且其第二部分12(在此是4比特)耦合至监测单元am。

传统上,在源代码的编译期间,编译器分析程序的源代码的语法并且定义中间代码,在中间代码中,编译器定义要被监测的指令,例如用于条件地址跳跃的指令(例如汇编语言中的指令“jrz”)或者用于绝对地址跳跃的指令(例如汇编语言中的指令“jmp”),然而这些示例并非限制性的。随后,将中间代码变换成可执行程序代码。

编译器并行地定义监测代码的指令。

在此,对于地址跳跃指令的每个定义,编译器定义用于监测程序代码的执行的指令4。

编译器cpl被配置用于使得每个要被监测的程序代码指令4与监测指令4的至少一部分相关联,并且被配置用于将要被监测的指令3和监测指令4的所述部分分组成意图要被存储在存储位置2的存储字mm。

存储字mm的大小因此大于要被监测的程序代码指令的大小。

如下文中更详细地可知,对于每个要被监测的指令,例如“jmp”类型的条件地址跳跃指令或者“jrz”类型的绝对地址跳跃指令,编译器可以使得与将参考值写入到寄存器r1中相对应的“写入r1”类型的指令相关联。在条件地址跳跃指令的情况下,编译器cpl然后在意图要被存储于直接跟随在包括要被监测的指令的存储位置之后的存储位置的存储字中、在这一指令之后定义与寄存器r1的重置相对应的清除r1类型的指令。

如果这一指令太大,则编译器可以将其分为两个部分,并且将这两个部分之一放置到意图要被存储在例如在先存储位置的另一存储字中。

类似地,已知地址跳跃指令所指向的存储位置的地址,编译器针对指向与将参考值写入到寄存器r2中相对应的写入r2类型的另一监测指令的地址定义其将放置在意图要被存储在由跳跃指令指向的地址处的存储字中。

随后将程序代码和监测代码存储在程序存储器mem的存储位置。

每个存储位置因此具有大于监测指令的大小的大小。

在描述的以下部分中,将更详细地描述监测程序的运行的一个示例。

如图2中图示的存储器mem包括存储位置2,每个存储位置2被配置用于存储包括可执行程序代码的至少一个指令字3的存储字。

在此,存储位置的大小为32比特。指令字3的大小为28比特,因此每个存储位置留下空闲部分pl。

这一空闲部分pl用于存储(如上文中描述的)与要被监测的指令相关联的监测指令4。

在本示例中,第一存储位置21包括包含对应于条件地址跳跃指令的第一指令字31以及与第一指令字31相关的第一监测指令41的存储字。

第一监测指令41在此对应于参考值到寄存器r1中的写入,例如值1的写入。

地址跳跃指令31指向第一存储位置22,第二存储位置22包括包含第二指令字32的存储字(没有被监测)以及与跳跃指令31相关的第二监测指令42。

第二监测指令42在此对应于参考值到寄存器r2中的写入。

其地址直接跟随在第一存储位置21的地址之后的第三存储位置23包含包括第三监测指令43的存储字,第三监测指令43对应于将寄存器r1重置为其被存储在第三存储位置23的空闲部分pl中的初始值。

图3示意性地图示本发明的一个实施例的各个步骤。

在步骤e1,源代码和监测代码如上文中描述地被编译,并且因此获得的存储字被存储在存储器mem的存储位置2中。

因此,每个存储位置2包括程序代码的一个指令,并且另外,包括要被监测的指令字的存储位置每个包括被存储在程序代码的指令字3未使用的部分(或空闲部分pl)中的监测代码4的一个指令。

在此,存储以如下方式来执行:该方式使得在步骤e1的结尾处,存储器mem为先前在图2中描述和图示的配置。

随后提取第一存储位置21的内容(步骤e2)。

应当注意,步骤e2不一定直接跟随步骤e1。因此,先于步骤e2,对应于其他存储位置2中包含的程序代码的传统执行的其他步骤可能已经发生,但是出于简化的目的而没有描述。

经由总线1的第一部分11朝着外部处理单元提取第一存储位置21的前28个比特(换言之,跳跃指令31),并且经由总线1的第二部分12朝着监测单元提取4个剩余比特,4个剩余比特对应于第一监测指令字41。

因此,程序代码的指令字31和第一监测指令41同时并且以同步方式执行。

类似地(步骤e3),并行地执行中央处理单元cpu对程序代码指令31的执行以及监测单元am对监测指令41的执行。

在第一监测指令41的执行(其对应于由监测单元am将参考值写入第一寄存器r1)期间,监测单元am触发计数器cpt的递减。

在条件跳跃指令的执行期间,可以应用两个不同的场景。

第一场景对应于其中条件指令的跳跃条件不为真的情况。在这种情况下,地址的跳跃不发生并且程序的执行继续进行以提取和执行(步骤e9)直接跟随第一存储位置的第三存储位置23的内容。

步骤e9还包括第三监测指令43的提取,其对应于寄存器r1的值到其初始值的重置,例如到0的重置。监测单元然后停止计时器cpt的递减并且将其重置。

程序代码的执行然后以传统方式继续(步骤e7)。

第二场景对应于其中条件跳跃指令的跳跃条件为真的情况。因此,程序代码的执行在第二存储位置22继续。计数器cpt的递减没有被监测单元am停止。

步骤e4对应于第二存储位置22的内容的提取。如先前描述的,朝着中央处理单元(cpu)提取对应于第二程序代码指令32的前28个比特(没有被监测),并且朝着监测单元am提取对应于第二监测指令42的4个剩余比特,这两个提取同时发生。

处理单元cpu执行第二程序代码指令32,并且监测单元am执行第二监测指令42。

监测单元am因此将参考值写入第二寄存器r2中。

在程序的正常运行的情况下,两个寄存器r1和r2因此包括相同的参考值。

在计数器cpt的向下计数的末尾,监测单元的比较器cmp比较(步骤e6)两个寄存器r1和r2的值。如果两个值相等,则表示跳跃指令实际上已经执行,并且程序继续其执行(步骤e7)。如果值不相等,则表示执行没有正常运行并且监测单元然后生成错误(步骤e8)。

例如,在跳跃指令31的执行期间,由于外部攻击者对程序代码的干扰故障或修改,程序可以跳跃至错误的存储位置24。由于错误的存储位置24不包括第二监测指令42,所以第二寄存器r2不包含参考值。

根据图4中图示的另一实施例,第一监测指令41的大小大于第一存储位置的空闲部分pl的大小,例如是8比特大小。第一监测指令41因此分为两个部分410和411。

第一部分410存储在先于第一存储位置25的第五存储位置25的空闲部分中,第二部分411存储在第一存储位置21的空闲部分pl中。

相同的情况适用于第二监测指令42,其第一部分420存储在先于第二存储位置22的第六存储位置26的空闲部分pl中,其第二部分421存储在第二存储位置22的空闲部分pl中。

根据图5中图示的另一实施例,每个存储位置2可以接收程序代码的两个指令字3,例如每个14个比特的指令字。

在此,第一存储位置21除了第一指令字31之外还包括第三程序代码指令33,其在此是其执行没有被监测的任何给定指令。第一存储位置21在其空闲部分pl中还包括与程序代码的第一指令字31相关的第四监测指令44,例如8个比特的指令。

先于第一存储位置21的第五存储位置25包括完成第四监测指令44的参数441。在此,参数441指示第四监测指令44与两个指令31或33中的哪个指令相关。

应当注意,在此呈现的实施例及其实现不是限制。注意,优选地能够预想监测单元am是被合并到cpu处理器中的硬件模块。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1