处理器程序的测试方法和装置与流程

文档序号:13625762阅读:259来源:国知局
处理器程序的测试方法和装置与流程

本发明涉及计算机技术领域,尤其涉及一种处理器程序的测试方法和装置。



背景技术:

在处理器的研发中,为了保证处理器程序的功能设计的正确性和可靠性,可采用测试程序对处理器指令级功能进行验证。

测试程序可包括由多条指令组成的指令序列,指令序列中包括的指令的类型和顺序可以由测试程序随机生成,然后在待验证处理器上或通过计算机软件仿真执行指令序列并检查执行结果来验证处理器的功能设计。测试程序将生成的指令不断添加到内存中,并保证新生成的指令不能覆盖已存在的指令和数据。例如,当指令序列中包含跳转指令时,指向下一条待执行指令的跳转地址需要指向内存中未使用的区域。还有一些指令可能具有不确定的结果,例如,除法指令,当除数为0时执行结果可能是不确定的。

上述测试程序生成的指令不能重复执行,或者指令序列包含具有不确定结果的指令时检查结果需要增加检查的分支,导致对处理器程序的测试效率较低。



技术实现要素:

本发明提供一种处理器程序的测试方法和装置,用于解决现有技术中用于测试处理器程序的测试指令序列不能重复执行、包含不确定结果指令检查步骤繁琐导致对处理器程序的测试效率低的问题。

本发明的第一方面提供一种处理器程序的测试方法,用于获取对处理器程序进行测试的测试指令序列以及所述测试指令序列的预期结果序列,所述测试指令序列存储于处理器的内存空间,该方法包括:

获取当前指令地址,所述当前指令地址为所述内存中的地址;

判断所述当前指令地址是否为已存储任一测试指令的已存储指令地址,所述测试指令为待测试的处理器程序所支持的指令;

若所述当前指令地址为所述已存储指令地址,则执行所述当前指令地址中存储的测试指令,并将所述当前指令地址中存储的测试指令的执行结果加入所述预期结果序列。

进一步地,所述方法还包括:

若所述当前指令地址不是所述已存储指令地址,则

随机生成测试指令,并将所述随机生成的测试指令存储在所述当前指令地址指向的内存空间中;

执行所述当前指令地址中存储的测试指令,并将所述当前指令地址中存储的测试指令的执行结果加入所述预期结果序列。

进一步地,所述获取当前指令地址包括:

将随机生成的一个指令地址作为获取的当前指令地址;或者,

获取下一指令地址,将所述下一指令地址作为获取的当前指令地址;或者,

将当前地址递增一个指令长度的地址作为获取的当前指令地址。

进一步地,所述当前指令地址中存储的测试指令为跳转指令;则所述获取下一指令地址包括:

将所述跳转指令指向的下一条待执行指令的地址作为所述下一指令地址。

进一步地,所述方法还包括:

判断所述当前指令地址中存储的测试指令是否会出现不确定结果;

若所述当前指令地址中存储的测试指令会出现不确定结果,则生成修复指令;

将所述修复指令的执行结果加入所述预期结果序列,所述修复指令用于将所述当前指令地址中存储的测试指令的执行结果重置为确定结果。

本发明的第二方面提供一种处理器程序的测试装置,用于获取对处理器程序进行测试的测试指令序列以及所述测试指令序列的预期结果序列,所述测试指令序列存储于处理器的内存空间,所述测试装置包括:

获取模块,用于获取当前指令地址,所述当前指令地址为所述内存中的地址;

判断模块,用于判断当前指令地址是否为已存储任一测试指令的已存储指令地址,所述测试指令为待测试的处理器程序所支持的指令;

处理模块,用于若所述当前指令地址为所述已存储指令地址,则执行所述当前指令地址中存储的测试指令,并将所述当前指令地址中存储的测试指令的执行结果加入所述预期结果序列。

进一步地,所述处理模块还用于:

若所述当前指令地址不是所述已存储指令地址,则

随机生成测试指令,并将所述随机生成的测试指令存储在所述当前指令地址指向的内存空间中;执行所述当前指令地址中存储的测试指令,并将所述当前指令地址中存储的测试指令的执行结果加入所述预期结果序列。

进一步地,所述获取模块还用于:

将随机生成的一个指令地址作为获取的当前指令地址;或者,

获取下一指令地址,将所述下一指令地址作为获取的当前指令地址;或者,

