用于在计算机中执行程序的方法与流程

文档序号:20787703发布日期:2020-05-19 21:52阅读:302来源:国知局
用于在计算机中执行程序的方法与流程

所公开的实施例涉及一种用于在计算机中执行程序的方法,并且具体地,涉及一种用于在执行期间操控程序以便允许测试所述程序的方法。



背景技术:

为了确保程序、特别是在具有实时要求的嵌入式系统上执行的程序的正确操作,在开发和设计这类程序的进程中,有必要执行严格的测试。

当前采用的用于软件测试的工具包括取决于刺激的外部设备,以用于指示在计算机的处理单元上正执行的程序的状态。在测试进程中,响应于刺激来注入故障或错误,以测试程序在该特定状态下对故障的反应。

外部测试设备(即处理单元外部和/或附近的设备)的特定问题是由于当前处理系统中的组件和信号的集成和小型化,这使得难以到达感兴趣的信息,例如高速缓冲存储器、内部寄存器和总线、以及处理单元的其它片上逻辑。由于有限的引脚计数,因此对感兴趣的内部信号进行窃听(tap)是相当复杂的。

这类测试在实时系统和/或嵌入式系统的情况下特别是要求高的,所述实时系统和/或嵌入式系统包括高度集成的组件,并且其中必须在不危害功能和定时行为的情况下获得测试结果。

在调试器——即用于找出错误原因的工具——的控制下运行程序并且通过设置观察点或断点来修改程序,极大地干扰了功能和定时行为,这使得调试器对于自动化测试而言是不切实际的。

一般而言,用于测试目的的刺激不得损害被测程序。也就是说,过程内部刺激必须只对被测控制过程具有意图的效果,而没有任何不意图的副作用。在这个意义上,过程内部刺激必须是非侵入性的。

因此,在本领域中存在对于如下的需要:在计算机中执行程序,其允许在基本上实时执行所述程序的同时进行非侵入性测试,并且由此程序本身基本上不为了测试目的而变化。

进一步地,在本领域中存在对如下的需要:通过在程序的执行路径中的精确位置处注入故障来促进程序中的测试。



技术实现要素:

本发明涉及一种用于在计算机中执行程序的方法,所述程序包括要由计算机的处理单元执行的多个指令,所述方法包括以下步骤:

a)分配用于存储所述程序的至少一个操作数的第一存储器结构,每个操作数通过第一存储器结构中的相关联的第一地址而存储在第一存储器单元中;

b)分配用于存储至少一个影子操作数(shadowoperand)的第二存储器结构,每个影子操作数通过第二存储器结构中的相关联的第二地址而存储在第二存储器单元中;

c)通过相关联的第一地址加载用于访问第一存储器单元的所述指令中的一个;

d)查询第一地址在第二存储器结构中的存在,并且响应于肯定存在,使用相关联的第二地址以用于访问所述第二存储器单元中的一个第二存储器单元,而不是第一存储器单元。

本发明提供了一种用于协调处理器中的指令执行的技术,所述技术允许通过取而代之地访问影子操作数来单独替换对常规操作数的访问。影子操作数的概念允许将数据非侵入性地植入到程序的执行中,特别是用于将故障注入正常程序操作中和测试程序反应的目的。

当出现用于通过第一地址访问第一存储器单元——其是用于读取或存储操作数的寻址位置——的常规指令时,查询指示读取或写入影子操作数的数据。

在该查询递送肯定存在的情况下,专用于影子操作数的相关联的第二存储器单元、而不是用于常规操作数的第一存储器单元被用于访问。

由于通过相关联的第一地址访问第一存储器单元的指令包括读取或写入操作数这两者,所以所述方法允许如下这两者:

-读取影子操作数而不是常规操作数;或者;

-将变量写入专用于影子操作数的第二存储器单元中,而不是将所述变量写入常规的第一存储器单元中。

第一替代方案——读取影子操作数而不是常规操作数——对于向正常程序执行注入故障而言是特别有利的,例如,因为影子操作数有意地注入期望引起错误的值,以便检验程序的反应。第二替代方案——将变量写入专用于影子操作数的存储器单元中——对于将感兴趣的变量转储到第二存储器结构中而言是有利的,例如,以用于在故障注入之后分析这些变量的目的。

附图说明

从结合附图考虑的以下对优选实施例的描述,本发明的目的以及另外的优点将变得更加清楚并且容易领会,其中的附图:

图1示出了根据实施例的示例性架构的框图;

图2示出了根据替代实施例的示例性架构的框图;

图3示出了根据实施例的示例性存储器结构;

图4示出了根据实施例的用于说明可能的状态转移的状态转移图;

图5示出了第一状态转移的细节;

图6示出了作为前面提到的第一状态转移的结果的存储器结构中的修正;

图7示出了第二状态转移的细节;

图8示出了作为前面提到的第二指令的结果的存储器结构中的修正;

图9示出了第三状态转移的细节;

图10示出了作为前面提到的第三状态转移的结果的存储器结构中的修正;

图11示出了第四状态转移的细节;

图12示出了作为前面提到的第四状态转移的结果的存储器结构中的修正;

图13示出了第五状态转移的细节;

图14示出了作为前面提到的第五状态转移的结果的存储器结构中的修正;

图15示出了第六状态转移的细节;

图16示出了作为前面提到的第六状态转移的结果的存储器结构中的修正;

图17示出了第七状态转移的细节;

图18示出了作为前面提到的第七状态转移的结果的存储器结构中的修正;

图19示出了根据替代实施例的第一变型的示例性存储器结构;

图20示出了根据替代实施例的第二变型的示例性存储器结构;和;

图21示出了根据替代实施例的用于说明可能的状态转移的状态转移图。

具体实施方式

图1示出了包括诸如微处理器或微控制器的中央处理单元cpu的示例性架构的框图。

中央处理单元cpu与主存储器mem交换——即加载或保存——数据。数据的交换可以包括存储地址add、数据值dat和控制数据ctr。

控制数据ctr可以包括存储在主存储器mem中的一个或多个计算机程序的机器代码指令。指令是引起中央处理单元cpu执行特定操作的一组比特。指令的前导部分包括操作代码或操作码。操作码是指定要由中央处理单元cpu执行的操作的一组比特。例如,可以在操作码中指定诸如相加、或相减、或使程序执行分支或将值存储到存储器之类的操作。指令的剩余部分典型地为操作提供数据源、数据目的地和/或直接数据,被称为操作数。操作数可以在指令本身内、或者在存储器位置中被指定。

数据值dat可以包括操作数以及与操作数(其相关联的值可能经受改变)相关联的符号名称。

地址add用于执行指令并且用于存储和检索数据。虽然可以由机器代码操作数来将物理地址的概念应用于对存储器位置寻址,但是在未示出的存储器管理单元或者其它存储器映射设施的控制下使用逻辑或虚拟地址,所述设施被包括在中央处理单元cpu内或者由中央处理单元cpu控制。

