使用JIT编译器并绕过所选择目标代码块的转译的目标系统的仿真的制作方法

文档序号:19734641发布日期:2020-01-18 04:19阅读:252来源:国知局
使用JIT编译器并绕过所选择目标代码块的转译的目标系统的仿真的制作方法

本公开涉及软件编译器。更具体地,本公开涉及对被编写为在一个设备架构上运行的代码进行转译以在第二个不同设备架构上运行。



背景技术:

在第二计算机平台(“主机系统”)上仿真第一计算机平台(“目标系统”)的功能使得主机系统可以执行针对目标系统设计的程序的过程称为“仿真”。通常通过创建将针对目标平台设计的程序指令(目标代码指令)转换成主机平台的本机语言(主机指令)的软件来实现仿真,由此实现兼容性。也通过创建“虚拟机”来实现仿真,在所述“虚拟机”中,目标平台的物理架构——硬件本身的设计——通过软件中的虚拟模型进行复制。

当前通常使用两种主要类型的仿真策略。第一种策略称为“解释”,其中每个目标代码指令在被寻址时依次被解码,从而产生其后待执行的语义上等同于目标代码指令的小的主机指令序列。这种仿真器的主要组件通常是软件解释器,所述软件解释器将呈目标机器语言的程序的每个指令转换成呈主机机器语言的一组指令,其中主机机器语言是用于仿真目标机器的主机计算机的代码语言。在一些情况下,解释器已在计算机硬件或固件中实现,从而使得能够相对快速地执行仿真程序。

另一种主要的仿真策略称为“转译”,其中目标指令被分析和解码。这也称为“重新编译”或“交叉编译”。熟知的是,解释器通常会大大降低计算机程序的执行速度。与当将等同的程序重新编译成目标机器代码并执行目标代码版本时相比,当通过仿真执行计算机程序时,所述计算机程序运行慢十至二十倍并不少见。由于熟知的软件仿真速度慢,通过在运行时间将目标程序的部分转译成主机机器代码,并且然后执行重新编译的程序部分,多个产品已经成功地改进了执行源应用的速度。虽然每个目标代码指令的转译过程可能耗费(例如)50至100个机器或时钟周期,但平均而言,所得主机机器代码的更快的速度足以改进大多数源应用的总体执行速度。

一些运行时转译系统使用称为即时(jit)转译或编译的方法来基于需要将目标软件转译成主机软件。例如,在以上通过引用方式并入的美国专利号8,245,202b2、7,792,666b2、7,813,909b2和7,770,050b2中描述了采用jit转译方案的实例仿真。这种运行时jit方案通常用于转译具有动态性质的目标软件。在性质上是动态的软件中,代码的部分可在执行之前动态地改变。例如,在目标系统内,可执行代码可通过加载新的可执行文件、加载覆盖、运行时代码生成或自修改代码来动态地改变。动态代码改变还可通过经由多个路径修改存储器来发生,诸如通过执行系统调用,通过来自各种设备的直接存储器访问(dma)传输,或简单地通过执行用户代码。

本公开的各方面正是在此背景下产生。

附图说明

通过结合附图考虑以下详细描述,可以易于理解本发明的教义,在附图中:

图1a是现有技术目标系统代码的框图。

图1b是根据本公开的各方面的包含目标系统代码和jit编译器的非暂时性计算机可读存储器的框图。

图2是描绘根据本公开的各方面的选择并插入替代的主机代码的过程的流程图。

图3描绘根据本公开的各方面的主机系统的硬件配置。

图4描绘根据本公开的各方面的主机系统的cpu核心架构。

引言

由于目标系统的配置与主机系统的配置之间的差异,对被编写用于目标系统的代码进行转译以在主机系统上运行可能会遇到困难。这些差异导致当从被编写用于目标系统的代码直接转译为与主机系统兼容的代码时代码块可能不兼容。也称为问题目标代码(ptc)块的这些代码段也可能是在原始目标系统代码的质量检查期间从未删除的不必要的代码区段。ptc块可能导致已转译代码在主机系统上无法运行或运行不佳。如本文所用,术语问题目标代码块或ptc块是指一个或多个代码的非分支序列。ptc块的实例包括被编写用于调试应用的目标系统代码的代码块,或在应用的目标系统代码的质量保证过程期间未修复的编写不佳或损坏的目标代码序列。