将当前地址递增一个指令长度的地址作为获取的当前指令地址。

进一步地,所述获取模块,还用于:

在所述当前指令地址中存储的测试指令为跳转指令时,将所述跳转指令指向的下一条待执行指令的地址作为所述下一指令地址。

进一步地,所述判断模块还用于判断所述当前指令地址中存储的测试指令是否会出现不确定结果;

所述处理模块,还用于若所述当前指令地址中存储的测试指令会出现不确定结果,则生成修复指令,将所述修复指令的执行结果加入所述预期结果序列,所述修复指令用于将所述当前指令地址中存储的测试指令的执行结果重置为确定结果

本发明提供的处理器程序的测试方法,测试程序生成指令序列的过程中,判断当前指令地址指向的内存空间已存储有测试指令时则直接执行该指令,即测试程序可生成包含可重复执行的指令的测试指令序列,对于需要测试重复执行同一指令的场景,只需要生成该需重复执行的指令和跳转指令即可,将跳转指令的跳转地址设置为存储该指令的地址,使得处理器程序的测试效率得到极大的提高。

附图说明

图1为本发明提供的处理器程序的测试方法的一种交互示意图;

图2为本发明提供的处理器程序的测试方法实施例一的流程图;

图3为本发明提供的处理器程序的测试方法实施例二的流程图;

图4为本发明提供的处理器程序的测试方法实施例三的流程图;

图5为本发明提供的处理器程序的测试方法实施例四的流程图;

图6为本发明提供的处理器程序的测试方法实施例五的流程图;

图7为本发明提供的处理器程序的测试方法实施例六的流程图;

图8为本发明提供的处理器程序的测试方法实施例七的流程图;

图9为本发明提供的处理器程序的测试方法实施例八的流程图;

图10为本发明提供的处理器程序的测试装置的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

处理器在功能上可提供一系列指令、内存和与指令相关的寄存器,在处理器上执行一条指令可实现一个特定的功能,例如读取两个寄存器的值相加后写入某个寄存器、将内存中一个地址的值拷贝到某个寄存器或将一个寄存器的值拷贝到内存中某个地址等。

图1为本发明提供的处理器程序的测试方法的一种交互示意图。

在对处理器进行指令级功能的验证时,可参考图1,可以在计算机100上运行测试程序1和处理器仿真程序2,仿真程序2可提供处理器程序3的虚拟运行环境,如内存31和寄存器32等,测试时可在该计算机100上运行测试程序1与处理器程序3进行交互,测试程序1向仿真的处理器内存31中写入指令序列,处理器程序3执行指令序列,同时,测试程序1保存指令序列的预期结果序列以供比较。仿真程序2可以提供监视器程序4,监视器程序4的探针可监测处理器程序3当前执行的指令,仿真程序2或监视器程序4可根据测试程序1保存的指令序列的预期结果序列对处理器程序中执行的指令序列的执行结果进行验证。也就是说,测试程序需要输出生成的指令序列和指令序列对应的预期结果序列。

可选的,监视器程序也可以集成在处理器程序中,处理器程序也可以运行于真实的处理器硬件实体上,运行测试程序的计算机可与真实的处理器交互以进行对处理器程序的指令级功能的验证。下述各实施例中提及的处理器的内存可以为真实处理器的内存,也可以为由计算机通过仿真程序虚拟出的内存,本发明不做限制。

图2为本发明提供的处理器程序的测试方法实施例一的流程图。

本实施例的执行主体可以为运行测试程序的计算机,如图2所示,本实施例的步骤可以包括:

s101:获取当前指令地址,所述当前指令地址为所述内存中的地址。

s102:判断当前指令地址是否为已存储任一测试指令的已存储指令地址,所述测试指令为待测试的处理器程序所支持的指令。

s103:若当前指令地址为已存储指令地址,则执行当前指令地址中存储的测试指令,并将当前指令地址中存储的测试指令的执行结果加入预期结果序列。

其中,当前指令地址用于指向测试程序生成指令序列的过程中当前待处理的指令的地址。

需要说明的是,在本发明提供的处理器程序的测试方法中,测试程序生成的指令序列可以被逐个添加到内存中,也可以一次生成后添加到内存中以供处理器执行。处理器的内存的存储空间是以字节为单位进行编址的,指令和数据的大小都是字节的整数倍,保存一条指令的第一个字节的地址是指令地址,默认情况下,一个处理器的所有指令的长度相同。可选的,在s103之后,可以重复执行s101的动作,以逐个生成测试指令序列的测试指令。