附图中未图示的另外的单元或设备可以与具有或不具有中央处理单元cpu的主存储器mem交换输入/输出数据io。

尽管数据的交换由分离的通道或总线(在附图中由双箭头描绘)图示,但是这类交换可以包括仅仅包括一个或多个共同数据通道的替代的数据交换组织。

一般地,监管和实现各种数据处理任务的中央处理单元cpu包含用于处理指令和数据的硬件组件。指令与数据一起典型地存储在存储器结构中。存储器结构可以在物理上与主要包括主存储器mem的中央处理单元cpu分离,尽管指令和数据的副本在程序执行期间可以暂时存储在微处理器内。

为此,中央处理单元cpu可以包括或管理至少一个另外的存储器结构(未示出),该存储器结构通常被称为寄存器或处理器寄存器。寄存器是对于中央处理单元cpu可用的快速可访问的位置。寄存器通常由少量快速存储组成,并且典型地由除主存储器mem以外的机构寻址,但是在一些情况下可以是存储器映射的。

计算机程序的共同属性是引用的局部性,其指代重复访问相同的值并且将频繁使用的值保持在寄存器中,以便改进性能。这使得快速寄存器或高速缓存有意义。将频繁使用的变量分配给寄存器对于程序的性能而言可以是至关重要的。因此,这种寄存器分配通常由编译器在代码生成阶段中执行。

寄存器可以保持指令、存储地址或任何种类的数据,诸如比特序列或单独的字符。一些指令将寄存器指定为指令的一部分。例如,指令可以指定两个限定寄存器的内容被相加在一起,并且然后被放置在指定的寄存器中。取决于处理器设计和语言规则,寄存器可以是编号的或者具有任意名称。

提供未示出的计算机程序以由中央处理单元cpu执行。利用注入故障或错误的能力,程序基本上在运行时间期间经受检验,以便测试程序在该特定状态下对故障的反应。本发明的实施例提供了在中央处理单元中协调指令的执行,从而允许通过取而代之地访问影子操作数来单独替换对常规操作数的访问。

本发明的实施例提供了将计算变量写入专用于与相应操作数相关的影子操作数的存储器单元中,例如,以用于在故障注入之后分析计算变量的目的。

图1进一步示出了存储器修改单元memou,其功能性将在下文中详细描述。存储器修改单元memou可以包括或使用一个或多个存储器结构,所述一个或多个存储器结构包括中央处理单元cpu的寄存器和/或主存储器mem内的存储器结构。根据图1的实施例,存储器修改单元memou位于中央处理单元cpu内,或者至少使用该中央处理单元cpu的寄存器。

存储器修改单元memou的两种实现方式是合适的:

-存储器修改单元memou可以包括一个或多个处理器内部或处理器外部的硬件组件,所述硬件组件允许当被指示进行修改时,对要被测试的计算机程序的存储器单元进行修改。硬件组件可以包括从由中央处理单元管理的寄存器定界的寄存器组件,或者可以使用中央处理单元cpu的寄存器组件。

-存储器修改单元memou可以由与要被测试的计算机程序编译和链接在一起的软件组成。软件存储器修改单元memou包括用于分配定界存储器结构的例程,所述例程在存储器修改单元memou的控制下提供寄存器或其它存储器单元。软件存储器修改单元memou可以进一步通过用于访问影子操作数的特定指令来修正中央处理单元cpu的微代码和/或扩展用于访问操作数的现有指令。

技术人员将基于手头任务的要求而容易地选取实现方式。

图2中描绘的存储器修改单元memou的替代实施例——其中相同的部分始终由相同的参考标号指定——在其它条件不变的情况下与图1的实施例的不同之处在于:存储器修改单元memou位于主存储器mem而不是中央处理单元cpu内。然而,将在下文中清楚的是,存储器修改单元memou不仅仅是定界的存储器结构。

在下文中,描述了根据图1的实施例,其中存储器修改单元memou被包括在中央处理单元cpu的硬件部分中和/或被包括在中央处理单元cpu上执行的程序中。存储器修改单元memou的指令的行为及其对存储器修改单元memou管理的寄存器的影响借助于状态转移图来限定。

存储器修改单元memou提供了第二存储器结构的分配——在图1和3的实施例中,一个或多个寄存器被包括在中央处理单元cpu内或者由中央处理单元cpu管理——所述第二存储器结构与由被测程序使用的第一存储器结构并行操作。

当出现用于访问操作数的程序的指令时——即从第一存储器结构中读取操作数或者将操作数写入第一存储器结构中——在可限定的条件下访问影子操作数,而不是操作数。

图3示出了根据实施例的示例性的第二存储器结构ms。所述第二存储器结构ms在中央处理单元cpu的寄存器空间内提供三个寄存器drg、arg、irg,它们由存储器修改单元memou专门管理。

另外的(未示出的)寄存器r1和r2标示分配在中央处理单元cpu的寄存器空间中的寄存器,所述寄存器经常由被测程序使用。保存在寄存器、或者一般地存储器单元内的内容通过前面的符号来引用。因此,寄存器r1中保存的内容或值由来表达。

提供数据寄存器drg用于访问影子操作数。图3示出了n个数据存储器单元,其内容由类型标识符和索引号的串接(即)来标示。在数据寄存器drg中的n个数据存储器单元中的每一个中,可以保存或检索相应的影子操作数在下文中,影子操作数也被称为经修改的数据值,以便表达其与原始操作数相比的经修改性质。

提供地址寄存器arg以存储经修改的数据存储器单元的经修改的地址。图3示出了n个数据存储器单元,其内容由类型标识符和索引号的串接(即)来标示。在地址寄存器arg中的n个地址存储器单元中的每一个中,可以保存或检索经修改的数据值的相应地址。

提供修改指示寄存器irg以存储具有以下值的修改指示符

-值0(零)标识未经修改的存储器单元;或者;

-索引1,...,n的范围中的值、或者同义地定位i标识在给定时间处修改的存储器单元(1<i<n)。

限定以下指令,以用于由存储器修改单元memou访问、查询或管理影子操作数:如下题为“存储修改”的第一指令:

用于将影子操作数或经修改的数据值存储到第二存储器结构中的存储器单元。具有操作码“stm”的指令包括两个操作数,所述两个操作数指定用于被测程序的正常操作的第一存储器结构中的相应寄存器r1和r2的内容“存储修改”指令将当前高速缓存在第一寄存器r1中的影子操作数的数据值存储到第二存储器结构的存储器单元,所述第二存储器结构的存储器单元的地址当前被高速缓存在第二寄存器r2中。

如下题为“加载修改”的第二指令:

用于将影子操作数或经修改的数据值从第二存储器结构的存储器单元加载到第一寄存器的存储器单元中,所述第一寄存器用于被测程序的正常操作。影子操作数从第二寄存器的存储器单元被加载,该第二寄存器的存储器单元的特定地址通过当前高速缓存在第二寄存器中的值而传递给加载指令。

如下题为“被修改”的第三指令:

用于确定在第二存储器结构中的存储器单元的给定特定地址处是否提供了影子操作数。所述特定地址通过当前高速缓存在第一寄存器中的值而传递给“被修改”指令。

如下题为“清除修改”的第四指令:

用于针对第二存储器结构中的存储器单元的给定特定地址清除“被修改”状态,所述第二存储器结构中的存储器单元的特定地址通过当前高速缓存在第一寄存器中的值而传递给“清除修改”指令。

在下文中,这些指令连同其对寄存器内容的影响由图4中所示出的状态转移图来限定,所述状态转移图用于说明可能的状态转移。

状态转移图限定了两个状态st1、st2,其中第一状态st1的特征在于给定地址addr处的存储器单元未被修改——或者换句话说:对于给定地址中存储的给定操作数,没有影子操作数——并且其中第二状态st2的特征在于给定地址addr处的存储器单元被修改——或者换句话说:对于给定地址中存储的给定操作数,存在影子操作数。在第一状态st1中,由“被修改”指令ismaddr进行的查询将返回值0,其是修改指示寄存器irg的内容。在第二状态st2中,由“被修改”指令ismaddr进行的查询将返回不等于零的值。

上面描述的用于访问或管理影子操作数的指令——即“存储修改”或stm、“加载修改”或ldm、“被修改”或ism和“清除修改”或clm,以及它们与通常存储器指令——即“存储”或st和“加载”或ld的相互作用正在影响如下面解释的状态转移a、b、c、d、e、f、g。

后一种“通常”存储器指令指代由被测程序访问存储器的一般指令。

所有指令都引用给定的地址addr,所述给定的地址addr被作为用于在下面解释的指令的给定操作码的操作数addr而被传递。

a)保持在第一状态st1中的第一状态转移a由如下指令实现:

ismaddr

其中ism是查询在第二存储器结构中的存储器单元的给定特定地址addr处是否提供影子操作数的指令。

b)保持在第二状态st2中的第二状态转移b由如下指令实现:

ismaddr

其中ism同样是查询在第二存储器结构中的存储器单元的给定特定地址addr处是否提供影子操作数的指令。与第一状态转移不同,第二状态转移假设其中存在影子操作数的情形,即第二状态st2。

c)第三状态转移c正在改变到第二状态st2中——参见附图中的外部弓形——或者保持在第二状态st2中——参见附图中的内部环路。该第三状态转移c由如下指令实现:

stm_,addr

其中stm是用于将影子操作数或经修改的数据值存储到第二存储器结构中的存储器单元的指令。具有操作码“stm”的指令包括两个操作数,其中第一操作数由占位符_表征,其意味着第一操作数——影子操作数的数据值——不影响指令的结果。stm指令的第二操作数指定第二存储器结构中的在其中必须存储影子操作数的存储器单元的地址addr。

d)保持在第二状态st2中的第四状态转移d由如下指令实现:

ldm_,addr,

其中ldm是用于将影子操作数或经修改的数据值从第二自变量addr指定的第二存储器结构的存储器单元加载到寄存器的存储器单元中的指令,所述寄存器的存储器单元具有由第一自变量——这里是由占位符_,因为第一存储器结构中的存储器单元的地址不影响指令的结果——指定的地址,所述寄存器用于被测程序的正常操作。

e)保持在第一状态st1中的第五状态转移e由如下指令实现:

ld_,addr

其中,ld是被测程序的正常操作中的“通常”指令,其用于从第一存储器结构的存储器单元加载操作数。通过使用该加载指令ld,不对潜在存在的影子操作数进行考虑。必须从其中加载操作数的存储器单元的源地址addr由第二自变量addr指定。加载指令ld的第一自变量由占位符_指定,因为加载指令的目标地址不影响指令的结果。

f)保持在第一状态st1中的第六状态转移f由如下指令实现:

st_,addr

其中st是被测程序的正常操作中的“通常”指令,其用于将操作数存储到它自己的寄存器,换句话说,存储到第一存储器结构的存储器单元。通过使用该存储指令st,不对潜在存在的影子操作数进行考虑。必须将操作数存储到其中的存储器单元的目标地址addr由第二自变量addr指定。存储指令st的第一自变量由占位符_指定,因为存储指令的源地址不影响指令的结果。

g)第七状态转移g正在改变到第一状态st1中——参见附图中的外部弓形——或者保持在第一状态st1中——参见附图中的内部环路。该第七状态转移g由如下指令实现:

clmaddr

其中clm是用于清除针对第二存储器结构中的存储器单元的“被修改”状态的指令,所述第二存储器结构中的存储器单元的特定地址addr被传递给“清除修改”指令。

另外的状态转移x,y——在附图中由划掉的环路图示——是禁用的:

x)保持在第一状态st1中的状态转移x将由如下指令实现:

ldm_,addr

该(禁用的)状态转移x将为尚未被修改的存储器单元加载经修改值——注意,第一状态st1由地址addr处的未被修改的存储器单元来限定。因此,该操作没有效果。

y)保持在第二状态st2中的状态转移y将由如下指令实现:

ld_,addr

该(禁用的)状态转移y将试图为已经被修改的存储器单元加载未经修改值——注意,第二状态st2由地址addr处被修改的存储器单元限定。如果被准许,则该操作将破坏存储器修改单元memou的语义(还参见状态转移d和e的定义)。

在下文中,示出了状态转移a、b、c、d、e、f、g的细节,连同作为相应状态转移的结果的第一存储器结构和第二存储器结构中的修正。

图5示出了在执行“被修改”指令的进程中的第一状态转移a的细节。第一状态转移a开始于第一状态st1,其中给定地址处的存储器单元未被修改,或者换句话说:对于给定地址中存储的给定操作数,没有影子操作数。因此,“被修改”指令查询将递送0(零)值,这意味着不存在影子操作数。因此,“被修改”指令不导致状态转移。状态在第一状态st1处保持不变。

图6示出了在随后的图5中描绘的第一状态转移a之前(左边部分)和之后(右边部分)的存储器结构中的修正。

在这两个部分的上部中,示出了用于程序执行的存储器结构的内容,这里在中央处理单元cpu的寄存器空间中分配了寄存器该寄存器经常由被测程序用于正常操作。如所描绘的,该寄存器的内容提供了由该寄存器r1高速缓存的地址a1,以用于执行如下的“被修改”指令:

ism

在下面的方框部分中,示出了第二存储器结构的结构和内容。第二存储器包括在存储器修改单元memou控制下的三个寄存器,即:

-包括n个存储器单元的数据寄存器dm,其内容一般被称为或单独由指代。该数据寄存器符合图3的数据寄存器drg。假设一些任意数据d或0(零)等被存储在该数据寄存器的n个存储器单元中,所述任意数据对于该示例性实施例是无关的。

-包括n个存储器单元的地址寄存器am,其内容一般被称为或单独由指代。该地址寄存器符合图3的数据地址寄存器arg。假设一些任意地址a8、a3或0(零)存储在该地址寄存器的n个存储器单元中,所述任意地址对于该示例性实施例是无关的。

-修改指示寄存器im,其包括具有的内容的一个存储器单元。该修改指示寄存器符合图3的修改指示寄存器irg。假设值d存储在修改指示寄存器im的存储器单元中,由此自从“被修改”指令的最近一次调用以来,该任意值d一直保持。

“被修改”指令开始于读取寄存器的内容,并且将内容(即地址a1)传递给对于该地址a1在地址寄存器中的存在的查询。在执行“被修改”指令ism的进程中,存储器修改单元将修改指示符从先前的任意值d——参见左侧的修改指示寄存器的内容——设置为0(零)值——参见右侧的修改指示寄存器的内容,因为所查询的地址a1不包括在地址寄存器的地址集合{a8,a3}中。由于a1不在地址寄存器的该集合内,所以修改指示寄存器的存储器单元被设置为0(零)值。

在下面的方框部分中,示出了用于访问由程序管理的通常操作数的第一存储器结构的结构和内容。第一存储器结构——主存储器或寄存器空间——由程序分配,以用于存储所述程序的至少一个操作数,每个操作数通过第一存储器结构中的相关联的地址a1、a2、a3存储在第一存储器单元中。

第一存储器结构以公知的方式包括通过地址a1,a2,a3,...寻址的多个存储器单元,所述地址包括在由中央处理单元cpu控制的公知存储器映射设施的控制下使用的逻辑或虚拟地址。

第一存储器结构的所描绘的存储器单元的相应内容由附图中的任意数据值d来指定,这意味着任意数据值d针对该示例性实施例是无关的。

图7示出了在执行“被修改”指令的进程中的第二状态转移b的细节。与由图5所描绘的情形相反,第二状态转移b开始于第二状态st2。在第二状态st2中,给定地址处的存储器单元被修改,或者换句话说:对于给定地址中存储的给定操作数,存在影子操作数。因此,“被修改”指令查询将递送不等于零的值,这意味着存在影子操作数。由于“被修改”查询不影响影子操作数的存在,因此“被修改”指令不导致状态转移。状态在第二状态st2处保持不变。

图8示出了在随后的图7中描绘的第二状态转移b之前(左边部分)和之后(右边部分)的存储器结构中的修正。

分配在中央处理单元cpu的寄存器空间中的寄存器r1的内容提供了地址a1,该地址a1由该寄存器r1高速缓存,以用于执行如下的“被修改”指令:

根据图6的结构描绘了下面方框部分中的第二存储器,其包括在存储器修改单元memou控制下的三个寄存器:

假设三个寄存器存储以下数据:

-如图6中所示的,假设数据寄存器dm的内容在相应的存储器单元中包括相同的任意数据d或0(零)等,所述任意数据d或0(零)等同样针对该示例性实施例是无关的。

-假设地址寄存器am的内容在相应的存储器单元中存储地址a8、a1或0(零)。

-假设修改指示寄存器im在其存储器单元中存储值d,由此自从“被修改”指令的最近一次调用以来,该任意值d一直保持。

“被修改”指令开始于读取寄存器的内容并且将该内容(即地址a1)传递给对于该地址a1在地址寄存器中的存在的查询。在执行“被修改”指令ism的进程中,存储器修改单元将修改指示符从先前的任意值d——参见左侧的修改指示寄存器的内容——设置为值2——参见右侧的修改指示寄存器的内容,因为所查询的地址a1被包括在地址寄存器的存储器单元中。

下面的方框部分描绘了第一存储器结构的内容,其同样针对该示例性实施例是无关的。

图9示出了在执行“存储修改”指令的进程中的第三状态转移c的细节。

根据本发明的实施例,一般在处理影子操作数前面查询指示读取或写入影子操作数的数据。为了通过使用给定地址的“存储修改”指令来存储影子操作数,在此之前要检查在该给定地址下是否已经存在影子操作数。该检查先前由“被修改”指令执行。

这意味着开始于第一状态st1的第一转移a在第三转移c前面,在第一状态st1中,给定地址处的存储器单元未被修改,或者换句话说:对于给定地址中存储的给定操作数,没有影子操作数。因此,“被修改”指令ism查询将递送0(零)值,这意味着不存在影子操作数。因此,“被修改”指令不导致状态转移。状态在第一状态st1处保持不变。这在图9的中间示出。

随后的第三状态转移c正在从第一状态st1改变到第二状态st2中。该第三状态转移c由如下指令实现:

该指令的前面部分是条件或状态转移保护,其保障只有在“被修改”查询的返回值为0(零)时,才执行剩余部分。以下的“存储修改”指令包括两个操作数,它们被保持在第一寄存器和第二寄存器的内容中。寄存器r1中的第一操作数是要被存储的影子操作数的数据值。“存储修改”指令的第二操作数将寄存器r2的内容指定为第二存储器结构中的影子操作数必须存储在其中的存储器单元的地址。

图10示出了在随后的图9中描绘的第一状态转移a之前(左边部分)、第一状态转移a之后(中心部分)以及第三状态转移c之后(右边部分)的存储器结构中的修正。

在所有三个部分的上部中,示出了用于程序执行的存储器结构的内容,这里在中央处理单元cpu的寄存器空间中分配的第一寄存器和第二寄存器这两者都经常由被测程序用于正常操作。

如所描绘的,第一寄存器r1的内容提供数据值,所述数据值必须存储为影子操作数或经修改值,并且所述数据值当前由第一寄存器r1高速缓存。第二寄存器r2的内容提供针对第二存储器结构中的存储器单元的地址a1,该地址a1当前由第二寄存器r2高速缓存。

在执行如下的“被修改”指令之后:

ism

在中心部分中示出了存储器结构中的修正,其类似地与在“被修改”指令的类似执行之后的、在图6的右边部分中示出的第二存储器结构的内容相对应。

在执行如下的“存储修改”指令之后:

右边部分中示出了存储器结构中的修正。

“存储修改”指令已经将地址寄存器内的存储器单元a3的内容修正为值a1,值a1是由第二寄存器r2的内容传递的影子操作数的地址。