具体实施方式

尽管以下详细描述为了说明目的包含许多具体细节,但是本领域任何普通技术人员将理解的是,以下细节的许多变化和更改在本发明的范围内。因此,在不丧失所主张发明的一般性且不对其强加限制的情况下提出以下所描述的本发明的示例性实施方案。

图1a描绘嵌入在诸如ram、rom、cd-rom、dvd-rom、蓝光、闪存存储器、软盘、硬盘、磁带等的非暂时性计算机可读介质中的现有技术目标系统程序的实例。目标系统程序可包括标头101,其向目标系统通知诸如文件名、文件大小、文件类型、兼容性信息和文件连续性哈希码的信息。现有技术目标系统程序还包括目标系统代码102。目标系统代码102可以是被编写为在遗留系统(即,主机系统的早期版本)或与主机系统不兼容的计算机系统上运行的程序。目标系统代码102可采用诸如机器代码、汇编的低级编程语言,或者采用诸如c、c++、c#的混合级编程语言或诸如perl或visualbasic的高级语言等。

图1b描绘根据本公开的某些方面的非暂时性计算机可读介质100的实例。在此非限制性实例中,目标系统程序嵌入有包括jit编译器的仿真程序。如在现有技术的情况下,目标程序可包括前述的标头101和目标系统代码102。在此特定实例中,非暂时性计算机可读介质100包括被配置为将目标系统代码102转译成主机系统代码的jit编译器103,如以下进一步详细讨论的。非暂时性计算机可读介质100还可包括替代的主机代码区段104的数据库,jit编译器103可以使用所述替代的主机代码区段来实现如将在下一节中讨论的问题目标代码块处理指令。jit编译器103和替代的主机代码区段104的数据库可位于主机系统上的存储器或逻辑器中,或者嵌入在目标系统代码102的同一非暂时性介质中,然而,本公开的各方面并不限于此类实现方式。在替代的实现方式中,目标系统代码102、jit编译器103和替代的主机代码区段104可存储在单独的计算机可读介质中,所述计算机可读介质都可由主机系统(例如,通过网络)访问。

图2描绘根据本公开的各方面的用于处理问题目标系统代码的方法。在图2中虚线箭头意欲指示数据流程,并且实线箭头意欲指示计算操作流程。

根据本公开的一个方面,主机系统可实施一种在主机系统上用ptc块仿真目标代码的方法200。同样,仿真方法200可远程实施并通过网络发送到主机系统。为了便于描述,本文中所述方法将被描述为在主机系统上实施。为了起动主机系统,可启动被编写用于目标系统的程序102。在选择目标代码系统时,标头101可通知主机系统代码102被编写用于目标系统。目标系统代码102可同时具有非问题目标代码块201和问题测试代码块202。主机系统将调用将实施过程212的jit编译器103。最初,jit编译器评估代码中是否存在ptc块,如在203处所指示的。如果jit编译器在203处判定块是非ptc块201,那么将非ptc块201转译205成对应的主机系统代码207并插入到主机系统执行流中,如在208处所指示的。

jit编译器103可采用多种技术来评估目标代码块是否为在202处的ptc块。首先,jit编译器103可评估代码是否性能欠佳。jit编译器103可检测目标代码中的冗余。jit编译器103还可检测在整个程序中多次引用的代码行数,并监测执行引用的代码所耗费的时间。另外,jit编译器103可检测被编写用于目标系统的具体组件(例如,精简指令集计算(risc)指令集架构(诸如mips架构)中的向量单元,或cell宽带架构中的协同处理单元(spu))的代码。其他检测方法可包括检测目标代码102是否被编程为在目标系统上利用比主机系统上更大的寄存器。在其他实现方式中,可在测试阶段期间标识ptc块202,在所述测试阶段中,将目标系统代码正常转译成主机系统代码并监测所得代码的性能。如果已转译代码运行不佳或根本没有运行,则可分析目标系统代码的对应部分,以确定导致潜在问题的模式并生成替代的主机系统代码。然后,jit编译器103可以被配置(例如,被编程)为在运行时识别这些模式。为了高效地识别这些ptc块,jit103编译器可被配置为标识地址块的起始并生成目标系统代码102的每个块的哈希值。jit编译器103可被配置为识别与替代的主机代码区段104相关联的ptc块202的哈希值。

