基于快速模拟器QEMU的分支指令抓取方法和装置与流程

文档序号:14835384发布日期:2018-06-30 12:10阅读:207来源:国知局
基于快速模拟器QEMU的分支指令抓取方法和装置与流程

本发明涉及计算机技术,尤其涉及一种基于快速模拟器QEMU的分支指令抓取方法和装置。



背景技术:

分支预测器是中央处理器(Central Processing Unit,简称CPU)的一个关键部件,其可以帮助CPU更快的获取指令,加快CPU的运行速度,而分支指令集可以在流片前对分支指令预测器进行验证与测试,从而确定分支预测器的性能,进而决定是否需要对分支预测器做出改进。因此,为有效预测分支预测器的性能,抓取执行程序中的分支指令显得尤为重要。

现有技术一中,通过在CPU主板上添加监控电路,并将该监控电路与存储器连接,以通过监控电路抓取执行程序分支指令,并将抓取到的分支指令存储到存储器中。现有技术二中,通过在执行程序中加入一段监控程序,采用该监控程序来抓取执行程序分支指令。现有技术一及现有技术二提供的分支指令抓取方法均只能抓取一种处理器架构执行程序中的分支指令,无法适用于抓取其他处理器架构的执行程序中的分支指令。



技术实现要素:

本发明提供一种基于快速模拟器QEMU的分支指令抓取方法和装置,以解决现有技术中的分支指令抓取方法只能抓取一种处理器架构的执行程序中的分支指令,无法抓取其他处理器架构的执行程序中的分支指令的问题。

本发明第一方面提供一种基于快速模拟器QEMU的分支指令抓取方法,包括:

在QEMU执行获取待翻译指令时,判断当前所获取的待翻译指令是否为分支指令;

若是,则根据目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令,并将所述分支指令的属性信息进行存储;其中,所述分支指令的属性信息包括所述分支指令的操作码、所述分支指令的指令地址和所述分支指令的跳转地址。

进一步地,所述根据目标程序架构对当前的分支指令执行翻译操作,并将所述分支指令的属性信息进行存储,具体包括:

根据目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令;

根据所述翻译分支指令所属的基本块中其他的翻译指令、所述翻译分支指令、所述当前的分支指令的属性信息得到翻译块,并将所述翻译块存储至缓存块表中;其中,所述缓存块表中包括至少一个翻译块,每个翻译块包括一条翻译分支指令;

将所述分支指令的属性信息存储至分支指令抓取文件中。

进一步地,所述判断当前所获取的待翻译指令是否为分支指令之前,所述方法还包括:

根据当前所获取的待翻译指令的地址,判断所述缓存块表中是否存在第一翻译块,所述第一翻译块为包含所述待翻译指令对应的翻译指令的翻译块;

若所述缓存块表中不存在所述第一翻译块,则判断当前所获取的待翻译指令是否为分支指令。

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

若所述缓存块表中存在所述第一翻译块,则获取所述第一翻译块中的分支指令的属性信息;

将所述第一翻译块中的分支指令的属性信息存储至所述分支指令抓取文件中。

进一步地,所述将所述分支指令的属性信息存储至分支指令抓取文件中之后,所述方法还包括:

执行所述翻译块,获取下一条待翻译指令的地址;

判断所述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。

进一步地,若所述缓存块表中不存在所述第一翻译块,则在判断当前所获取的待翻译指令是否为分支指令之前,所述方法还包括:

根据tb-fast_slow函数查询主机的物理内存,判断所述主机的物理内存中是否存在所述第一翻译块;

若所述主机的物理内存中不存在所述第一翻译块,则判断当前所获取的待翻译指令是否为分支指令。

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

若所述主机的物理内存中存在所述第一翻译块,则将所述第一翻译块存储至所述缓存块表中;

获取所述第一翻译块中的分支指令的属性信息;

将所述第一翻译块中的分支指令的属性信息存储至所述分支指令抓取文件中。

进一步地,所述将所述第一翻译块中的分支指令的属性信息存储至所述分支指令抓取文件中,所述方法还包括:

执行所述第一翻译块,获取一条待翻译指令的地址;

判断所述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。

进一步地,若所述当前所获取的待翻译指令为分支指令,则根据gen_compute_branch函数、tcg_gen_code函数和目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令。

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

屏蔽QEMU中的tb_add_jump函数,以屏蔽所述QEMU中的直接块链机制。

本发明第二方面提供一种基于快速模拟器QEMU的分支指令抓取装置,包括:判断模块和翻译存储模块,其中,