“存储修改”指令已经进一步将数据寄存器dm内的存储器单元d3的内容修正为值d4,值d4是由第一寄存器r1的内容传递的影子操作数的数据值。注意,数据寄存器内的存储器单元的索引3等于地址寄存器内的存储器单元的索引,所述索引确定所保存的影子操作数d3在数据寄存器内的定位。

“存储修改”指令已经将修改指示寄存器im内的存储器单元im的内容修改为值3,值3是最近修改的存储器单元的定位。

在下面的方框部分中——其中示出了用于访问程序的操作数的第一存储器结构的结构和内容,存储了地址a1下的操作数的数据值d1。该数据值d1是操作数的数据值,针对所述操作数的具有值d4的相应影子操作数被存储在第二存储器结构中。

图11示出了在执行“加载修改”指令的进程中的第四状态转移d的细节。

根据本发明的实施例,一般在处理影子操作数前面查询指示读取或写入影子操作数的数据。为了通过使用给定地址的“加载修改”指令来加载影子操作数,要在此之前验证现有的影子操作数是否与所述给定地址相关联。该检查先前由“被修改”指令执行。

这意味着开始于第二状态st2的第二转移b在第四转移d前面,在第二状态st2中,给定地址处的存储器单元被修改,或者换句话说:对于给定地址中存储的给定操作数,存在影子操作数。因此,“被修改”指令ism查询将递送不等于零的值,这意味着存在影子操作数。因此,“被修改”指令不导致状态转移。状态在第二状态st2处保持不变。这在图11的中间示出。

随后的第四转移d没有改变目前的第二状态st2。该第四转移d由如下指令实现:

该指令的前面部分是条件或状态转移保护,其保障只有在“被修改”查询的返回值不等于零时,才执行剩余部分

以下的“加载修改”指令包括两个操作数,所述两个操作数被保持在第一寄存器r1的内容和第二寄存器r2的内容中。寄存器中的第一操作数是任意数据值d,其将由要加载的影子操作数重写。“存储修改”指令的第二操作数将寄存器r2的内容指定为第二存储器结构中必须从其中加载影子操作数的存储器单元的地址。

图12示出了在随后的图11中描绘的在第一状态转移a之前(左边部分)、在第一状态转移a之后(中心部分)以及在第四状态转移d之后(右边部分)的存储器结构中的修正。

在所有三个部分的上部中,示出了用于程序执行的存储器结构的内容,这里在中央处理单元cpu的寄存器空间中分配的第一寄存器和第二寄存器这两者都经常由被测程序用于正常操作。

如所描绘的,第一寄存器r1的内容提供将由影子操作数或经修改值重写的任意数据值d。第二寄存器r2的内容提供针对第二存储器结构中的存储器单元的地址a1,该地址a1当前由第二寄存器高速缓存。

在执行如下的“被修改”指令之后:

在中心部分中示出了存储器结构中的修正,其类似地与在“被修改”指令的类似执行之后的、在图6的右边部分中示出的第二存储器结构的内容相对应。

“被修改”指令开始于读取寄存器r1的内容并且将该内容(即地址a1)传递给对于该地址a1在地址寄存器的内容中的存在的查询。在执行“被修改”指令ism的进程中,存储器修改单元将修改指示符从先前的任意值d——参见左边部分上的修改指示寄存器im的内容——设置为值3——参见中心部分中的修改指示寄存器im的内容因为所查询的地址a1被包括在地址寄存器的存储器单元中。

在执行如下的“加载修改”指令之后:

在右边部分中示出了存储器结构中的修正。

在包括数据寄存器地址寄存器和修改指示寄存器的第二存储器结构中没有修正。

“加载修改”指令使用具有值3的修改指示寄存器im的内容作为索引,以用于访问数据寄存器dm中具有索引3的数据存储器单元的内容所述数据存储器单元包含要被加载的经修改的数据或影子操作数。与地址a1相关联的该影子操作数的数据值d4被加载到第一寄存器的内容中。

在下面的方框部分中——其中示出了用于访问程序的操作数的第一存储器结构的结构和内容,存储了地址a1下的操作数的数据值d1。该数据值d1是操作数的数据值,针对所述操作数的具有值d4的相应影子操作数被存储在第二存储器结构中。

图13示出了在执行“加载修改”指令的进程中的第五状态转移e的细节。

根据本发明的实施例,一般在处理影子操作数前面查询指示读取或写入影子操作数的数据。为了通过使用给定地址的“加载”指令来加载操作数,要在此之前证伪(falsify)现有的影子操作数是否与所述给定地址相关联。该检查先前由“被修改”指令执行。

这意味着开始于第一状态st1的第一转移a在第四转移d前面,在第一状态st1中,给定地址处的存储器单元未被修改,或者换句话说:对于给定地址中存储的给定操作数,没有影子操作数。因此,“被修改”指令ism查询将递送不等于零的值,这意味着存在影子操作数。因此,“被修改”指令不导致状态转移。状态在第一状态st1处保持不变。这在图13的中间示出。

随后的第五状态转移e没有改变目前的第一状态st1。该第五状态转移e由如下指令实现:

该指令的前面部分是条件或状态转移保护,其保障只有在“被修改”查询的返回值为0(零)时,才执行剩余部分

以下“加载”指令包括两个操作数,它们被保持在第一寄存器r1的内容和第二寄存器r2的内容中。寄存器中的第一操作数是任意数据值d,其将由要被加载的操作数重写。“存储修改”指令的第二操作数将寄存器r2的内容指定为第一存储器结构中必须从其中加载操作数的存储器单元的地址。注意,“加载”指令和之前描述的“加载修改”指令之间的一般区别在于,“加载”指令确实从第一存储器中加载操作数,而“加载修改”指令从第二存储器中加载影子操作数。

图14示出了在随后的图11中描绘的在第一状态转移a之前(左边部分)、在第一状态转移a之后(中心部分)以及在第五状态转移e之后(右边部分)的存储器结构中的修正。

在所有三个部分的上部中,示出了用于程序执行的存储器结构的内容,这里在中央处理单元cpu的寄存器空间中分配的第一寄存器和第二寄存器这两者都经常由被测程序用于正常操作。

如所描绘的,第一寄存器r1的内容提供将由操作数的数据值重写的任意数据值d。第二寄存器r2的内容提供针对第一存储器结构中的存储器单元的地址a1,该地址a1当前由第二寄存器高速缓存。

在执行如下的“被修改”指令之后:

在中心部分中示出了存储器结构中的修正,其类似地与在“被修改”指令的类似执行之后的、图6的右边部分中示出的第二存储器结构的内容相对应。

“被修改”指令开始于读取寄存器的内容并且将该内容(即地址a1)传递给对于该地址a1在地址寄存器am的内容中的存在的查询。在执行“被修改”指令ism的进程中,存储器修改单元将修改指示符从先前的任意值d——参见左边部分上的修改指示寄存器im的内容——设置为值0——参见中心部分中的修改指示寄存器im的内容因为所查询的地址a1不包括在地址寄存器的任何存储器中。