获取当前指令地址的方式可以有多种。举例来说,在生成指令序列的初始状态,测试程序可以随机生成一个地址作为当前指令地址,即测试程序可以将第一条指令写入内存中的一个非特定的地址。在执行完当前指令地址所存储的指令之后,默认情况下指令是顺序执行的,测试程序在当前指令地址上递增一个指令长度作为新的当前指令地址。可选的,若刚执行完的指令为跳转指令,其中包含下一条待执行指令存储的地址即为跳转地址,则测试程序获取当前指令地址时,将跳转指令指向的跳转地址作为新的当前指令地址。可选的,若刚执行完的指令发生例外情况,则测试程序将预设的例外返回地址作为新的当前指令地址。

若当前指令地址为已存储指令地址,即当前指令地址指向的内存空间已存储指令,则测试程序不需要生成新的指令而可以直接执行该指令以获取该指令对应的预期结果。指令可以包含操作域和操作数,操作域用于识别指令的功能类型,操作数可以包括源操作数和目的操作数,源操作数为该指令的输入数据,目的操作数用于存储指令相关的输出数据,源操作数可以为固定数据或者为存储在寄存器中的数据或者为存储在内存中固定地址的数据,目的操作数可以存储在寄存器中或者存储在内存的固定地址,若源操作数存储在寄存器中,测试程序可以在生成指令序列前初始化源操作数对应的寄存器。该存储于寄存器的目的操作数还可以用作后续指令的源操作数。测试程序根据执行指令时的源操作数对应的寄存器或内存中固定地址存储的数据获取该指令对应的预期执行结果。

在处理器程序测试领域,为了避免新生成的指令或数据覆盖已有的指令或数据,当需要测试重复执行同一指令的场景时,采用重复生成相同的指令组成指令序列并顺序执行指令序列的方式。本实施例提供的处理器程序的测试方法,测试程序生成指令序列的过程中,判断当前指令地址指向的内存空间已存储有测试指令时则直接执行该指令,即测试程序可生成包含可重复执行的指令的测试指令序列,对于需要测试重复执行同一指令的场景,只需要生成该需重复执行的指令和跳转指令即可,将跳转指令的跳转地址设置为存储该指令的地址,使得处理器程序的测试效率得到极大的提高。进一步地,当指令被允许重复执行时还可用于实现循环执行指令的测试场景,与重复执行的生成方式相同,当需要测试循环执行指令的场景,只需要生成一条需循环执行的指令和跳转指令即可,本发明提供的处理方法丰富了处理器程序测试的测试场景,使得处理器程序的测试效率得到极大的提高。

图3为本发明提供的处理器程序的测试方法实施例二的流程图,在图2所示方法的基础上,可选的,测试程序可采用图3所示的方法向内存中增加指令。

可参考图3,在s102之后,本发明提供的处理方法还可以包括:

s104:若当前指令地址不是已存储指令地址,则随机生成测试指令。

s105:将随机生成的测试指令存储在当前指令地址指向的内存空间中,执行当前指令地址中存储的测试指令,并将当前指令地址中存储的测试指令的执行结果加入预期结果序列,然后执行s101。

需要说明的是,测试程序可以随机生成一测试指令,测试指令的操作域可以随机生成。例如,测试程序可以生成该测试指令的操作域指示该测试指令为跳转指令,当所述测试指令的操作域指示所述测试指令为跳转指令时,测试程序可以控制生成测试指令的跳转地址指向内存中未存放指令和数据的区域,或者,控制该测试指令的跳转地址指向内存中已生成的指令的指令地址。跳转指令的执行结果可以为逻辑类型,例如,跳转执行成功或者跳转执行失败。

可选的,若所述当前指令地址不是所述已存储指令地址,在随机生成测试指令前,测试程序可以进一步判断停止生成指令条件是否满足,若停止生成指令条件不满足,则随机生成测试指令。其中,测试程序可以根据内存最大剩余空间设置停止生成指令条件,最大剩余空间为内存中起始于当前指令地址的剩余未存放指令和数据的最大连续空间,例如,停止生成指令条件可以是内存中最大剩余空间无法容纳一条指令。可选的,停止生成条件也可以设置为固定的指令数量等。

本实施例提供的处理器程序的测试方法,测试程序生成的测试指令序列中的测试指令允许被重复执行,使得处理器程序的测试效率得到极大的提高。