所述判断模块,用于在QEMU执行获取待翻译指令时,判断当前所获取的待翻译指令是否为分支指令;

所述翻译存储模块,用于在所述判断模块判断当前所获取的待翻译指令为分支指令时,根据目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令,并将所述分支指令的属性信息进行存储;其中,所述分支指令的属性信息包括所述分支指令的操作码、所述分支指令的指令地址和所述分支指令的跳转地址。

进一步地,所述翻译存储模块,具体用于根据目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令,并根据所述翻译分支指令所属的基本块中其他的翻译指令、所述翻译分支指令、所述当前的分支指令的属性信息得到翻译块,并将所述翻译块存储至缓存块表中,以及将所述分支指令的属性信息存储至分支指令抓取文件中;其中,所述缓存块表中包括至少一个翻译块,每个翻译块包括一条翻译分支指令。

进一步地,所述判断模块,还用于在判断当前所获取的待翻译指令是否为分支指令之前,根据当前所获取的待翻译指令的地址,判断所述缓存块表中是否存在第一翻译块,若所述缓存块表中不存在所述第一翻译块,则判断当前所获取的待翻译指令是否为分支指令;其中,所述第一翻译块为包含所述待翻译指令对应的翻译指令的翻译块。

进一步地,所述装置还包括:第一获取模块和第一存储模块;

所述第一获取模块,用于在所述判断模块判断所述缓存块表中存在所述第一翻译块时,获取所述第一翻译块中的分支指令的属性信息;

所述第一存储模块,用于将所述第一翻译块中的分支指令的属性信息存储至所述分支指令文件中。

进一步地,所述装置还包括第一处理模块,

所述第一处理模块,用于在所述翻译存储模块将所述分支指令的属性信息存储至分支指令抓取文件中之后,执行所述翻译块,获得下一条待翻译指令的地址;

所述判断模块,还用于判断所述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。

进一步地,所述判断模块还用于在判断所述缓存块表中不存在所述第一翻译块时,在判断当前所获取的待翻译指令是否为分支指令之前,根据tb-fast_slow函数查询主机的物理内存,判断所述主机的物理内存中是否存在所述第一翻译块,并在判断所述主机的物理内存中不存在所述第一翻译块时,判断当前所获取的待翻译指令是否为分支指令。

进一步地,所述装置还包括第二获取模块和第二存储模块,

所述第二存储模块,用于在判断模块判断所述主机的物理内存中存在所述第一翻译块时,将所述第一翻译块存储至所述缓存块表中;

所述第二获取模块,用于获取所述第一翻译块中的分支指令的属性信息;

所述第二存储模块,还用于将所述第一翻译块中的分支指令的属性信息存储在所述分支指令文件中。

进一步地,还包括第二处理模块,所述第二处理模块用于在所述第一存储模块或第二存储模块将所述第一翻译块中的分支指令的属性信息存储至所述分支指令文件中之后,执行所述第一翻译块,获得下一条待翻译指令的地址;

所述判断模块,还用于判断所述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。

进一步地,所述翻译存储模块,具体用于当所述判断模块判断所述当前所获取的待翻译指令为分支指令时,根据gen_compute_branch函数、tcg_gen_code函数和目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令

进一步地,所述翻译存储模块,还用于屏蔽QEMU中的tb_add_jump函数,以将所述缓存块表中的每个翻译块独立存储。

本发明提供的基于快速模拟器QEMU的分支指令抓取方法和装置,在QEMU执行获取待翻译指令时,通过判断当前所获取的待翻译指令是否为分支指令,并在判断当前所获取的待翻译指令是为分支指令根据时,根据目标程序架构对当前的分支指令执行翻译操作,并将上述分支指令的属性信息进行存储。这样,通过对执行程序中的指令进行逐条判断、逐条翻译,并在判断指令为分支指令时,将分支指令的属性信息存储起来,可以抓取不同处理器架构的执行程序中的分支指令、兼容性高、成本低。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明基于快速模拟器QEMU的分支指令抓取方法实施例一的流程图;

图2为本发明基于快速模拟器QEMU的分支指令抓取方法实施例二的流程图;

图3为本发明基于快速模拟器QEMU的分支指令抓取方法实施例三的流程图;

图4为本发明基于快速模拟器QEMU的分支指令抓取方法实施例四的流程图;

图5为本发明基于快速模拟器QEMU的分支指令抓取方法实施例五的流程图;

图6为本发明基于快速模拟器QEMU的分支指令抓取方法实施例六的流程图;

图7为本发明基于快速模拟器QEMU的分支指令抓取装置实施例一的结构示意图;