在执行如下的“加载”指令之后:

在右边部分中示出了存储器结构中的修正。在包括数据寄存器dm、地址寄存器am和修改指示寄存器im的第二存储器结构中没有修正。

“加载修改”指令使用具有值a1的寄存器r2的内容以用于访问第一存储器结构中的存储器单元a3——下面的方框部分,其中示出了用于访问程序的操作数的第一存储器结构的结构和内容——所述存储器单元a3包含要被加载的数据操作数。与地址a1相关联的该操作数的数据值d1被加载到第一寄存器r1的内容中。

图15示出了在执行“存储”指令的进程中的第六状态转移f的细节。

第六状态转移f在其中不存在影子操作数的第一状态st1中、或者在其中存在影子操作数的第二状态st2中实现。不管初始状态sti如何,在结束状态sti中,第六状态转移f的完成保持在初始状态sti中。

第六状态转移f由如下指令实现:

“存储”指令st包括两个操作数,它们被保持在第一寄存器r1的内容和第二寄存器r2的内容中。第一寄存器r1的内容中的操作数是要被存储的操作数的数据值。第二寄存器r2的内容中的操作数指定第一存储器结构中、操作数必须存储于其的存储器单元的目标地址。

图16示出了在随后的图15中描绘的在第六状态转移f之前(左边部分)和之后(右边部分)的存储器结构中的修正。

如所描绘的,第一寄存器r1的内容提供数据值d1,该数据值d1必须被存储为操作数,并且当前由第一寄存器r1的内容高速缓存。第二寄存器r2的内容提供针对第一存储器结构中的存储器单元的地址a1,该地址a1当前由第二寄存器高速缓存。

在执行如下的“存储”指令之后:

st

在右边部分中示出了存储器结构中的修正。在包括数据寄存器dm、地址寄存器am和修改指示寄存器im的第二存储器结构中没有修正。在下面的方框部分中——其中示出了用于访问程序的操作数的第一存储器结构的结构和内容,在执行“存储”指令之前,存储针对在地址a1下的操作数的任意数据值d,如最下方框区域的左边部分中所示出的。

“存储”指令已经将该存储器单元的内容修正为值d1——参见第一存储器结构内的最下方框区域的右边部分,该值d1是由第一寄存器传递的操作数的数据值。

图17示出了在执行“清除修改”指令的进程中的第七状态转移g的细节。

根据本发明的实施例,一般在处理影子操作数前面查询指示读取或写入影子操作数的数据。为了通过使用给定地址的“清除修改”指令来清除修改——这意味着释放或删除操作数与其相应的影子操作数之间的关系,要在此之前验证现有的影子操作数是否与所述给定地址相关联。该检查先前由“被修改”指令执行。

因此,开始于第二状态st2的第二转移b在第七状态转移g前面,在第二状态st2中,给定地址处的存储器单元被修改,或者换句话说:对于给定地址中存储的给定操作数,存在影子操作数。因此,“被修改”指令ism查询将递送不等于零的值,这意味着存在影子操作数。因此,“被修改”指令不导致状态转移。状态在第二状态st2处保持不变。这在图17的中间示出。

随后的第七状态转移g没有改变目前的第二状态st2。该第七状态转移g由如下指令实现:

该指令的前面部分是条件或状态转移保护,其保障只有在“被修改”查询的返回值不等于零时,才执行剩余部分clm

以下“清除修改”指令clm包括保持在第一寄存器中的一个操作数。寄存器中的所述操作数具有数据值a1,该数据值a1是第二存储器结构中的存储器单元的地址,对于该地址,“被修改”状态必须被清除。

图18示出了在随后的图17中描绘的在第二状态转移b之前(左边部分)、在第二状态转移b之后(中心部分)以及在第七状态转移g之后(右边部分)的存储器结构中的修正。

如所描绘的,第一寄存器的内容提供针对操作数的地址a1,所述操作数与影子操作数的关联必须被释放或删除。

在执行如下的“被修改”指令之后:

在中心部分中示出了存储器结构中的修正。“被修改”指令开始于读取寄存器r1的内容并且将该内容(即地址a1)传递给对于该地址a1在地址寄存器中的存在的查询。在执行“被修改”指令ism的进程中,存储器修改单元将修改指示符从先前的任意值d——参见左边部分上的修改指示寄存器im的内容——设置为值3——参见中心部分中的修改指示寄存器im的内容因为所查询的地址a1被包括在地址寄存器的存储器单元中。

在执行如下的“清除修改”指令之后:

在右边部分中示出了存储器结构中的修正。

“清除修改”指令使用具有值3的修改指示寄存器im的内容作为用于访问地址寄存器中具有索引3的地址存储器单元的索引。在执行“清除修改”指令的进程中,包含在该地址存储器单元中的先前的数据值a1——即与相同地址a1的操作数相关联的经修改的数据或影子操作数的地址——被值0(零)重写。并行地,包含在修改指示寄存器中的先前的数据值3被数据值0(零)重写。

第一存储器结构的存储器单元中没有改变,参见下面的方框部分。

转回到图2,描述了若干个实施例,其中影子操作数的访问不是在中央处理单元cpu的寄存器内、而是在主存储器mem中操作。

根据图2的实施例的主要优点——与图1中所示出的具有存储器组织的实施例相比——由于第二存储器结构的更大的可用存储器空间而显而易见,所述可用存储器空间不限于根据图1的实施例的寄存器空间。

由于第二存储器结构的更大的存储器空间,每个操作数——在主存储器mem中由程序可访问——可以由同样在主存储器mem中可访问的相应影子操作数进行关联,使得在主存储器空间内提供相等数量的用于存储影子操作数或经修改的数据值的存储器单元、以及用于存储操作数或未经修改的数据值的存储器单元。

尽管根据图2的实施例扩展了可修改存储器区域的存储空间,但是它们很可能会减慢原本相同的程序的执行时间,这是由于与寄存器的存储器单元的更快访问时间相比,主存储器mem中的存储器单元的更低的访问时间。取决于手头上的工作,在可修改存储器的存储空间与访问时间之间的平衡将有利于下面描述的根据图1的实现方式或者在下文中描述的根据图2的实现方式。

另一个重要的区别在于,根据图2的实施例使得能够将数据植入到并将故障注入到尚未被存储器修改单元memou功能性——在编译和/或链接程序与程序代码方面——修正的程序中,所述程序代码提供用于分配定界的存储器结构的存储器修改单元memou功能性,提供在存储器修改单元memou的控制下的寄存器或其它存储器单元,并且提供用于访问或管理影子变量而不是变量的扩展指令。