图4为本发明提供的处理器程序的测试方法实施例三的流程图,在图2至3所示方法的基础上,本实施例提供的处理方法还可以包括:

s106:判断当前指令地址中存储的测试指令是否会出现不确定结果。

s107:若当前指令地址中存储的测试指令会出现不确定结果,则生成修复指令;

s108:将修复指令的执行结果加入预期结果序列。

其中,所述修复指令用于将所述当前指令地址中存储的测试指令的执行结果重置为确定结果。

可选的,可以将当前指令地址地址一个地址长度的地址作为当前指令地址后,将修复指令存储于递增一个指令长度后的当前指令地址中。

需要说明的是,在生成随机测试程序时需要考虑一类执行结果具有不确定性的指令,例如:无内部互锁流水级的微处理器(microprocessorwithoutinterlockedpipedstages,简称mips)64的div指令,该指令用于实现除法操作,当除数为0时该指令输出的结果是不确定的,而当具有不确定性的指令的执行结果成为后续指令的输入时,会进而使后续指令的结果也具有不确定性,进而后续指令预期结果需要增加判断的分支,导致随机测试程序对后续指令执行正确性的检查的复杂度增加,并且这种复杂度随着具有不确定性的指令的增加而急速增加,因而在生成测试程序时,应尽量避免会出现不确定的指令结果的情况,以降低测试程序生成指令的难度。

在本发明的实施例中,测试程序可以根据当前指令地址存储的测试指令的操作域判断该测试指令是否会出现不确定结果。例如,div指令为预设的可能出现不确定结果的操作域类型。

上述的修复指令用于将所述当前指令地址存储的测试指令的执行结果重置为确定结果。修复指令可以为一条或者多条。例如,div指令的执行结果存放于名为hi和lo的寄存器中,可以通过两条指令将存储目的操作数的寄存器hi和寄存器lo的值变更为确定的数据。具体的,可以在生成div指令后,依次生成将某个寄存器的值拷贝至寄存器hi和寄存器lo的两条指令。

可选的,s106可以在对应的s104、s105任一步骤后执行,其中,生成的修复指令是预设的与具有不确定结果该测试指令对应的修复指令。

可选的,除了div指令之外,在mips系统中还有一些指令具有不确定结果。

例如,alnv.ps指令,该指令用于将浮点寄存器中成对的单精度浮点数进行重排列。浮点数分为32位的单精度数和64位的双精度数,一个浮点寄存器是64位,因此可以存放一对单精度浮点数。该指令根据一个通用寄存器的低3位(数值范围0-7)确定重排列时移动的字节数(一个字节为8位),但因为该指令针对的是单精度浮点数,因此移动的字节数应该是4的整数倍,所以该通用寄存器低3位的值要么是0要么是4,其余的值都不合法,当通用寄存器的值不合法时,指令的结果不确定。

又如,insv指令,该指令用于将一个通用寄存器低32位中的某一段存入另一个通用寄存器的相应位置。该指令根据控制寄存器dspcontrol中的pos段(0-5位,数值范围0-63)和size段(7-12位,数值范围0-63)确定使用通用寄存器中哪一段比特,具体来说是起始于pos位且长度为size的比特段,因此pos的值必须小于32,size的值必须大于0,且pos+size必须小于等于32,其余的值都不合法,当通用寄存器的值不合法时,指令的结果不确定。

还有一类指令是浮点单精度指令,这类指令仅操作浮点寄存器低32位的单精度浮点数,而不关心浮点寄存器高32位的值,因此这类指令将结果存入一个浮点寄存器时,该寄存器高32位的值被定义为不确定的。

本发明提供的处理器程序的测试方法,在测试程序生成的测试指令序列中包含具有不确定结果的指令时,在具有不确定结果的指令后生成修复指令,通过修复指令将不确定结果设置为确定结果,从而避免引用不确定结果的指令的结果出现不确定的情况,提高了处理器程序测试的效率。

图5为本发明提供的处理器程序的测试方法实施例四的流程图。

在图2至图4所示方法的基础上,如图5所示,本实施例的方法可以包括:

s501:获取当前指令地址。