在测试阶段期间,开发人员可通过分析已转译代码的性能来标识问题代码块。例如,开发人员可检查性能计数器(例如,性能分析器)或地址命中计数器(以确定块已经执行了多少次)或通过手动确定哪个代码块‘运行不佳’。可自动进行此类分析以确定使用‘替代的主机代码’将更有利地仿真哪些目标代码块。

在一些实现方式中,jit编译器103可以(例如)通过模拟执行已转译目标代码块并且检测错误并标识来自所述错误的问题的性质来“学习”哪些代码块在运行中是有问题的。通过举例而非限制的方式,jit编译器103或主机系统可(例如)通过适当的编程和/或硬件配置被配置为检测目标代码中有资格作为ptc的特定的存储器访问序列。此类模式可产生关于目标硬件的具体编程问题的最佳解决方案,但是导致问题,例如,当在主机硬件上如实执行时系统存储器停顿。这种模式的一个实例在行业内称为存储至加载转发(stlf)。通过插桩追踪存储器读/写模式并过滤可能的stlf候选对象,可在运行时完成追踪存储器访问的过程,但是也可以通过jit模拟来完成所述过程。收集的数据可以用于目标特定块以进行ptc替换。

在其他实现方式中,jit编译器103或主机系统可使用行业标准过程来检测编译块中的问题/错误。这种标准过程的一个实例称为“插桩”。尽管不是一种学习机制,但是插桩提供了关于代码执行模式的大量数据,然后可以对所述数据进行过滤以获得相关性。一些实现方式可结合使用在运行中学习问题代码块和(例如)用插桩来分析执行模式。

jit编译器103绕过ptc块202的正常转译。根据本公开的各方面,如在204处所指示的,在检测到ptc块202时,jit编译器103可通过从替代的主机代码区段104的数据库中选择适当的替代主机代码206段以替换ptc块204来绕过ptc块的转译。替代的主机系统代码206可包括存储在存储器中的预先编写的代码区段。替代的主机系统代码206可包括被编写为在主机系统上运行的分支指令或非分支指令。替代的代码206可实现多种不同的解决方案来修复ptc块202。例如,替代的主机代码206可重新映射寄存器的值,以说明在主机系统上比目标系统上更小的寄存器(或更少数量的寄存器)。另一个实例是替代的主机代码206可清除通道掩蔽代码指令或实现另外的步骤以在主机系统上完成通道掩蔽。可替代地,可实现替代的主机代码206以在主机系统上流线化或更高效地运行已转译目标系统代码207。

本文所述的方法的一个显著优点在于,仿真可被配置为‘完全清除不必要的代码’。如以上所提到的,一些应用包含产品上不必要的未使用调试代码(开发除外)。此类代码可以导致性能降低,并且通常是完全不必要的。本公开的各方面允许仿真系统通过绕过问题代码块以及在适当情况下注入替代的主机代码来修改或跳过此类代码。尽管可以使用‘挂钩/替换’补丁跳过此类不必要的代码,但是通过绕过问题代码块和适当注入替代的主机代码,仿真可更快地运行。

在一些情况下,jit编译器103可简单地跳过某些ptc块的转译,而无需将任何替代的主机系统代码插入到执行流中。例如,某些ptc块诸如剩下的调试代码可能对目标代码的操作没有影响,但是如果它们被转译,则可能不利地影响主机系统的执行。jit编译器可绕过此类ptc块的转译,而无需将任何替代的主机系统代码插入到执行流209中。