图8为本发明基于快速模拟器QEMU的分支指令抓取装置实施例二的结构示意图;

图9为本发明基于快速模拟器QEMU的分支指令抓取装置实施例三的结构示意图;

图10为本发明基于快速模拟器QEMU的分支指令抓取装置实施例四的结构示意图;

图11为本发明基于快速模拟器QEMU的分支指令抓取装置实施例五的结构示意图。

具体实施方式

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

本发明提供一种基于快速模拟器QEMU的分支指令抓取方法和装置,以解决现有技术中的分支指令抓取方法只能抓取一种处理器架构的执行程序中的分支指令,无法抓取其他处理器架构的执行程序中的分支指令的问题。

本发明提供的基于快速模拟器QEMU的分支指令抓取方法和装置,可应用于程序测试领域,具体地,可应用本发明提供的基于快速模拟器QEMU的分支指令抓取方法和装置,来抓取不同处理器架构的执行程序中的分支指令。例如,不同处理器架构包括X86架构、MIPS架构、ARM架构等。

下面以具体的实施例对本发明的技术方案进行详细说明。下面这几个实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。

在介绍本发明提供的基于快速模拟器QEMU的分支指令抓取方法和装置之前,我们先来简单介绍一下快速模拟器(Quick Emulator,简称QEMU)。

具体地,QEMU是一个开源软件,能够在通用的Linux和Windows平台实现一个纯软件模拟集成开发环境,模拟常见的嵌入式计算机系统。

QEMU支持全系统模拟模式,该模式可模拟整个计算机系统(包括处理器和外部设备),并且能够在合理的速度下使用动态翻译模拟许多不同架构的处理器。例如,可在X86系统上模拟Mips系统、ARM系统等。具体地,当在一台CPU架构为X86架构的计算机上安装上QEMU后,借助QEMU可在上述计算机上模拟MIPS架构的CPU,进而可在上述计算机上运行MIPS程序。

此外,QEMU的运行就是不断的取指、翻译、执行的过程,其中,取指是指取得源指令体系结构的指令,翻译是指将源指令翻译成目标指令,执行是指在本机上执行目标指令。。

再简单介绍了QEMU之后,下面来详细介绍本发明提供的基于快速模拟器QEMU的分支指令抓取方法和装置。

图1为本发明基于快速模拟器QEMU的分支指令抓取方法实施例一的流程图。本发明实施例的执行主体可以为基于快速模拟器QEMU的分支指令抓取装置,还可以为集成了该抓取装置的的硬件设备,例如计算机。本发明实施例以执行主体为安装了QEMU的计算机为例来进行说明。本实施例涉及的是判断当前所获取的待翻译指令是否为分支指令,进而在判断当前所获取的分支指令是分支指令时,对上述分支指令执行翻译操作,并存储分支指令的属性信息的具体过程。如图1所示,本实施例提供的基于快速模拟器QEMU的分支指令抓取方法,可以包括如下步骤:

S101、在QEMU执行获取待翻译指令时,判断当前所获取的待翻译指令是否为分支指令。

具体地,本实施例以执行主体为安装了QEMU,且CPU架构为X86架构的计算机为例,且以计算机当前加载的是纳斯达克交易代码(Million Instructions Per Second,简称MIPS)架构的程序为例来进行说明。

本步骤中,根据待翻译指令的操作码类型来判断待翻译指令是否为分支指令。需要说明的是,当执行程序为某一架构的程序时,该程序的分支指令的操作码类型满足预设规则,可根据待翻译指令的操作码类型是否满足上述预设规则来判断待翻译指令是否为分支指令。

可选地,可以通过decode_opc函数来判断当前所获取的待翻译指令是否为分支指令。

S102、若是,则根据目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令,并将上述分支指令的属性信息进行存储;其中,上述分支指令的属性信息包括上述分支指令的操作码、上述分支指令的指令地址和上述分支指令的跳转地址。

本实施例中,由于上述计算机的CPU架构为X86架构,因此目标程序架构为X86架构,为了使得计算机当前加载的MIPS架构的程序能够在上述计算机上顺利运行,需要将上述MIPS架构的执行程序翻译为X86架构的程序,当将上述MIPS结构的程序经过翻译操作后,可在上述计算机上运行时,便可将上述MIPS程序中的分支指令抓取出来。