其中,获取当前指令地址的方式有几种情况。在生成指令序列的初始状态,测试程序可以随机生成一个地址作为当前指令地址,即测试程序可以将第一条指令写入内存中的一个非特定的地址。在执行完当前指令地址所存储的指令之后,默认情况下,测试程序在当前指令地址上递增一个指令长度作为新的当前指令地址。若刚执行完的指令为跳转指令,其中包含下一条待执行指令存储的地址即为跳转地址,则测试程序获取当前指令地址时,将跳转指令指向的跳转地址作为新的当前指令地址。若刚执行完的指令发生例外情况,则测试程序将预设的例外返回地址作为新的当前指令地址。

可选的,初始化当前指令地址时,还可以初始化寄存器的初始值,寄存器中存储的初始值用于计算测试指令的执行结果,寄存器还可用于保存测试指令的执行结果。

s502:判断当前指令地址是否为已存储任一测试指令的已存储指令地址,若是,执行s503,若否,执行s504。

s503:执行当前指令地址中存储的测试指令并将当前指令地址中存储的测试指令的执行结果加入预期结果序列,执行s501。

s504:判断停止生成指令条件是否满足,若不满足,则执行s505,若满足,则停止生成指令。

其中,可选的,测试程序可以根据内存最大剩余空间设置停止生成指令条件,最大剩余空间为内存中起始于当前指令地址的剩余未存放指令和数据的最大连续空间,例如,停止生成指令条件可以是内存中最大剩余空间无法容纳一条指令。

s505:随机生成测试指令。

其中,测试程序可以随机生成测试指令,测试指令的操作域指示该指令指令类型。当所述测试指令的操作域指示所述测试指令为跳转指令时,测试程序可以控制生成测试指令的跳转地址指向内存中未存放指令和数据的区域,或者,控制测试指令的跳转地址指向内存中已生成的指令的指令地址。

s506:将随机生成的测试指令存储在当前指令地址。

s507:执行当前指令地址存储的测试指令,并将当前指令地址存储的测试指令的执行结果加入预期结果序列,执行s501。

需要说明的是,本领域技术人员应当明了s504为可选的步骤。例如,测试程序可以等待内存空间无法容纳一条指令写入失败时自动停止。

本实施例提供的处理器程序的测试方法的其他技术方案细节和技术效果与图2至图3所示的技术方案相同,此处不再赘述。

图6为本发明提供的处理器程序的测试方法实施例五的流程图。

在图5所示方法的基础上,如图6所示,本实施例的方法可以包括:

s601:获取当前指令地址。

其中,获取当前指令地址的方式有几种情况。在生成指令序列的初始状态,测试程序可以随机生成一个地址作为当前指令地址,即测试程序可以将第一条指令写入内存中的一个非特定的地址。在执行完当前指令地址所存储的指令之后,默认情况下,测试程序在当前指令地址上递增一个指令长度作为新的当前指令地址。若刚执行完的指令为跳转指令,其中包含下一条待执行指令存储的地址即为跳转地址,则测试程序获取当前指令地址时,将跳转指令指向的跳转地址作为新的当前指令地址。若刚执行完的指令发生例外情况,则测试程序将预设的例外返回地址作为新的当前指令地址。

s602:判断当前指令地址是否为已存储任一测试指令的已存储指令地址,若是,执行s603,若否,执行s604。

s603:执行当前指令地址中存储的测试指令并将当前指令地址中存储的测试指令的执行结果加入预期结果序列,执行s601。

s604:判断停止生成指令条件是否满足,若不满足,则执行s605,若满足,则停止生成指令。

其中,可选的,测试程序可以根据内存最大剩余空间设置停止生成指令条件,最大剩余空间为内存中起始于当前指令地址的剩余未存放指令和数据的最大连续空间,例如,停止生成指令条件可以是内存中最大剩余空间无法容纳一条指令。

s605:判断当前指令地址之前的预设内存范围中是否有具有不确定结果的指令且该具有不确定结果的指令的修复指令序列尚未生成完成,若否,执行s606,若是,执行s612。

其中,具有不确定结果的指令的修复指令序列用于将具有不确定结果的指令的输出结果设置为确定结果。具有不确定结果的指令的修复指令序列为测试程序预设的。测试程序可以根据所有具有不确定结果的指令对应的修复指令序列的最大指令数量设置预设内存范围。例如,修复指令序列最多包含3条指令,则预设内存范围可以设置为3倍指令长度。

s606:随机生成测试指令。

其中,测试程序可以随机生成该测试指令的操作域,该测试指令的操作域指示该指令指令类型。当该测试指令的操作域指示该测试指令为跳转指令时,测试程序可以控制生成该测试指令的跳转地址指向内存中未存放指令和数据的区域,或者,控制该测试指令的跳转地址指向内存中已存储指令地址。