jit编译器103可被配置为将替代的主机代码206插入208在执行流209中与已转译ptc块将被放置的位置相同的位置中。另外,jit编译器103可将替代的主机代码放置在执行流209中的不同位置处。在一些实现方式中,jit编译器103对ptc块进行转译并将替代的主机代码与已转译ptc块一起插入到执行流中,或者jit编译器103可用替代的主机代码稍微更改ptc块的转译,并将更改过的ptc块插入到执行流中。

在替代的实现方式中,jit编译器103可在转译203之前扫描目标系统代码以查找已知的ptc块。在检测到ptc块时,jit编译器可启动处理过程212。jit编译器103在处理过程期间从替代的主机代码区段104的数据库中选择204替代的主机代码206以替换或修复检测到的ptc块202。然后,jit编译器103可在适当的时间将替代的主机代码206插入208到执行流209中。可替代地,jit编译器可选择对ptc块进行转译并将替代的主机代码插入208在执行流209中的适当位置中。在一些实现方式中,(例如)由于已知ptc块是不必要的,因此jit编译器103可根本不在206处将ptc块的替代的主机代码206插入208到执行流中。希望的是,jit编译器103能够根据由ptc块202导致的类型问题而在替代的动作之间进行选择。

一旦jit编译器103已经解析了ptc块202,它将重新开始将非ptc块201转译成对应的主机系统代码207并在209处将对应的主机系统代码207插入208到执行流中。在转译期间,jit编译器103可监测已转译代码的执行209,以确定性能是否欠佳。在确定性能欠佳时,jit编译器可重新启动ptc块的检测和处理。在替代的实施方案中,在已经对非ptc块201进行转译205之后插入208替代的主机代码206。在已经绕过转译(例如,在将替代的主机代码插入到执行流中之后)或已经将对应的主机代码207插入到执行流209中之后,过程212可在下一个目标代码102块上重复,如在210处所指示的。

执行流209可通过网络发送到主机计算机,如在212处所指示的。可替代地,执行流中的指令207可由主机系统上的处理器立即执行,如在214处所指示的,或者填充主机系统上的缓冲器或高速缓存以便最终执行,如在216处所指示的。

现在转向图3,描绘被配置为根据本公开的各方面用图4的主机cpu进行操作的主机系统300的说明性实例。根据本公开的各方面,系统300可以是嵌入式系统、移动电话、个人计算机、平板计算机、便携式游戏设备、工作站、游戏控制台等。

系统300大体包括中央处理器单元(cpu)320,所述(cpu)320可包括cpu核心400和在图4中所描绘且以上所讨论的类型的其他特征。通过举例而非限制的方式,cpu320可以是加速处理单元(apu)310的一部分,所述(apu)310包括cpu320和在单个芯片上的图形处理单元(gpu)330。在替代的实现方式中,cpu320和gpu330可实现为单独芯片上的单独硬件组件。

系统300还可包括存储器340。存储器340可任选地包括可供cpu320和gpu330访问的主存储器单元。cpu320和gpu330可各自包括一个或多个处理器核心,例如,单个核心、两个核心、四个核心、八个核心或更多个核心。cpu320和gpu330可被配置为使用数据总线390访问一个或多个存储器单元,并且在一些实现方式中,系统300包括两根或更多根不同总线可能是有用的。

存储器340可包括呈集成电路形式的一个或多个存储器单元,所述集成电路提供可寻址存储器,例如,ram、dram等。存储器可包含用于被配置为实现图2的方法的jit编译器325的可执行指令和替代的主机代码区段326。另外,存储器340可包括专用图形存储器,用于暂时存储图形资源、图形缓冲器和用于图形渲染管线的其他图形数据。

cpu320可被配置为执行cpu代码,所述代码可包括操作系统(os)321或者一个或多个目标应用322(例如,视频游戏)。根据本公开的各方面,cpu还可被配置为执行用于jit编译器325的cpu代码,所述cpu代码可用作替代的主机代码区段326的资源数据库。os321可被配置为实现操作cpu320的某些特征。cpu代码可包括图形应用编程接口(api)324,所述(api)324用于基于应用322的状态向由gpu330实现的程序发出绘制命令或绘制调用。cpu代码还可实现物理模拟和其他功能。os321中的一个或多个的部分代码、目标应用322、jit编译器325、替代的主机代码区段326或api324可存储在存储器340中,在cpu内部或外部或者在大容量存储设备中的高速缓存可供cpu320访问。