具体地,本步骤中,若判断当前所获取的待翻译指令是为分支指令,则对当前的分支指令执行翻译操作,得到翻译分支指令,同时,获取上述分支指令的属性信息,并将上述分支指令的属性信息存储起来。这样,通过对MIPS结构的程序中的指令进行逐条判断、逐条翻译,并在判断指令为分支指令时,将分支指令的属性信息存储起来,可得到上述MIPS架构的程序的分支指令轨迹,具体地,分支指令轨迹中包括上述MIPS架构的程序中的所有分支指令,并且能够从上述分支指令轨迹中明显的看出一条分支指令被执行了多少次,且每次执行时的跳转地址。

需要说明的是,本发明提供的基于快速模拟器QEMU的分支指令抓取方法,在QEMU执行获取待翻译指令时,通过对执行程序中的指令进行逐条判断、逐条翻译,并在判断指令为分支指令时,将分支指令的属性信息抓取出来,这样,通过对不同处理器架构的执行程序执行翻译操作,可在不同处理器架构的执行程序运行时,将上述不同处理器架构的执行程序中的分支指令均抓取出来,因此,本发明提供的基于快速模拟器QEMU的分支指令抓取方法,可抓取不同处理器架构的执行程序中的分支指令,兼容性高、成本低。

本实施例提供的基于快速模拟器QEMU的分支指令抓取方法,在QEMU执行获取待翻译指令时,通过判断当前所获取的待翻译指令是否为分支指令,并在判断当前所获取的待翻译指令是为分支指令根据时,根据目标程序架构对当前的分支指令执行翻译操作,并将上述分支指令的属性信息进行存储。这样,通过对执行程序中的指令进行逐条判断、逐条翻译,并在判断指令为分支指令时,将分支指令的属性信息存储起来,可以抓取不同处理器架构的执行程序中的分支指令、兼容性高、成本低。

图2为本发明实施例二提供的基于快速模拟器QEMU的分支指令抓取方法的流程图。本实施例涉及的是对当前的分支指令执行翻译操作,并将分支指令的属性信息进行存储的过程。在上述实施例的基础上,若判断所获取的待翻译指令为分支指令时,本实施例提供的基于快速模拟器QEMU的分支指令抓取方法,还可以包括以下步骤:

S201、根据目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令。

具体地,结合上面的例子,继续假设目标程序架构为X86架构。本步骤中,对当前的分支指令执行翻译操作,将MIPS架构的分支指令翻译为X86架构的翻译分支指令。

可选地,采用gen_compute_branch函数、tcg_gen_code函数将分支指令翻译为翻译分支指令。

下面来简单介绍一下在判断当前所获取的待翻译指令是否为分支指令,并在判断上述待翻译指令为分支指令时,将分支指令翻译为翻译分支指令的过程中,QEMU中各函数的具体调用过程。具体地,tb_gen_code函数调用cpu_gen_code函数,cpu_gen_code函数调用gen_intermediate_code函数,gen_intermediate_code调用gen_intermediate_code_internal函数,gen_intermediate_code_internal调用decode_opc函数来判断当前所获取的待翻译指令是否为翻译指令,若是,则decode_opc函数调用gen_computer_branch函数将分支指令代码翻译为通用的中间码,之后,cpu_gen_code函数调用tcg_gen_code将翻译好的通用的中间码翻译为目标程序架构的翻译指令。

S202、根据上述翻译分支指令所属的基本块中其他的翻译指令、上述翻译分支指令、上述当前的分支指令的属性信息得到翻译块,并将上述翻译块存储至缓存块表中;其中,上述缓存块表中包括至少一个翻译块,每个翻译块包括一条翻译分支指令。

具体地,测试程序包含多条指令。且QEMU的翻译粒度是基本块,基本块是指程序顺序执行的语句序列,其中只有一个入口和一个出口,入口就是其中的第一个语句,出口就是其中的最后一个语句。本实施例中,基本块指从入口语句到分支指令语句的语句序列。例如,在QEMU从执行程序的第一条指令开始对执行程序中的指令逐条进行翻译操作时,当遇到分支指令后,翻译终止。此时,将第一条指令到分支指令之间的指令(包括分支指令)对应的翻译指令作为一个基本块,并将当前的分支指令的属性信息存储到上述基本块的结构体中,得到翻译块。再例如,当将上述翻译块执行完后,执行结果返回下一个待翻译的指令的地址,此时,QEMU从上述下一条待翻译的指令开始对执行程序中的指令逐条进行翻译操作,直至遇到下一条分支指令时,翻译终止。此时,将上述下一条待翻译的指令与当前分支指令之间的指令对应的翻译指令作为一个基本块,并将当前的分支指令的属性信息存储至上述基本块的结构体中,得到翻译块。例如,执行程序包括如下几条指令:指令1、指令2、指令3、指令4、指令5、指令6、指令7、指令8、指令9、指令10、指令11、指令12、指令13、指令14、指令15,其中,指令5为分支指令。假设QEMU当前所获取的指令为指令1,经判断该指令不是分支指令,这样,QEMU逐条对上述指令1、指令2、指令3、指令4进行翻译,当翻译到指令5时,此时,经过判断,确定指令5为分支指令,此时,将分支指令翻译为翻译分支指令,并将指令1、指令2、指令3、指令4对应的翻译指令和指令5对应的翻译分支指令组成一个基本块,并将指令5的属性信息存储到上述基本块中的结构体中,得到翻译块。