s607:判断随机生成的测试指令是否为具有不确定结果的指令,若是,执行s608,若否,执行s609。

s608:判断内存中最大剩余空间是否满足生成具有不确定结果的指令和具有不确定结果的指令对应的修复指令序列,若满足,则执行s609,若不满足,则重新执行s606。

其中,内存中最大剩余空间为内存中起始于当前指令地址的剩余未存放指令和数据的最大连续空间。需要说明的是,重新执行随机生成测试指令时,测试程序可以随机生成一条不是具有不确定结果的指令,使得内存中的剩余空间可以被充分利用。

s609:将随机生成的测试指令存储在当前指令地址。

s610:执行当前指令地址中存储的测试指令并将当前指令地址中存储的测试指令的执行结果加入预期结果序列,执行s601。

s611:将具有不确定结果的指令的修复指令加入该具有不确定结果的修复指令序列,执行s609。

s612:生成具有不确定结果的指令的修复指令,执行该修复指令并将修复指令的执行结果加入预期结果序列,执行s601。

其中,测试程序可选择具有不确定结果的指令对应的修复指令序列中尚未生成的指令中的第一条未生成的指令进行生成。

需要说明的是,本领域技术人员应当明了s604为可选的步骤。例如,测试程序可以等待内存空间无法容纳一条指令写入失败时自动停止。

本实施例提供的处理器程序的测试方法的其他技术方案细节与图2至图4所示的技术方案相同,此处不再赘述。

本发明提供的处理器程序的处理方法,测试程序生成指令序列的过程中,判断当前指令地址为已存储任一测试指令的已存储指令地址时则直接执行当前指令地址中存储的测试指令,即测试程序可生成包含会重复执行的指令的指令序列,对于需要测试重复同一指令的场景,只需要生成一条需重复执行的指令和跳转指令即可,使得处理器程序的测试效率得到极大的提高。同时,在测试程序生成的指令序列中包含具有不确定结果的指令时,在具有不确定结果的指令后生成修复指令,通过修复指令将不确定结果设置为确定结果,从而避免引用不确定结果的指令的结果出现不确定的情况,也可以提高处理器程序测试的效率。

图7为本发明提供的处理器程序的测试方法实施例六的流程图。

本实施例的执行主体可以为运行测试程序的计算机,本实施例的处理方法可以运行于图1所示的交互系统。如图7所示,本实施例的方法可以包括:

s701:判断当前指令地址中存储的测试指令是否会出现不确定结果。

s702:若当前指令地址中存储的测试指令会出现不确定结果,则生成修复指令并将修复指令的执行结果加入预期结果序列;修复指令用于将当前指令地址中存储的测试指令的执行结果重置为确定结果。

在本实施例中,需要说明的是,在生成随机测试程序时需要考虑一类执行结果具有不确定性的指令,例如:无内部互锁流水级的微处理器(microprocessorwithoutinterlockedpipedstages,简称mips)64的div指令,该指令用于实现除法操作,当除数为0时该指令输出的结果是不确定的,而当具有不确定性的指令的执行结果成为后续指令的输入时,会进而使后续指令的结果也具有不确定性,进而后续指令预期结果需要增加判断的分支,导致随机测试程序对后续指令执行正确性的检查的复杂度增加,并且这种复杂度随着具有不确定性的指令的增加而急速增加,因而在生成测试程序时,应尽量避免会出现不确定的指令结果的情况,以降低测试程序生成指令的难度。

本实施例提供的处理器程序的测试方法中,测试程序在生成指令序列的过程中,对于具有不确定结果的指令,测试程序可以针对会出现不确定结果的指令生成修复指令。

可选的,测试程序可以根据当前指令地址存储的测试指令的操作域判断该测试指令是否会出现不确定结果。例如,div指令为预设的可能出现不确定结果的操作域类型。

上述的修复指令用于将所述测试指令的执行结果重置为确定结果。修复指令可以为一条或者多条。例如,div指令的执行结果存放于名为hi和lo的寄存器中,可以通过两条指令将存储目的操作数的寄存器hi和寄存器lo的值变更为确定的数据。具体的,可以在生成div指令后,依次生成将某个寄存器的值拷贝至寄存器hi和寄存器lo的两条指令。