现在参考图21,其示出了根据存储器修改单元memou的实施例的用于说明可能的状态转移的状态转移图,其中第一存储器结构和第二存储器结构位于主存储器mem内。

与根据图4的状态转移图一致,根据图21的状态转移图限定了两个相似的状态st1、st2,其中第一状态st1的特征在于给定地址处的存储器单元未被修改——或者换句话说:对于给定地址中存储的给定操作数,没有影子操作数——并且其中第二状态st2的特征在于给定地址处的存储器单元被修改——或者换句话说:对于给定地址中存储的给定操作数,存在影子操作数。

在第一状态st1内,对是否存在影子操作数或经修改的数据的查询将返回否定结果或在下面解释的“零标记”。在第二状态st2内,对是否存在影子操作数或经修改的数据的查询将返回不等于零标记的肯定结果。

“零标记”在下文中由星号“*”标示。指示无修改的零标记*是不在任何数据值范围内的特殊值。

零标记*可以用不同的方式实现,所述方式例如包括:

-每可修改的存储器单元有一比特:0(零)意味着存储器单元未被修改,1意味着存储器单元被修改。

-使用间接寻址,也就是说,存储器单元包含地址,并且该地址指代具有未经修改的数据的存储器单元——即指代“原始”存储器单元——或者指代具有经修改的数据的存储器单元。

与根据图4的状态转移图不同,根据图21的状态转移图仅添加了两个特定的存储器访问指令,所述指令对于操作影子操作数连同由程序经常使用的操作数而言是必要的。两个特定的存储器访问指令包括“存储修改”指令stm和清除修改clm指令。

如下面解释的,这些指令以及它们与通常存储器指令(即“存储”或st以及“加载”或ld)的相互作用正在影响状态转移a、b、c、d、e、f、g、h。

后一种“通常”存储器指令指代通过被测程序访问存储器的一般指令,所述一般指令相对于其语义和功能性而被扩展,如下面所示的那样。

下面描述的所有指令都引用给定的地址addr,该地址addr作为下面解释的指令的给定操作码的操作数addr而被传递。

a)第一状态转移a正在从第一状态st1改变到第二状态st2中。该第一状态转移a由如下指令实现:

stm_,addr

其中stm是用于存储影子操作数或经修改的数据值的指令。具有操作码“stm”的指令包括两个操作数,其中第一操作数由占位符_表征,其意味着第一操作数不影响指令的结果。stm指令的第二操作数指定存储器单元的地址addr。

b)第二状态转移b正保持在第二状态st2中。该第一状态转移a由如下指令实现:

stm_,addr

其与实现如上所述的第一状态转移a的指令相同。

c)第三状态转移c正在从第二状态st2改变到第一状态st1中。该第二状态转移a由如下指令实现

clmaddr

其中clm是用于清除针对具有特定地址addr的存储器单元的“被修改”状态的指令。

d)保持在第一状态st1中的第四状态转移d由如下指令实现:

clmaddr

其与实现如上所述的第三状态转移c的指令相同。

e)保持在第一状态st1中的第五状态转移e由如下指令实现:

1d_,addr

其中,ld是用于从具有特定地址addr的存储器单元加载操作数的指令。加载指令ld的第一自变量由占位符_指定,因为加载指令的目标地址不影响指令的结果。

f)保持在第二状态st2中的第六状态转移f由如下指令实现:

ld_,addr

其与实现如上所述的第五状态转移e的指令相同。

g)保持在第一状态st1中的第七状态转移g由如下指令实现:

st_,addr

其中st是用于存储操作数的指令。必须将操作数存储到其中的存储器单元的目标地址addr由第二自变量addr指定。存储指令st的第一自变量由占位符_指定,因为它不影响指令的结果。

h)保持在第二状态st2中的第八状态转移h由如下指令实现:

st_,addr

其与实现如上所述的第七状态转移g的指令相同。

针对图19和图20中提到的实施例,对这些状态转移a、b、c、d、e、f、g、h的具体描述继续。

图19示出了示例性存储器结构,其中根据第一变型,第一存储器结构和第二存储器结构位于主存储器mem内。

根据该第一变型的存储器结构包括图19顶部上的方框部分中的第一存储器结构和图19顶部上的方框部分中的第二存储器结构,这两者都位于主存储器mem内。

用于访问图19顶部上的方框部分中的第二存储器结构内的影子操作数的存储器单元由经修改的存储器单元的地址来寻址,其中i是针对相应地寻址的存储器单元的索引,并且其中附加物“m”(针对“修改”的缩写)被附接到经修改的存储器单元和经修改的数据值或影子操作数的地址。在图19中,描绘了两个存储器单元的地址第一存储器单元包含影子操作数的经修改的数据值而第二存储器单元包含零标记*,其指示在地址下不存在影子操作数。

用于访问图19底部处的方框部分中的第一存储器结构内的操作数的存储器单元由存储器单元的地址来寻址,其中i是对于相应地寻址的存储器单元的索引,并且其中附加物“o”(针对“原始”的缩写)被附接到存储器单元和数据值或操作数的地址。可替代地,第一存储器结构内的操作数的地址被简单地标注为addri,这足以通过经修改的存储器单元的地址来区分这些地址。在图19中,描绘了两个存储器单元的地址addr1、addr2。第一存储器单元addr1包含操作数的数据值data1,第二存储器单元存储器单元addr2包含操作数的数据值data2。数据值datai是表达式的另外的缩写形式。

在下文中,指定了根据该实施例的第一变型的完整指令集。如在先前的实施例中,标识微控制器寄存器。

第一指令使用如下的“存储修改”语义:

该指令的第一部分:

[true]

表达一般由方括号包围的条件[...]。表达式[true(真)]标示总是有效的条件。箭头“->”标示项替换,由此箭头左侧的项被箭头右侧的项替换。同样是针对“修改”的缩写。表达式指代经修改的存储器单元(其是)。该指令的结果是:经修改的数据值总是存储在经修改的存储器单元中。

该指令覆盖图21中描绘的第一状态转移a和第二状态转移b。通过存储针对先前未经修改值的经修改值、或者换句话说:通过在给定地址下存储影子操作数来执行第一状态转移a,对于所述给定的地址,先前不存在影子操作数。通过存储针对先前修改的值的经修改值、或者换句话说:通过在给定地址下存储或重写影子操作数来执行第二状态转移b,对于所述给定地址,影子操作数已经存在。

第二指令使用如下的“清除修改”语义:

该指令覆盖图21中所描绘的第三状态转移c和第四状态转移d。

第二指令总是将零标记*存储在经修改的存储器单元中,其指示修改已经被取回。

第三指令使用如下的“加载”语义:

指代原始(未经修改的)存储器单元,其地址为addr,或者同样地,该指令覆盖图21中所描绘的第五状态转移e。

该指令的第一部分:

表达如下条件:其中只有当针对寄存器中的地址addr不存在经修改的数据值时,即当针对该地址的存储器单元中的内容返回零标记时,该指令的剩余部分才被执行。如果该条件为真,则加载未经修改的或者原始的数据值。

第四指令使用如下的“加载”语义:

该指令覆盖图21中所描绘的第六状态转移f。

表达如下条件:其中只有当针对寄存器中的地址addr存在经修改的数据值时,即当针对该地址的存储器单元中的内容不返回零标记时,该指令的剩余部分才被执行。如果该条件为真,则加载经修改的数据值。

第五指令使用如下的“存储”语义:

该指令覆盖图21中所描绘的第七状态转移g和第八状态转移h。第五指令总是将未经修改的数据值存储在原始存储器单元中。

图20示出了示例性存储器结构,其中根据第二变型,第一存储器结构和第二存储器结构位于主存储器mem内。与图19的存储器结构不同,图20的存储器结构没有被组织在针对第一存储器结构和第二存储器结构的定界部分中。然而,基本原理仍然有效:属于第二存储器结构的存储器单元保持经修改的数据值,并且属于第一存储器结构的存储器单元保持原始数据值。

根据图20的存储器组织基本上提供多个三个相邻存储器单元,每个三个相邻存储器单元包括用于对两个数据存储器单元间接寻址的可寻址地址存储器单元。间接寻址是引用用于访问——即存储、读取或重写——未经修改的数据值或操作数的第一数据存储器单元,或者用于访问——即存储、读取或重写——经修改的数据值或影子操作数的第二数据存储器单元。

图20仅示出了所述多个三个相邻存储器单元的一部分:

-第一地址存储器单元由地址addri寻址,其中地址存储器单元的内容提供经修改的存储器单元的地址——其根据本说明书中使用的命名法要被视为第二存储器结构的存储器单元——或者未被修改的单元的地址——其根据本说明书中使用的命名法要被视为第一存储器结构的存储器单元。通过使用共同运算符,针对该第一地址存储器单元的内容,二者择一引用被描绘为

-经修改的数据存储器单元由地址寻址,其中经修改的数据存储器单元的内容提供经修改的数据值

-未经修改的数据存储器单元由地址寻址,其中未经修改的数据存储器单元的内容提供未经修改的数据值

在下文中,示出了根据第二变型的完整指令集。

第一指令使用如下的“存储修改”语义:

该指令覆盖图21中所描绘的第一状态转移a和第二状态转移b。

该指令的第一部分[true]标示总是有效的条件。箭头“->”标示项替换,由此箭头左侧的项被箭头右侧的项替换。分号“;”按顺序链接2个指令。

第一指令的第一部分总是在经修改的存储器单元中存储经修改的数据值。之后,通过链式指令,对存储器单元的访问被重定向到具有经修改值的存储器单元。

第二指令使用如下的“清除修改”语义:

该指令覆盖图21中所描绘的第三状态转移c和第四状态转移d。

第二指令总是将对存储器单元的访问重定向(回)到包含未经修改的数据值的(原始)存储器单元。

第三指令使用如下的“加载”语义:

该指令覆盖图21中所描绘的第五状态转移e和第六状态转移f。

当访问存储器单元时,第三指令总是解决地址间接性。之后,来自“重定向”存储器单元的数据值被加载。

第四指令使用如下的“存储”语义:

该指令覆盖图21中所描绘的第七状态转移g和第八状态转移h。

第三指令总是将未经修改的数据值存储到原始存储器单元中。

所公开的实施例涉及一种用于存储器修改的方法,所述存储器修改导致用于基本上在运行时间期间检验被测程序的测试探针。为了测试程序在特定状态下对故障的反应而注入故障或错误的能力,以及通过访问影子操作数来单独替换对常规操作数的访问的能力,允许在程序基本上实时执行的同时进行非侵入性测试,并且由此程序本身基本上不为了测试目的而变化。

所公开的实施例提供了关于来自非侵入性测试的程序行为的可靠陈述,所述非侵入性测试将数据植入到或将故障注入到处理器存储器中。没有必要在源代码级上改变被测程序来使用用于访问影子操作数的指令。要被测试的程序的程序代码或源代码仅与提供本文中公开的存储器修改单元memou功能性的程序代码或源代码编译和/或链接在一起。

再另一个优点在于,不使用用于访问影子操作数的指令的现有程序照常操作。换句话说,利用用于访问影子操作数的指令来扩展被测程序——或者可替代地,使用其硬件被适配用于访问影子操作数的中央处理单元——是向下兼容的。

存储器修改单元memou具有对完整存储器——包括数据部分和代码部分——的完全访问,从而许可独立于存储器单元是否包含数据值或程序指令来访问存储器单元。测试工具和用于找出故障原因的工具——其也被称为调试器——可以容易地与程序解释器(包括编译器、链接器、加载器)集成,因为所有这些工具都能够使用共同存储器映射。存储器映射是如下文件:其将存储器单元的人类可读的符号名称映射到存储器单元的物理地址,以用于为了读取或加载的目的以及为了写入或存储而访问存储器单元。

在操控期间,原始数据值和经修改的数据值两者有利地相应在第一存储器结构中和第二存储器结构中的不同位置中同时被保持并可访问。

通过应用存储器修改单元memou,自动化和控制程序(例如simatic)或cnc程序(例如sinumeric)的行为可以在开发期间在实验室中和现场操作中、利用在系统级将数据植入到或将故障注入到程序单元中的测试进行分析,而不需要重新编译和重新部署被测程序,这有利地节省了开发和测试努力,从而导致降低要被开发或重新设计的程序的成本和反馈周期。

iec61508族的功能安全标准强烈建议对被分类在最高安全级别中的系统进行故障注入测试。存储器修改单元memou使故障注入测试可行、可负担、快速和可靠。

由于处理器的完整存储器是开放的,因此必须保证对存储器修改单元memou的访问。例如,现代操作系统出于此目的提供了分层保护域,也被称为保护环。为了许可安全操作,可以将经由存储器修改单元memou对特殊存储器区的访问限制为运行在最高特权环0(内核模式)中的程序代码。

要理解,所附权利要求中记载的要素和特征可以以不同的方式组合,以产生同样落入本发明范围内的新的权利要求。因此,尽管下面所附的从属权利要求仅取决于单个独立权利要求或从属权利要求,但是要理解,可以可替代地使这些从属权利要求取决于根据任何前面或后面的权利要求(无论是独立的还是从属的)的替代方案,并且这类新的组合要被理解为形成本说明书的一部分。

虽然上面已经参考各种实施例描述了本发明,但是应当理解,可以对所描述的实施例进行许多改变和修改。因此,意图将前述描述视为说明性的而非限制性的,并且理解,实施例的所有等同物和/或组合都意图被包括在该描述中。

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