需要说明的是,缓存块表中包括至少一个翻译块,翻译块中包含的指令为已经翻译过的指令。

S203、将上述分支指令的属性信息存储至分支指令抓取文件中。

需要说明的是,分支指令抓取文件为一个独立的文件,该文件中存储有分支指令的属性信息。

S204、执行上述翻译块,获取下一条待翻译指令的地址。

具体地,QEMU的翻译过程是一个边翻译边执行的过程,当得到一个翻译块后,就会在本机上执行上述翻译块,执行结束后,向计算机返回下一条待翻译指令的地址。

S205、判断上述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。

具体地,通过判断-翻译-执行的重复过程,继续根据下一条待翻译指令的地址判断下一条待翻译指令是否为分支指令,重复上述实施例一的过程,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。这样,可将执行程序中的所有分支指令均抓取出来,即上述抓取文件中存储了该执行程序中的所有分支指令,构成了分支指令轨迹。

本实施例提供的基于快速模拟器QEMU的分支指令抓取方法,根据目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令,并根据上述翻译分支指令所属的基本块中其他的翻译指令、上述翻译分支指令、上述当前的分支指令的属性信息得到翻译块,并将上述翻译块存储至缓存块表中,以及将上述分支指令的属性信息存储至分支指令抓取文件中。这样,不仅在分支指令文件中存储了分支指令的属性信息,而且在翻译块中也存储了分支指令的属性信息。进一步地,通过执行上述翻译块,获取下一条待翻译指令的地址,判断上述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。这样,可将整个执行程序中的分支指令均抓取出来,保证了分支指令的完整性。

图3为本发明基于快速模拟器QEMU的分支指令抓取方法实施例三的流程图。本实施例涉及的是在判断当前所获取的待翻译指令是否为分支指令之前,判断缓存块表中是否存在包含待翻译指令对应的翻译指令的翻译块的过程。在上述实施例的基础上,本实施例提供的基于快速模拟器QEMU的分支指令抓取方法,在步骤S101之前,还可以包括以下步骤:

S301、根据当前所获取的待翻译指令的地址,判断缓存块表中是否存在第一翻译块,上述第一翻译块为包含上述待翻译指令对应的翻译指令的翻译块。

可选地,采用tb_find_fast函数根据当前的待翻译指令的地址,在缓存块表中查询是否存在包含上述待翻译指令对应的翻译指令的翻译块。

需要说明的是,若缓存块表中存在包含上述待翻译指令对应的翻译指令的翻译块,则说明上述待翻译指令之前已经被翻译过。

S302、若上述缓存块表中不存在上述第一翻译块,则判断当前所获取的待翻译指令是否为分支指令。

本步骤,若缓存块表中不存在上述第一翻译块,则说明当前的待翻译指令之前没有被翻译过,此时,则判断当前所获取的待翻译指令是否为分支指令,并在判断当前所获取的待翻译指令是否为翻译指令之后,对上述待翻译指令执行翻译操作。

本实施例提供的基于快速模拟器QEMU的分支指令抓取方法,在判断当前所获取的待翻译指令是否为分支指令之前,通过判断所述缓存块表中是否存在第一翻译块,若不存在的时候,再判断当前所获取的待翻译指令是否为分支指令,这样,可避免对重复的指令进行重复翻译的过程,可提高分支指令指令的抓取速度,简化分支指令的抓取步骤。

图4为本发明基于快速模拟器QEMU的分支指令抓取方法实施例四的流程图。本实施例涉及的是若上述缓存表中存在第一翻译块时,根据翻译块将分支指令进行抓取的过程。在上述实施例的基础上,本实施例提供的基于快速模拟器QEMU的分支指令抓取方法,在步骤S301之后,还可以包括以下步骤:

S401、若上述缓存块表中存在上述第一翻译块,则获取上述第一翻译块中的分支指令的属性信息。