本实施例提供的处理器程序的处理方法,在测试程序生成的指令序列中包含具有不确定结果的指令时,在具有不确定结果的指令后生成修复指令,通过修复指令将不确定结果设置为确定结果,从而避免引用不确定结果的指令的结果出现不确定的情况,提高了处理器程序测试的效率。

图8为本发明提供的处理器程序的测试方法实施例七的流程图。

如图8所示,在图7所示方法的基础上,在s701判断当前指令地址存储的测试指令是否会出现不确定结果之前,可以包括:

s703:判断当前指令地址是否为已存储指令地址。

s704:若当前指令地址不是已存储指令地址,则随机生成测试指令,将测试指令存储在当前指令地址,执行该测试指令并将该测试指令的执行结果加入预期结果序列。

其中,当前指令地址用于指向测试程序生成指令序列的过程中当前待处理的指令的地址。

需要说明的是,在本实施例提供的处理器程序的测试方法中,测试程序生成的指令序列可以被逐个添加到内存中,也可以一次生成后添加到内存中以供处理器执行。处理器的内存的存储空间是以字节为单位进行编址的,指令和数据的大小都是字节的整数倍,保存一条指令的第一个字节的地址是指令地址,默认情况下,一个处理器的所有指令的长度相同。

还需要说明的是,获取当前指令地址的方式可以有多种。

在生成指令序列的初始状态,测试程序可以随机生成一个地址作为当前指令地址,即测试程序可以将第一条指令写入内存中的一个非特定的地址。在执行完当前指令地址所存储的指令之后,默认情况下指令是顺序执行的,测试程序在当前指令地址上递增一个指令长度作为新的当前指令地址。可选的,若刚执行完的指令为跳转指令,其中包含下一条待执行指令存储的地址即为跳转地址,则测试程序获取当前指令地址时,将跳转指令指向的跳转地址作为新的当前指令地址。可选的,若刚执行完的指令发生例外情况,则测试程序将预设的例外返回地址作为新的当前指令地址。

若当前指令地址为已存储指令地址,即当前指令地址指向的内存空间已存储指令,则测试程序不需要生成新的指令而可以直接执行该指令以获取该指令对应的预期结果。指令可以包含操作域和操作数,操作域用于识别指令的功能类型,操作数可以包括源操作数和目的操作数,源操作数为该指令的输入数据,目的操作数用于存储指令相关的输出数据,源操作数可以为固定数据或者为存储在寄存器中的数据或者为存储在内存中固定地址的数据,目的操作数可以存储在寄存器中或者存储在内存的固定地址,若源操作数存储在寄存器中,测试程序可以在生成指令序列前初始化源操作数对应的寄存器。该存储于寄存器的目的操作数还可以用作后续指令的源操作数。测试程序根据执行指令时的源操作数对应的寄存器或内存中固定地址存储的数据获取该指令对应的预期执行结果。

本实施例提供的处理器程序的处理方法,在测试程序生成的指令序列中包含具有不确定结果的指令时,在具有不确定结果的指令后生成修复指令,通过修复指令将不确定结果设置为确定结果,从而避免引用不确定结果的指令的结果出现不确定的情况,提高了处理器程序测试的效率。

图9为本发明提供的处理器程序的测试方法实施例八的流程图。如图9所示,本实施例的方法可以包括:

s901:获取当前指令地址。

其中,获取当前指令地址的方式有几种情况。在生成指令序列的初始状态,测试程序可以随机生成一个地址作为当前指令地址,即测试程序可以将第一条指令写入内存中的一个非特定的地址。在执行完当前指令地址所存储的指令之后,默认情况下,测试程序在当前指令地址上递增一个指令长度作为新的当前指令地址。若刚执行完的指令为跳转指令,其中包含下一条待执行指令存储的地址即为跳转地址,则测试程序获取当前指令地址时,将跳转指令指向的跳转地址作为新的当前指令地址。若刚执行完的指令发生例外情况,则测试程序将预设的例外返回地址作为新的当前指令地址。

s902:判断当前指令地址之前的预设内存范围中是否有具有不确定结果的指令且该具有不确定结果的指令的修复指令序列尚未生成完成,若否,执行s903,若是,执行s909。

其中具有不确定结果的指令的修复指令序列用于将具有不确定结果的指令的输出结果设置为确定结果。具有不确定结果的指令的修复指令序列为测试程序预设的。测试程序可以根据所有具有不确定结果的指令对应的修复指令序列的最大指令数量设置预设内存范围。例如,修复指令序列最多包含3条指令,则预设内存范围可以设置为3倍指令长度。