系统300还可包括熟知的支持功能350,所述支持功能350可例如通过总线390与系统的其他组件通信。此类支持功能可包括但不限于输入/输出(i/o)元件352、可包括分别用于cpu和gpu的单独时钟的一个或多个时钟356,以及可在cpu320外部的一个或多个级别的高速缓存358。系统300可任选地包括用于存储程序和/或数据的大容量存储设备360,诸如磁盘驱动器、cd-rom驱动器、闪存存储器、磁带驱动器、蓝光驱动器等。在一个实例中,大容量存储设备360可接收计算机可读介质362,所述计算机可读介质362包含最初被设计为在目标系统上运行的应用。可替代地,目标系统应用362(或其部分)可存储在存储器340中或部分地存储在高速缓存358中。

设备300还可包括显示单元380,用来向用户呈现由gpu330准备的渲染图形382。设备300还可包括用户接口单元370,用来促进系统300与用户之间的交互。显示单元380可呈以下形式:平板显示器、阴极射线管(crt)屏幕、触摸屏、头戴式显示器(hmd)或可显示文本、数字、图形符号或图像的其他设备。显示器380可显示根据本文所述的各种技术进行处理的渲染图形382。用户接口370可包含一个或多个外围设备,诸如键盘、鼠标、操纵杆、光笔、游戏控制器、触摸屏和/或可结合图形用户接口(gui)使用的其他设备。在某些实现方式中,目标应用322的状态和图形的基本内容可至少部分地由通过用户接口370的用户输入来确定,例如,在目标应用322包括视频游戏或其他图形密集应用的情况下。

系统300还可包括网络接口372,用来使所述设备能够通过网络与其他设备通信。网络可以是(例如)局域网(lan)、诸如互联网的广域网、诸如蓝牙网络的个人局域网或其他类型的网络。网络接口372还可使得能够通过网络从服务器上根据本公开的各方面运行的仿真器接收对应的主机代码。所示且所述的组件中的各个组件可在硬件、软件或固件或这些中的两个或更多个的某种组合中实现。

图4描绘主机系统cpu核心400的一般架构。cpu核心400通常包括分支预测单元402,所述分支预测单元402试图预测分支是否将被采用,并且还试图(在所述分支被采用的情况下)预测所述分支的目的地地址。在这些预测是正确的情况下,推测地执行的代码的效率将增加;因此高度准确的分支预测是极度需要的。分支预测单元402可包括高度专门化的子单元,诸如追踪来自子例程的返回地址的返回地址堆栈404、追踪间接分支的目的地的间接目标阵列406,以及追踪分支的过去历史以便更准确地预测它们的所得地址的分支目标缓冲器408和其相关联预测逻辑。

主机系统cpu核心400通常包括指令提取和解码单元410,所述指令提取和解码单元410包括指令提取单元412、指令字节缓冲器414和指令解码单元416。cpu核心400通常还包括多个指令相关的高速缓存和指令转译后备缓冲器(itlb)420。这些可包括itlb高速缓存层次结构424,所述itlb高速缓存层次结构424将虚拟地址高速缓存到诸如页面表条目、页面目录条目等物理地址转译信息。使用这个信息来将指令的虚拟地址变换成物理地址,使得指令提取单元412可以从高速缓存层次结构加载指令。通过举例而非限制的方式,可根据高速缓存层次结构来高速缓存程序指令,所述高速缓存层次结构包括驻留在核心中的1级指令高速缓存(l1i-cache)422以及在cpu核心400外部的其他高速缓存级别476;使用指令的物理地址,首先搜索这些高速缓存来找到程序指令。根据本公开的各方面,目标应用322可被编写用于cpu核心,所述cpu核心带有与主机cpu核心400上的指令高速缓存422不同数量的指令高速缓存或与主机cpu核心上的所述指令高速缓存不同大小的指令高速缓存。如果未找到指令,那么从系统存储器401加载指令。根据架构,还可存在如以下所述的包含已解码指令的微操作(micro-op)高速缓存426。在一些实现方式中,jit编译器325可检测写入目标系统指令高速缓存或从目标系统指令高速缓存读取的问题目标代码块,并利用替代的主机系统代码而不是对此类问题块进行转译。