具体地,若缓存块表中存在第一翻译块,则说明当前的待翻译指令已经被翻译过,且第一翻译块中存储有分支指令的属性信息。因此,本步骤中,若缓存块表中存在所述第一翻译块,则直接获取上述第一翻译块中的分支指令的属性信息。

S402、将上述第一翻译块中的分支指令的属性信息存储至分支指令抓取文件中。

具体地,本步骤中,将获取到的分支指令的属性信息存储至分支指令文件夹中。

S403、执行上述第一翻译块,获得下一条待翻译指令的地址。

具体地,本步骤中,当执行完第一翻译块后,向计算机返回下一条待翻译指令的地址。

S404、判断上述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。

本步骤中,继续根据下一条待翻译指令的地址判断下一条待翻译指令是否为分支指令,重复上述实施例一的过程,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。这样,便将待翻译程序中的所有分支指令均抓取出来。

本实施例提供的基于快速模拟器QEMU的分支指令抓取方法,若上述缓存块表中存在上述第一翻译块,则获取上述第一翻译块中的分支指令的属性信息,并将上述第一翻译块中的分支指令的属性信息存储至所述分支指令抓取文件中。这样,可避免对同样地待翻译指令进行重复的翻译,可提高分支指令的抓取速度。此外,本实施例中,通过执行上述第一翻译块,获得下一条待翻译指令的地址,进而判断上述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。这样,可将整个待翻译程序的分支指令均抓取出来,以保证分支指令的完整性。

进一步地,本实施例中,所述方法还包括:屏蔽QEMU中的tb_add_jump函数,以屏蔽所述QEMU中的直接块链机制。

具体地,QEMU的二进制翻译中存在直接块链机制,即把顺序执行的至少两个翻译块链接在一起,以使上述至少两个翻译块在下次执行的时候连续执行,例如,将顺序执行的翻译块1和翻译块2链接在一起,这样,在执行翻译块1时,将翻译块2也一起执行。这样,将无法获取翻译块2中的分支指令的属性信息。因此,本发明中,将QEMU中实现上述机制的功能函数tb_add_jump函数屏蔽掉,以屏蔽所述QEMU中的直接块链机制。这样,可避免翻译块1和翻译块2链接,可分别获取翻译块1的分支指令的属性信息以及翻译块2中的分支指令的属性信息,以保证分支指令的完整性。

本实施例提供的基于快速模拟器QEMU的分支指令抓取方法,通过屏蔽QEMU中的tb_add_jump函数,以屏蔽所述QEMU中的直接块链机制,这样,可避免顺序执行的基本块链接在一起,进而一起执行,可使顺序执行的基本块单独存储,进而单独执行,进而可获取每个翻译块中的分支指令的属性信息,保证分支指令的完整性。

图5为本发明基于快速模拟器QEMU的分支指令抓取方法实施例五的流程图。本发明涉及的是若缓存块表中不存在第一翻译块时,分支指令的抓取方法。在实施例三的基础上,在步骤S301之后,若判断缓存块表中不存在第一翻译块时,所述方法还可以包括以下步骤:

S501、根据tb-fast_slow函数查询主机的物理内存,判断上述主机的物理内存中是否存在上述第一翻译块,若否,则执行步骤S502,若是,则执行步骤S503-S507。

具体地,主机的物理内存在主机运行时为操作系统和各种程序提供临时储存。本实施例中,若当前所获取的待翻译指令之前已经被翻译过,则主机的物理内存中必然存在包含上述待翻译指令对应的翻译指令的翻译块,因此,当缓存块表中不存在第一翻译块时,继续查询主机的物理内存中是否存在上述第一翻译块,以确定当前所获取的待翻译指令是否之前已经被翻译过,避免重复翻译。

S502、判断当前所获取的待翻译指令是否为分支指令。

具体地,该步骤的具体实现方法及实现原理可以参见实施例一的步骤S101的描述,在此不再赘述。

S503、若上述主机的物理内存中存在上述第一翻译块,则将上述第一翻译块存储至上述缓存块表中。

具体地,本步骤,若主机的物理内存中存在上述第一翻译块,由于物理内存提供的仅仅是临时存储的功能,因此,需要将第一翻译块存储至翻译块表中。

S504、获取上述第一翻译块中的分支指令的属性信息。

S505、将上述第一翻译块中的分支指令的属性信息存储至上述分支指令抓取文件中。

S506、执行上述第一翻译块,获取一条待翻译指令的地址。

S507、判断上述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。

具体地,步骤S504至S507的具体实现方法及实现原理可以参见实施例四的步骤S401至S404的描述,在此不再赘述。