s903:随机生成测试指令。

其中,测试程序可以随机生成测试指令的操作域,测试指令的操作域指示该指令指令类型。当所述测试指令的操作域指示所述测试指令为跳转指令时,测试程序可以控制生成该测试指令的跳转地址指向内存中未存放指令和数据的区域,或者,控制该测试指令的跳转地址指向内存中已生成的指令的指令地址。

s904:判断随机生成的测试指令是否为具有不确定结果的指令,若是,执行s905,若否,执行s906。

s905:判断内存中最大剩余空间是否满足生成该具有不确定结果的指令和该具有不确定结果的指令对应的修复指令序列,若满足,则执行s907,若不满足,则执行s903。

其中,内存中最大剩余空间为内存中起始于当前指令地址的剩余未存放指令和数据的最大连续空间。需要说明的是,重新执行随机生成测试指令时,测试程序可以随机生成一条不是具有不确定结果的指令,使得内存中的剩余空间可以被充分利用。

s906:判断停止生成指令条件是否满足,若满足,则执行s907,若不满足,则停止生成指令。

其中,测试程序可以根据内存最大剩余空间设置停止生成指令条件,最大剩余空间为内存中起始于当前指令地址的剩余未存放指令和数据的最大连续空间,例如,停止生成指令条件可以是内存中最大剩余空间无法容纳一条指令。可选的,停止生成条件也可以设置为固定的指令数量等。

s907:将随机生成的测试指令存储在当前指令地址。

s908:执行随机生成的测试指令并将随机生成的测试指令的执行结果加入预期结果序列,执行s901。

s909:生成该具有不确定结果的指令的修复指令,执行该修复指令并将修复指令的执行结果加入预期结果序列,执行s901。

其中,测试程序可选择具有不确定结果的测试指令对应的修复指令序列中尚未生成的指令中的第一条未生成的指令进行生成。

本实施例提供的处理器程序的测试方法的其他技术方案细节和技术效果与图6所示的技术方案相同,此处不再赘述。

图10为本发明提供的处理器程序的测试装置的结构示意图。

如图10所示,本实施例的处理器程序的测试装置100,可用于获取对处理器程序进行测试的测试指令序列以及所述测试指令序列的预期结果序列,所述测试指令序列存储于处理器的内存空间,所述测试装置100包括:

获取模块10,用于获取当前指令地址,所述当前指令地址为所述内存中的地址;

判断模块11,用于判断当前指令地址是否为已存储任一测试指令的已存储指令地址,所述测试指令为待测试的处理器程序所支持的指令;

处理模块12,用于若所述当前指令地址为所述已存储指令地址,则执行所述当前指令地址中存储的测试指令,并将所述当前指令地址中存储的测试指令的执行结果加入所述预期结果序列。

可选的,所述处理模块12还可以用于:

若所述当前指令地址不是所述已存储指令地址,则

随机生成测试指令,并将所述随机生成的测试指令存储在所述当前指令地址指向的内存空间中;重复执行判断所述当前指令地址是否为已存储指令地址的步骤。

可选的,所述获取模块10还可以用于:

将随机生成的一个指令地址作为获取的当前指令地址;或者,

获取下一指令地址,将所述下一指令地址作为获取的当前指令地址;或者,

将当前地址递增一个指令长度的地址作为获取的当前指令地址。

进一步的,所述获取模块10,还可以用于:

在所述当前指令地址中存储的测试指令为跳转指令时,将所述跳转指令指向的下一条待执行指令的地址作为所述下一指令地址。

在上述各种处理器程序的测试装置的实施方式的基础上,本发明还提供一种处理器程序的测试装置的可选的实施方式。

可选的,所述判断模块11还可以用于判断所述当前指令地址中存储的测试指令是否会出现不确定结果;

所述处理模块12,还可以用于若所述当前指令地址中存储的测试指令会出现不确定结果,则生成修复指令,将所述修复指令的执行结果加入所述预期结果序列,所述修复指令可以用于将所述当前指令地址中存储的测试指令的执行结果重置为确定结果。

本发明实施例的处理器程序的测试装置具体可以执行图1至图9所示的任一处理器程序的测试方式,其技术方案细节和技术效果与图1至图9所示技术方案类似,此处不再赘述。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

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