目标系统代码可被编写用于使用与主机系统不同的指令集的系统。jit编译器325可对目标系统代码进行转译以使用与主机cpu核心400兼容的指令集或用替代的主机系统代码替换问题目标代码块。

一旦已经提取程序指令,通常将指令放置在指令字节缓冲器414中,等待由指令提取和解码单元410进行处理。解码可以是非常复杂的过程;难以每个循环解码多个指令,并且可能存在对指令对准或指令类型的限制,这限制了一个循环中可解码是指令数量。根据架构,可将已解码指令放置在微操作高速缓存426中(如果在新cpu上存在微操作高速缓存),使得可以绕过解码阶段以便随后使用程序指令。

通常将已解码指令传送到用于分派和调度430的其他单元。这些单元可使用引退队列432来追踪遍及cpu管线剩余部分的指令的状态。并且,由于在许多cpu架构上可用的通用和simd寄存器的数量有限,因此可执行寄存器重命名,其中当在被执行的指令流中遇到逻辑(也称为架构的)寄存器时,指派物理寄存器440来表示它们。物理寄存器440可包括单指令多数据(simd)寄存器组442和通用(gp)寄存器组444,其大小可以远大于在特定cpu架构上可用的逻辑寄存器的数量,并且因此性能可以大大增加。在执行寄存器重命名434之后,通常将指令放置在调度队列436中,每个循环可从所述调度队列436选择多个指令(基于相依性)以便由执行单元450执行。

执行单元450通常包括:simd管452,其对simd寄存器组442中所包含的128位或更宽simd寄存器中所包含的多个数据字段执行多个并行操作;算术和逻辑单元(alu)454,其对gp寄存器组444中所包含的gpr执行多个逻辑运算、算术运算和混杂运算;以及地址生成单元(agu)456,其计算地址,存储器应当从所述地址进行存储或加载。每种类型的执行单元可存在多个实例,并且所述实例可具有不同能力,例如特定simd管452可能够执行浮点乘法运算但是不能执行浮点加法运算。目标系统可包括与主机cpu400不兼容的处理器单元,例如向量处理单元或协同处理单元,在仿真目标系统期间,所述处理单元将使它们的功能由jit编译器针对主机cpu核心400的架构进行重新映射。jit编译器325可用替代的主机系统代码替换涉及此类目标系统处理器单元的问题目标代码块,如以上所讨论的。

存储和加载通常在存储队列462和加载队列464中进行缓冲,使得许多存储器操作可以并行执行。为协助存储器操作,cpu核心400通常包括多个数据相关的高速缓存和数据转译后备缓冲器(dtlb)470。dtlb高速缓存层次结构472将虚拟地址高速缓存到诸如页面表条目、页面目录条目等的物理地址转译;使用这个信息来将存储器操作的虚拟地址变换成物理地址,使得可以从系统存储器存储或加载数据。数据通常被高速缓存在驻留在核心中的1级数据高速缓存(l1d-cache)474以及在核心400外部的其他高速缓存级别476中。

虽然以上是对本发明的优选实施方案的完整描述,但是也可能使用各种替代、修改和等效物。因此,不应当参考以上描述确定本发明的范围,而是应当参考所附权利要求及其等效物的完整范围来确定。本文所述的任何特征(不论优选与否)可与本文所述的任何其他特征组合(不论优选与否)。在以下权利要求中,不定冠词“一个(a/an)”或“一种(a/an)”是指冠词后的一个或多个项的量,除非另外明确说明。所附权利要求不应被解译为包括手段加功能限制,除非在给定权利要求中使用短语“用于……的手段”明确陈述此类限制。

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