需要说明的是,本实施例中,当缓存块表中不存在第一翻译块时,通过继续查询主机的物理内存中是否存在上述第一翻译块,可避免若当前所获取的待翻译指令之前已经被翻译的情况下,对当前所获取的待翻译指令进行重复翻译的过程,可提高分支指令的抓取速度,简化分支指令的抓取步骤。

本实施例提供的基于快速模拟器QEMU的分支指令抓取方法,若缓存块表中不存在第一翻译块时,通过查询主机的物理内存,以判断上述主机的物理内存是否存在上述第一翻译翻译块,这样,可精确地确定当前所获取的待翻译指令之前是否已经被翻译过,避免若当前所获取的待翻译指令之前已经被翻译的情况下,对当前所获取的待翻译指令进行重复翻译的过程,这样,可提高分支指令的抓取速度,简化分支指令的抓取步骤。

图6为本发明基于快速模拟器QEMU的分支指令抓取方法实施例六的流程图。本实施例涉及的是基于快速模拟器QEMU的分支指令抓取方法的整个过程,在上述实施例的基础上,本实施例提供的方法,可以包括以下步骤:

S601、根据当前所获取的待翻译指令的地址,判断缓存块表中是否存在第一翻译块,上述第一翻译块为包含上述待翻译指令对应的翻译指令的翻译块;若上述缓存块表中存在上述第一翻译块,则执行步骤S602-S605;若上述缓存块表中不存在上述第一翻译块,则执行步骤S606,其中,上述第一翻译块为包含上述待翻译指令对应的翻译指令的翻译块。

具体地,该步骤的具体实现方法及实现原理可以参见实施例三的步骤S301的描述,在此不再赘述。

S602、获取上述第一翻译块中的分支指令的属性信息。

S603、将上述第一翻译块中的分支指令的属性信息存储至分支指令抓取文件中。

S604、执行上述第一翻译块,获取下一条待翻译指令的地址。

S605、判断上述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。

具体地,步骤S602至S605的具体实现方法及实现原理可以参见实施例四的步骤S401至S404的描述或实施例五的步骤S504至S507的描述,在此不再赘述。

S606、根据tb-fast_slow函数查询主机的物理内存,判断上述主机的物理内存中是否存在上述第一翻译块,若是,则执行步骤S607,并在执行完步骤S607之后,执行步骤S602-S605;若否,则执行步骤S608。

具体地,该步骤的具体实现方法及实现原理可以参见实施例五的步骤S501的描述,在此不再赘述。

S607、将上述第一翻译块存储至上述缓存块表中。

具体地,该步骤的具体实现方法及实现原理可以参见实施例五的步骤S503的描述,在此不再赘述。

S608、在QEMU执行获取待翻译指令时,判断当前所获取的待翻译指令是否为分支指令,若当前所获取的待翻译指令为分支指令,则执行步骤S609-S613,若当前所获取的待翻译指令不为分支指令,则执行步骤S614。

具体地,该步骤的具体实现方法及实现原理可以参见实施例一的步骤S101的描述,在此不再赘述。

S609、根据目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令。

S610、根据上述翻译分支指令所属的基本块中其他的翻译指令、上述翻译分支指令、上述当前的分支指令的属性信息得到翻译块,并将上述翻译块存储至上述缓存块表中;其中,上述缓存块表中包括至少一个翻译块,每个翻译块包括一条翻译分支指令。

S611、将上述分支指令的属性信息存储至分支指令抓取文件中。

S612、执行上述翻译块,获取下一条待翻译指令的地址。

S613、判断上述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。

具体地,步骤S609至S613的具体实现方法及实现原理可以参见实施例二的步骤S201至S205的描述,在此不再赘述。

S614、根据目标程序架构对上述待翻译指令执行翻译操作,得到翻译指令,并判断下一条待翻译指令是否为分支指令,直至下一条待翻译指令为分支指令为止。

具体地,若当前所获取的待翻译指令不是分支指令时,则根据待翻译指令的类型,采用相应的函数将上述待翻译指令翻译为翻译指令,并继续判断下一条待翻译指令是否为分支指令,直至下一条待翻译指令为分支指令为止。

本实施例提供的基于快速模拟器QEMU的分支指令抓取方法,不仅能够抓取不同架构的执行程序中的分支指令,兼容性高、成本低,并且抓取分支指令的速度较快,且能够保证抓取的分支指令的完整性。

图7为本发明基于快速模拟器QEMU的分支指令抓取装置实施例一的结构示意图。该装置可以通过软件、硬件或者软硬结合的方式实现,可选的,该装置可以是集成了基于快速模拟器QEMU的分支指令抓取装置的计算机。如图7所示,本实施例提供的基于快速模拟器QEMU的分支指令抓取装置,可以包括:判断模块100和翻译存储模块200,其中,

判断模块100,用于在QEMU执行获取待翻译指令时,判断当前所获取的待翻译指令是否为分支指令;

翻译存储模块200,用于在判断模块100判断当前所获取的待翻译指令为分支指令时,根据目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令,并将上述分支指令的属性信息进行存储;其中,上述分支指令的属性信息包括上述分支指令的操作码、上述分支指令的指令地址和上述分支指令的跳转地址。

本实施例的装置,可以用于执行图1所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。

进一步地,翻译存储模块200,具体用于当判断模块100判断所述当前的待翻译指令为分支指令时,根据gen_compute_branch函数、tcg_gen_code函数和目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令

进一步地,翻译存储模块200,具体用于根据目标程序架构对当前的分支指令执行翻译操作,得到翻译分支指令,并根据上述翻译分支指令所属的基本块中其他的翻译指令、上述翻译分支指令、上述当前的分支指令的属性信息得到翻译块,并将上述翻译块存储至缓存块表中,以及将上述分支指令的属性信息存储至分支指令抓取文件中;其中,上述缓存块表中包括至少一个翻译块,每个翻译块包括一条翻译分支指令。

本实施例的装置,可以用于执行图2所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。

进一步地,判断模块100,还用于在判断当前所获取的待翻译指令是否为分支指令之前,根据当前所获取的待翻译指令的地址,判断上述缓存块表中是否存在第一翻译块,若上述缓存块表中不存在上述第一翻译块,则判断当前所获取的待翻译指令是否为分支指令,其中,上述第一翻译块为包含所述待翻译指令对应的翻译指令的翻译块。

本实施例的装置,可以用于执行图3所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。

图8为本发明基于快速模拟器QEMU的分支指令抓取装置实施例二的结构示意图。在上述实施例的基础上,本实施例提供的装置,还包括第一处理模块300,

第一处理模块300,用于在翻译存储模块200将上述分支指令的属性信息存储至分支指令抓取文件中之后,执行上述翻译块,获得下一条待翻译指令的地址;

判断模块100,还用于判断上述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。

本实施例的装置,可以用于执行图2所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。

图9为本发明基于快速模拟器QEMU的分支指令抓取装置实施例三的结构示意图。在上述实施例的基础上,本实施例提供的装置,还包括:第一获取模块400和第一存储模块500,

第一获取模块400,用于在判断模块100判断缓存块表中存在上述第一翻译块时,获取上述第一翻译块中的分支指令的属性信息;

第一存储模块500,用于将上述第一翻译块中的分支指令的属性信息存储至上述分支指令文件中。

本实施例的装置,可以用于执行图4所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。

进一步地,判断模块100还用于在上述缓存块表中不存在所述第一翻译块,在判断当前所获取的待翻译指令是否为分支指令之前,根据tb-fast_slow函数查询主机的物理内存,判断上述主机的物理内存中是否存在上述第一翻译块;并在判断上述主机的物理内存中不存在上述第一翻译块时,判断当前所获取的待翻译指令是否为分支指令。

本实施例的装置,可以用于执行图5所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。

图10为本发明基于快速模拟器QEMU的分支指令抓取装置实施例四的结构示意图。在上述实施例的基础上,本实施例提供的装置,还包括:第二获取模块600和第二存储模块700,

第二存储模块700,用于在判断模块100判断主机的物理内存中存在上述第一翻译块时,将上述第一翻译块存储至上述缓存块表中;

第二获取模块600,用于获取上述第一翻译块中的分支指令的属性信息;

第二存储模块700,还用于将上述第一翻译块中的分支指令的属性信息存储在上述分支指令文件中。

本实施例的装置,可以用于执行图5所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。

图11为本发明基于快速模拟器QEMU的分支指令抓取装置实施例五的结构示意图。在上述实施例的基础上,本实施例提供的装置,还包括第二处理模块800,

第二执行模800用于在第一存储模块400或第二存储模块700将上述第一翻译块中的分支指令的属性信息存储至上述分支指令文件中之后,执行上述第一翻译块,获得下一条待翻译指令的地址;

判断模块100,还用于判断上述下一条待翻译指令是否为分支指令,直至待翻译程序中的每一条待翻译指令均执行翻译操作为止。

进一步地,翻译存储模块200,还用于屏蔽QEMU中的tb_add_jump函数,以将上述缓存块表中的每个翻译块独立存储。

本实施例的装置,可以用于执行图4和图5所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。

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

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

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