CN117348889B - 代码翻译处理方法、系统、计算机系统及计算机设备 - Google Patents

代码翻译处理方法、系统、计算机系统及计算机设备 Download PDF

Info

Publication number
CN117348889B
CN117348889B CN202311649185.4A CN202311649185A CN117348889B CN 117348889 B CN117348889 B CN 117348889B CN 202311649185 A CN202311649185 A CN 202311649185A CN 117348889 B CN117348889 B CN 117348889B
Authority
CN
China
Prior art keywords
code
cache
block
memory
target
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202311649185.4A
Other languages
English (en)
Other versions
CN117348889A (zh
Inventor
吕蓊鉴
黄能超
李�根
唐遇星
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Phytium Technology Co Ltd
Original Assignee
Phytium Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Phytium Technology Co Ltd filed Critical Phytium Technology Co Ltd
Priority to CN202311649185.4A priority Critical patent/CN117348889B/zh
Publication of CN117348889A publication Critical patent/CN117348889A/zh
Application granted granted Critical
Publication of CN117348889B publication Critical patent/CN117348889B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0806Multiuser, multiprocessor or multiprocessing cache systems
    • G06F12/0811Multiuser, multiprocessor or multiprocessing cache systems with multilevel cache hierarchies
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本申请提出一种代码翻译处理方法、系统、计算机系统及计算机设备,该方法应用于计算机系统的处理器,所述计算机系统的缓存被划分为缓存块,所述缓存块中包括第一缓存块,所述第一缓存块用于存储动态自修改代码的翻译代码,该方法包括:确定待翻译的目标代码的代码类型;所述代码类型为静态代码、动态自修改代码或未知类型代码;对所述目标代码进行翻译,得到翻译代码;在所述目标代码为动态自修改代码的情况下,将所述翻译代码存储至所述第一缓存块。采用上述方案能够提高代码运行效率和性能。

Description

代码翻译处理方法、系统、计算机系统及计算机设备
技术领域
本申请涉及计算机技术领域,尤其涉及一种代码翻译处理方法、系统、计算机系统及计算机设备。
背景技术
二进制翻译可以用来解决在二进制层面,程序跨体系结构运行的问题。通常在计算机系统中会同时存在静态代码或动态自修改代码,静态代码通常不会发生修改或变化,而动态自修改代码在运行过程中经常发生修改,因此需要在代码修改后,重新翻译修改后的代码,在实际应用中,涉及动态自修改代码的跨体系结构运行性能表现不佳。
在现有的二进制翻译方案中,在对代码进行翻译之后,将翻译代码依次存储到缓存中。由于动态自修改代码的反复修改,会不断地进行代码翻译以及向缓存中存入翻译代码,当缓存写满后,由于无法区分缓存中存储的代码类型,就会将全部缓存清空,然后再重新翻译最新的所有代码并存储。这样就导致对于静态代码,也会删除其翻译代码并重新翻译,从而降低了代码运行效率和性能。
发明内容
基于上述技术现状,本申请提出一种代码翻译处理方法、系统、计算机系统及计算机设备,能够提高代码运行效率和性能。
本申请第一方面提出一种代码翻译处理方法,应用于计算机系统的处理器,所述计算机系统的缓存被划分为缓存块,所述缓存块中包括第一缓存块,所述第一缓存块用于存储动态自修改代码的翻译代码,所述方法包括:
确定待翻译的目标代码的代码类型;所述代码类型为静态代码、动态自修改代码或未知类型代码;
对所述目标代码进行翻译,得到翻译代码;
在所述目标代码为动态自修改代码的情况下,将所述翻译代码存储至所述第一缓存块。
在一些实现方式中,所述缓存中还包括第二缓存块和第三缓存块,所述第二缓存块用于存储静态代码的翻译代码,所述第三缓存块用于存储未知类型代码的翻译代码,所述方法还包括:
在所述目标代码为静态代码的情况下,将所述翻译代码存储至所述第二缓存块;
在所述目标代码为未知类型代码的情况下,将所述翻译代码存储至所述第三缓存块。
在一些实现方式中,在所述目标代码为动态自修改代码的情况下,所述方法还包括:
基于针对目标代码所在内存块的属性变更事件,确定所述目标代码中被修改的代码页;
所述对所述目标代码进行翻译,得到翻译代码,包括:
对所述目标代码中的被修改的代码页进行翻译,得到修改翻译代码;
所述将所述翻译代码存储至缓存中的第一缓存块,包括:
从存储所述被修改的代码页的原有翻译代码的第一缓存块中,删除所述被修改的代码页的原有翻译代码,并将所述修改翻译代码存储至该第一缓存块。
在一些实现方式中,基于针对目标代码所在内存块的属性变更事件,确定所述目标代码中被修改的代码页,包括:
基于针对目标代码所在内存块的属性变更事件,确定目标代码所在内存块的属性变更情况;所述属性变更事件用于将目标代码所在内存块的属性设置为只读属性或可写属性;
在目标代码所在内存块的属性从只读属性变为可写属性时,记录所述目标代码的各个代码页的第一摘要;
在所述目标代码所在内存块的属性从可写属性变为只读属性时,记录所述目标代码的各个代码页的第二摘要;
根据所述各个代码页的第一摘要和第二摘要,从所述目标代码中确定出被修改的代码页。
在一些实现方式中,对所述目标代码进行翻译,得到翻译代码,包括:
对所述目标代码进行翻译,并在翻译后的代码头部添加计数代码,得到翻译代码;其中,所述计数代码用于统计所述翻译代码被运行的次数。
在一些实现方式中,确定待翻译的目标代码的代码类型,包括:
基于针对目标代码所在内存块的属性变更事件,确定所述目标代码所在内存块的内存地址;所述属性变更事件用于对目标代码所在内存块的内存地址的属性进行设置;
判断所述目标代码所在内存块的内存地址是否处于第一内存范围之外,以及所述目标代码所在内存块的内存大小是否在设定的内存大小范围内;其中,所述第一内存范围包括静态代码映射到内存后所占用的内存地址范围;
在所述目标代码所在内存块的内存地址处于第一内存范围内的情况下,确定所述目标代码为静态代码;
在所述目标代码所在内存块的内存地址处于第一内存范围之外,并且所述目标代码所在内存块的内存大小在设定的内存大小范围内的情况下,确定所述目标代码为动态自修改代码;
在所述目标代码不能被确定为静态代码或动态自修改代码的情况下,确定所述目标代码为未知类型代码。
在一些实现方式中,在所述目标代码为动态自修改代码的情况下,所述方法还包括:
检测所述缓存中的第一缓存块的空闲存储空间是否足以容纳所述翻译代码;
若所述缓存中的第一缓存块的空闲存储空间不足以容纳所述翻译代码,则从所述缓存中选出空闲缓存块作为第一缓存块。
在一些实现方式中,所述处理器记录所述缓存中的各个缓存块的运行信息,所述运行信息包括代码动态程度、代码被失效的次数、代码最后一次被运行的时间、代码运行次数,其中,动态自修改代码的代码动态程度大于未知类型代码的代码动态程度,未知类型代码的代码动态程度大于静态代码的代码动态程度;所述方法还包括:
在所述缓存中没有空闲的缓存块的情况下,基于所述缓存中各个缓存块的运行信息,从各个缓存块中选出待释放的缓存块,并清除所述待释放的缓存块中的代码。
在一些实现方式中,基于所述缓存中各个缓存块的运行信息,从各个缓存块中选出待释放的缓存块,包括:
至少按照代码被失效次数从大到小的顺序,对各个缓存块进行排列,得到缓存块序列;
从所述缓存块序列中,选出排在序列首位的缓存块,作为待释放的缓存块。
在一些实现方式中,至少按照代码被失效次数从大到小的顺序,对各个缓存块进行排列,得到缓存块序列,包括:
按照代码被失效次数从大到小的顺序,对各个缓存块进行排列,得到缓存块序列;
其中,在所述缓存块序列中,代码被失效次数相同的缓存块按照代码动态程度从大到小的顺序排列,代码动态程度相同的缓存块按照代码被运行次数从小到大的顺序排列,代码被运行次数相同的代码块按照代码最后一次被运行的时间从先到后的顺序排列。
本申请第二方面提出一种代码翻译处理系统,应用于计算机系统的处理器,所述计算机系统的缓存被划分为缓存块,所述缓存块中包括第一缓存块,所述第一缓存块用于存储动态自修改代码的翻译代码,所述系统包括:
动态代码检测模块,用于确定待翻译的目标代码的代码类型;所述代码类型为静态代码、动态自修改代码或未知类型代码;
代码翻译模块,用于对所述目标代码进行翻译,得到翻译代码;在所述目标代码为动态自修改代码的情况下,将所述翻译代码存储至所述第一缓存块。
在一些实现方式中,所述处理器记录所述缓存中的各个缓存块的运行信息,所述运行信息包括代码动态程度、代码被失效的次数、代码最后一次被运行的时间、代码运行次数,其中,动态自修改代码的代码动态程度大于未知类型代码的代码动态程度,未知类型代码的代码动态程度大于静态代码的代码动态程度;所述系统还包括:
失效策略模块,用于在所述目标代码为动态自修改代码并且所述缓存中没有空闲的缓存块的情况下,基于所述缓存中各个缓存块的运行信息,从各个缓存块中选出待释放的缓存块;清除所述待释放的缓存块中的代码,以使所述代码翻译模块将所述翻译代码存储至该缓存块。
本申请第三方面提出一种计算机系统,所述计算机系统的缓存被划分为缓存块,所述缓存块中包括第一缓存块,所述第一缓存块用于存储动态自修改代码的翻译代码,所述计算机系统的处理器被配置为执行上述的代码翻译处理方法。
本申请第四方面提出一种计算机设备,包括上述的计算机系统。
本申请提出的代码翻译处理方法将缓存划分为缓存块,并且在缓存块中设置用于存储动态自修改代码的翻译代码的第一缓存块。基于上述的缓存块划分,在对动态自修改代码进行翻译后,将翻译代码存储至第一缓存块,这样就使得动态自修改代码的缓存与静态代码的缓存区分开,从而当缓存写满时,能够从缓存中识别出用于存储动态自修改代码的翻译代码的缓存块,进而可以有选择性地将动态自修改代码的翻译代码清空,这样可以避免对静态代码的翻译代码清空并重新翻译,因此能够提高代码运行效率和性能。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例提供的一种缓存示意图。
图2为本申请实施例提供的对缓存进行缓存块划分的示意图。
图3为本申请实施例提供的一种代码翻译处理方法的流程示意图。
图4为本申请实施例提供的另一种代码翻译处理方法的流程示意图。
图5为本申请实施例提供的一种代码翻译处理系统的结构示意图。
图6为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
首先,对本申请实施例中出现的技术概念进行介绍:
二进制翻译(Binary Translation,BT):是一种直接翻译可执行二进制程序的技术,能够把一种处理器上运行的二进制程序翻译到另外一种处理器上运行。
自修改代码(Self-Modifying Code,SMC):指的是程序执行后,会修改自身代码的代码。对于二进制翻译而言,因为代码发生了变更,所以需要对发生修改的代码重新进行翻译。
使代码失效(invalid) : 在本申请实施例中是指使翻译得到的翻译代码失效。因为待运行的代码发生了修改,因此原先翻译好的代码缓存中对应的翻译代码不再能被使用了,因此要使这些翻译代码失效。如果需要再次运行被修改的代码,需要重新进行翻译。
代码缓存:在本申请实施例中,原体系结构的代码,被翻译为适用于另一个目标体系结构的代码后,放置适用于该目标体系结构的代码所使用的缓存,就叫代码缓存。
mmap: 是一个系统调用,能够把一块代码映射到操作系统的内存页。
mprotect: 是一个系统调用,能够改变内存页的权限属性,比如能够将内存页权限设置为只读、可写、可执行。
摘要: 对一份数据,进行一个单向的Hash 函数,生成一个固定长度的Hash 值,这个值就是这份数据的摘要,也称为指纹。
GuestJitCache:是待翻译代码状态管理的一个缓存。
pagesize: 操作系统管理内存的最小单位是一个pagesize, 一般为4k, 或者16k。
aarch64: aarch64是新的64位的arm架构,也叫armv8。
二进制翻译(Binary Translation,BT)是一种直接翻译可执行二进制程序的技术,它能够把一种处理器上的二进制程序翻译到另外一种处理器上运行,从而使得二进制程序能够跨系统或跨处理器运行。
二进制翻译的对象,一般有动态自修改代码和静态代码。其中,动态自修改代码是指在运行过程中会动态地自动修改或调整代码内容的程序代码,典型的比如java虚拟机、v8引擎、.net 虚拟机等。而静态代码,则是指运行过程中不会发生自修改的普通程序代码。
目前,在基于二进制翻译实现程序跨体系结构运行时,对于一般的不包含自修改的静态代码来说,翻译效率一般能接近原生程序的性能。但是对于动态自修改代码而言,普遍表现性能不佳。
造成上述性能不佳问题的一部分原因,是由于对翻译代码的缓存管理不合理。
对于二进制的代码而言,翻译后的代码长短不一,实际是很难被单独用分配器去管理每一块用来存放翻译后指令的内存的。更多的时候是每次翻译代码的时候就提供一个可写的缓冲区地址,等下次再翻译新的代码的时候,缓冲区后移。也就是所有被翻译的代码,都是按翻译的时间顺序,前后布局在一块大的缓冲区中。
当同时翻译一些静态代码和动态代码,翻译生成的代码共用一段代码缓存后,随着动态代码的不断修改,最终这个内存页就会变成图1所示的样子。其中,有些缓存区域存储的是正常代码,有些缓存区域存储的是失效代码。这样的内存页加载到cache的各个层次(memory,L1,L2,L3)的时候,是严重影响性能的。
随着缓存中的有效代码和失效代码不断增多,最后缓存空间耗尽,由于对这些缓存区的代码性质不了解,只能是清理整个缓存,任何代码都只能重新翻译,包括从而发生过修改的代码,从而导致整体上的代码运行效率和性能降低。
本申请的发明人经过工作实践和研究发现,对于缓存空间的混乱占用是导致缓存管理不合理的主要原因,由于不了解不同缓存区所存储的代码的性质,因此只能在缓存资源紧张时直接清除全部缓存并重新翻译所有代码。
针对上述技术问题,本申请实施例提出一种代码翻译处理方案,能够通过优化对缓存的应用和管理,提高代码运行效率和性能。
下面对本申请实施例提出的代码翻译处理方案的具体内容进行介绍。首先,本申请实施例提出一种代码翻译处理方法,该方法可以由计算机系统的处理器执行。该处理器通过二进制翻译,可以将运行于其他计算机体系架构的程序代码翻译成适用于该处理器所在体系架构的程序代码。本申请实施例提出的代码翻译处理方法,能够使得处理器在通过二进制翻译对程序代码进行翻译的过程中,优化对缓存的应用、避免不必要的代码重翻译,从而能够提高代码翻译和运行效率。
首先,参见图2所示,本申请实施例对计算机系统的缓存进行缓存块划分,将整个缓存空间划分为多个缓存块。其中,缓存块的大小可以根据系统代码大小来灵活调整,可以以一个缓存块能够容纳一份完整代码为标准进行缓存块划分,比如可以每1M划分一个缓存块,或者每2M划分一个缓存块,或者每3M划分一个缓存块。在本申请实施例中,每个缓存块设置为2M大小的缓存空间。
上述的计算机系统的缓存,是介于计算机系统的处理器和内存之间的缓存,其具体可以设置于处理器内部,也可以设置于处理器外部,或者部分缓存设置于处理器内部而部分缓存设置于处理器外部,本申请实施例不做限定。
基于上述的缓存块划分,本申请实施例还对缓存块进行了分类,从中划分出第一缓存块,用于存储动态自修改代码的翻译代码。
在其他实施例中,还从上述缓存的缓存块中,划分出第二缓存块和第三缓存块。
其中,第二缓存块用于存储静态代码的翻译代码,所述第三缓存块用于存储未知类型代码的翻译代码。上述的未知类型代码,是指不能区分其是动态自修改代码还是静态代码的程序代码。
上述的第一缓存块、第二缓存块和第三缓存块的数量,可以灵活设置。当数量为多个时,相同类型的缓存块可以相邻设置,也可以不相邻设置。
在本申请实施例中,初次划分第一缓存块、第二缓存块和第三缓存块时,分别划分一个第一缓存块、一个第二缓存块和一个第三缓存块,当某种类型的缓存块空间不足时,再选择一个空闲缓存块标记为新增的该类型缓存块。比如,在初次划分第一缓存块时,只将一个缓存块划分为第一缓存块,用于存储动态自修改代码的翻译代码,当该第一缓存块的存储空间不足无法继续存储其他动态自修改代码的翻译代码时,再从其他的缓存块中选择一个空闲的缓存块设置为第一缓存块,此时即增加了一个第一缓存块,其可以继续用于存储其他动态自修改代码的翻译代码。
基于上述的缓存块划分,尤其是对第一缓存块的划分,本申请实施例提出一种代码翻译处理方法,参见图3所示,本申请实施例提出的代码翻译处理方法,包括:
S101、确定待翻译的目标代码的代码类型。
其中,上述的待翻译的目标代码,是指处理器中运行的需要被翻译的程序代码,也就是在处理器的二进制翻译进程中所要进行翻译的代码。
在对目标代码进行翻译之前,处理器先对该目标代码的代码类型进行分类。在本申请实施例中,设置了三种代码类型,分别是静态代码、动态自修改代码和未知类型代码。通过上述的代码类型分类处理,可以确定待翻译的目标代码是静态代码,还是动态自修改代码,还是未知类型代码。
示例性的,可以预先在不同类型的代码中添加代码类型标识,当处理器对待翻译的目标代码进行代码类型分类时,通过识别目标代码中的代码类型标识,即可确定目标代码的代码类型。
在另一些实施例中,通过代码被映射到内存的内存地址来区分代码类型。通常而言,静态代码和动态自修改代码被映射到内存时会映射到不同的内存区域,比如,对于静态代码而言,通常是通过mmap调用将其映射到操作系统的内存页。而对于动态自修改代码而言,在对代码进行修改时,会通过mprotect调用改变代码所在内存页的权限属性。
基于上述特点,可以通过判断目标代码所在内存的内存地址是否处于mmap映射的一个可执行程序的内存范围以及是否处于mprotect调用对应的内存范围,来确定目标代码的代码类型。
比如,若目标代码所在内存的内存地址处于mmap映射的一个可执行程序的内存范围内,则可以确定该目标代码为静态代码。
若目标代码所在内存的内存地址不处于mmap映射的一个可执行程序的内存范围内,则进一步判断目标代码所在内存的内存地址是否处于mprotect调用对应的内存范围内,如果处于mprotect调用对应的内存范围内,则可以确定目标代码为动态自修改代码,否则可以确定目标代码为未知类型代码。
S102、对所述目标代码进行翻译,得到翻译代码。
处理器对目标代码进行翻译得到适用于处理器体系架构的翻译代码。
需要说明的是,上述的步骤S101和S102的执行顺序可以调整,可以先执行S101再执行S102,也可以先执行S102再执行S101,或者也可以S101和S102一起执行,本申请实施例不做限定。
S103、在所述目标代码为动态自修改代码的情况下,将所述翻译代码存储至所述第一缓存块。
具体的,在确认待翻译的目标代码为动态自修改代码时,处理器将对该目标代码翻译得到的翻译代码存储至缓存的第一缓存块。
可以理解,本申请实施例提出的代码翻译处理方法将缓存划分为缓存块,并且在缓存块中设置用于存储动态自修改代码的翻译代码的第一缓存块。基于上述的缓存块划分,在对动态自修改代码进行翻译后,将翻译代码存储至第一缓存块,这样就使得动态自修改代码的缓存与静态代码的缓存区分开,从而当缓存写满时,能够从缓存中识别出用于存储动态自修改代码的翻译代码的缓存块,进而可以有选择性地将动态自修改代码的翻译代码清空,这样可以避免对静态代码的翻译代码清空并重新翻译,因此能够提高代码运行效率和性能。
在一些实施例中,在计算机系统的缓存中同时设置第一缓存块、第二缓存块和第三缓存块。在此基础上,若通过执行上述步骤S101确定目标代码为静态代码,则将对该目标代码翻译得到的翻译代码存储至第二缓存块;若确定该目标代码为未知类型代码,则将对该目标代码翻译得到的翻译代码存储至第三缓存块。
通过上述处理,实现了动态自修改代码、静态代码、未知类型代码在缓存中分类、分区存储,从能使得在对缓存代码进行清除时,可以准确、直观地选择对特定类型代码进行清除,提高了对缓存的利用效率,以及能够提高代码运行效率和性能。
在一些实施例中,基于上述的实施例步骤,参见图4所示,在确定目标代码为动态自修改代码的情况下,在对目标代码进行翻译之前,先执行步骤S202:
S202、基于针对目标代码所在内存块的属性变更事件,确定所述目标代码中被修改的代码页。
具体的,如上文所述,当动态自修改代码进行修改时,会发生对目标代码所在内存的权限属性变更,比如,目标代码通过触发mprotect调用对目标代码所在内存的权限属性进行变更,比如将其变更为可写权限,然后对该内存的代码进行修改,在修改完毕后在将该内存变更为只读权限。
因此,当发生目标代码所在内存块的属性变更事件时,可以确定该目标代码发生或将要发生修改,此时,处理器对目标代码中的代码页进行检测解析,判断代码页是否发生修改,从而确定目标代码中被修改的代码页。
示例性的,处理器(二进制翻译器中的自修改检测模块)可以通过检测对目标代码的写操作的执行位置,确定是对那些代码页进行的写操作,也就是确定对目标代码的哪些代码页进行了修改,从而确定被修改的代码页。
在另一些实施例中,处理器(二进制翻译器中的自修改检测模块)通过将目标代码的各个代码页在不同时刻的代码内容进行对比,可以确定哪些代码页发生了变化,也就是确定哪个代码页发生了修改。
具体的,处理器(二进制翻译器中的自修改检测模块)通过执行如下步骤A1-A4的处理从目标代码中确定出被修改的代码页:
A1、基于针对目标代码所在内存块的属性变更事件,确定目标代码所在内存块的属性变更情况。
其中,上述的属性变更事件,是指对目标代码所在内存块的属性进行设置的事件,其具体用于将目标代码所在内存块的属性设置为只读属性或可写属性。
参见上文所述,在常规的二进制翻译机制中,代码所在内存块的属性在该代码被修改之前是只读状态,此时不能对该内存块中的代码进行修改;当需要对代码进行修改时,首先将该代码所在内存块的属性变更为可写属性,然后可以对该内存块的代码进行修改;在修改完成后,需要将该代码所在内存块的属性再次变更为只读属性。
由此可见,代码的修改伴随着代码所在内存块的属性变更,而通过代码所在内存块的属性变更,也可以反映代码是否可能发生了修改。本申请实施例通过监测代码所在内存块的属性变更事件,来触发识别代码是否发生修改。
具体而言,处理器(二进制翻译器中的自修改检测模块)实时检测目标代码所在内存块的属性变更事件,例如检测对目标代码所在内存块的属性进行变更的系统调用,当检测到对目标代码所在内存块的属性进行变更的系统调用时,即可根据该系统调用,判断目标代码所在内存块的属性是否发生变更。
比如在linux系统中,程序改变自己代码的可执行权限的时候,都会调用mprotect(addr, flag)。在mprotect(addr, flag)中,addr表示需要更改权限属性的内存块的地址,flag表示权限标志,比如只读、可写、可执行,等等。mprotect(addr, flag)表示将addr所表示的内存块的权限属性设置为flag所表示的权限属性。
通过检测用于改变目标代码所在内存块的权限属性的系统调用,处理器(二进制翻译器中的自修改检测模块)可以检测到目标代码所在内存块的属性变更。
在目标代码所在内存块的属性从只读属性变为可写属性时,执行步骤A2、记录所述目标代码的各个代码页的第一摘要。
处理器(二进制翻译器中的自修改检测模块)在检测到目标代码所在内存块的属性从只读属性变为可写属性时,记录目标代码的各个代码页的第一摘要,即计算目标代码每个代码页的摘要,得到每个代码页的第一摘要。
其中,在计算代码页的摘要时,可以采用任意的计算代码摘要的算法实现。作为可选的实施方式,本申请实施例计算代码页中的代码的哈希值,作为代码的第一摘要。
另外需要说明的是,当处理器(二进制翻译器中的自修改检测模块)检测在检测到将目标代码所在内存块的属性设置为可写属性的属性变更事件时,立即计算目标代码的各个代码页的摘要,得到各个代码页的第一摘要。因为,当目标代码发出将目标代码所在内存块的属性从只读属性变为可写属性的系统调用的这一刻,目标代码还是只读状态,并且尚未对目标代码进行修改,此时对目标代码计算摘要,可以准确记录下代码被修改前的摘要。
在所述目标代码所在内存块的属性从可写属性变为只读属性时,执行步骤A3、记录所述目标代码的各个代码页的第二摘要。
具体的,在检测到目标代码所在内存块的属性从只读属性变为可写属性并且记录目标代码各个代码页的第一摘要后,继续对目标代码所在内存块的属性变更进行检测。
在检测到目标代码所在内存块的权限属性从可写属性又变为只读属性的时候,可以确定已经完成了对目标代码的修改,并且已经将目标代码所在内存块的属性再次设置为只读属性。此时,处理器(二进制翻译器中的自修改检测模块)再次计算目标代码的各个代码页的摘要,作为各个代码页的第二摘要。
处理器(二进制翻译器中的自修改检测模块)采用与步骤A2中计算各个代码页的第一摘要时相同的摘要算法,计算得到各个代码页的第二摘要。
可以理解,在检测到目标代码所在内存块的属性从可写属性变为只读属性时,记录目标代码的各个代码页的第二摘要,也就是记录目标代码在修改之后的各个代码页的摘要。
A4、根据所述各个代码页的第一摘要和第二摘要,从所述目标代码中确定出被修改的代码页。
具体的,处理器(二进制翻译器中的自修改检测模块)将目标代码的各个代码页的第一摘要与第二摘要进行对比,判断各个代码页的第一摘要和第二摘要是否相同,从而确定代码页的代码是否发生修改。
如果代码页的第一摘要和第二摘要不同,则说明代码页的代码发生了修改;如果代码页的第一摘要和第二摘要相同,则说明代码页的代码没有发生修改。
通过上述方式,处理器(二进制翻译器中的自修改检测模块)可以从目标代码的各个代码页中,识别出发生修改的代码页。
在确定目标代码中被修改的代码页之后,在对目标代码进行翻译时,执行步骤S203、对目标代码中被修改的代码页进行翻译,得到修改翻译代码。
S204、从存储所述被修改的代码页的原有翻译代码的第一缓存块中,删除所述被修改的代码页的原有翻译代码,并将所述修改翻译代码存储至该第一缓存块。
具体的,处理器(二进制翻译器)从目标代码中识别出被修改的代码页后,针对这些被修改的代码页重新进行翻译。
然后,在将修改翻译代码存储到第一缓存块时,由于第一缓存块中已经存储了修改的代码页的翻译代码,而这些代码已经没有使用价值,因此处理器从存储被修改代码页的原有翻译代码的第一缓存块中,删除被修改代码页的原有翻译代码,并且将步骤S203得到的修改翻译代码存储至该第一缓存块,从而实现了被修改代码页的翻译代码的替换更新。
该实施例方案能够准确地从目标代码中识别出被修改的代码页,进而针对被修改的代码页进行重翻译,从而能够避免由于对动态自修改代码整体进行重翻译带来的计算资源浪费问题,能够提升代码翻译效率,进而能够提高代码运行性能。
在一些实施例中,当对目标代码进行翻译时,不仅对目标代码本身进行翻译,还在翻译后的代码头部添加计数代码perf stub code,得到翻译代码。上述的计数代码用于统计该翻译代码被运行的次数。
可以理解,在翻译代码的头部添加计数代码,使得当该翻译代码被运行时,首先运行该计数代码,对该翻译代码的运行进行计数。每当该翻译代码被运行一次时,均可以通过该计数代码统计更新该翻译代码的运行次数。
对翻译代码的被运行次数进行统计,可以便于在需要对缓存中的翻译代码进行清除时,按照翻译代码被运行的次数,选择不经常运行的翻译代码进行删除,从而为缓存释放提供参考。
在另一些实施例中,当上述的计数代码统计到代码被运行一定次数时,处理器将该计数代码设置为不执行状态,即不再统计代码的运行次数。比如,当统计到翻译代码运行一定次数时,将该计数代码改为Nop,此时翻译代码在运行时不再运行头部的计数代码,而是直接运行计数代码之后的代码,从而可以提高代码运行速度。
在一些实施例中,在确定待翻译的目标代码的代码类型时,将目标代码所在内存块的内存地址与内存大小相结合来判断目标代码的代码类型,具体可以通过执行如下步骤B1-B5实现:
B1、基于针对目标代码所在内存块的属性变更事件,确定所述目标代码所在内存块的内存地址。
其中,上述的属性变更事件用于对目标代码所在内存块的内存地址的属性进行设置。
比如在linux系统中,程序改变自己代码的可执行权限的时候,都会调用mprotect(addr, flag)。在mprotect(addr, flag)中,addr表示需要更改权限属性的内存块的地址,flag表示权限标志,比如只读、可写、可执行,等等。mprotect(addr, flag)表示将addr所表示的内存块的权限属性设置为flag所表示的权限属性。
处理器通过检测对应目标代码的属性变更事件,比如检测mprotect调用,来确定目标代码所在内存块的内存地址。比如通过mprotect(addr, flag)中的addr来确定内存地址。
B2、判断所述目标代码所在内存块的内存地址是否处于第一内存范围之外,以及所述目标代码所在内存块的内存大小是否在设定的内存大小范围内。
其中,所述第一内存范围包括静态代码映射到内存后所占用的内存地址范围。
在所述目标代码所在内存块的内存地址处于第一内存范围内的情况下,执行步骤B3、确定所述目标代码为静态代码。
在所述目标代码所在内存块的内存地址处于第一内存范围之外,并且所述目标代码所在内存块的内存大小在设定的内存大小范围内的情况下,执行步骤B4、确定所述目标代码为动态自修改代码。
具体的,在内存中,会专门预留部分内存地址用于存放静态代码的映射,比如,静态代码会通过mmap调用映射到内存的特定内存范围内,本申请实施例将该特定内存范围命名为第一内存范围。若一段程序代码被映射到上述的第一内存范围,则可以确定该程序代码为静态代码。只要处于上述的第一内存范围之外的代码,才可能是动态自修改代码。
另一方面,本申请实施例预先设置了内存大小范围来识别动态自修改代码。该内存大小范围,表示了内存大小的一定范围,只有处于该内存大小范围内的代码,才是动态自修改代码,小于该范围或者超出该范围的代码,均不是动态自修改代码。
在本申请实施例中,通过代码页pagesize的数量来表示内存大小。则,上述的特定的内存大小范围,表示设定代码页数范围,比如12个pagesize到512个pagesize。
基于上述的设定的内存大小范围的设置,本申请实施例将目标代码所在内存块所占据的内存大小,也就是目标代码所在内存块的代码页数,与上述设定的内存大小范围进行比较,判断目标代码所在内存块的内存大小是否处于上述设定的内存大小范围内,也就是判断目标代码所在内存块存储的代码页数,是否在上述设定的内存大小范围所限定的代码页数范围内。
如果目标代码所在内存块的内存地址处于第一内存范围之外,并且所述目标代码所在内存块的内存大小处于上述设定的内存大小范围内,则目标代码才是动态自修改代码。
在所述目标代码不能被确定为静态代码或动态自修改代码的情况下,执行步骤B5、确定所述目标代码为未知类型代码。
如果经过上述步骤B1-B4的判断无法确定目标代码是否为静态代码或动态自修改代码,则可以直接确定目标代码为未知类型代码。
在一些实施例中,当将动态自修改代码的翻译代码存储至第一缓存块时,先检测缓存中的第一缓存块的空闲存储空间是否足以容纳该翻译代码,如果足以容纳该翻译代码,则将该翻译代码存储至该第一缓存块的空闲存储空间,如果不足以存储该翻译代码,则从缓存中选出空闲的缓存块作为新增的第一缓存块,然后将该翻译代码存储至第一缓存块。此时,将翻译代码存储至第一缓存块时,具体是将翻译代码全部存储至上述新增的第一缓存块。
在另一些实施例中,基于上述的代码翻译和存储的处理,处理器还记录和维护着缓存中的各个缓存块的运行信息,这些运行信息包括代码动态程度dyn_weight、代码被失效的次数invalid、代码最后一次被运行的时间access_time、代码运行次数hits。
其中,不同类型的代码被赋予不同的代码动态程度,动态自修改代码的代码动态程度大于未知类型代码的代码动态程度,未知类型代码的代码动态程度大于静态代码的代码动态程度。比如,动态自修改代码的代码动态程度为3,未知类型代码的代码动态程度为2,静态代码的代码动态程度为1。
代码被失效的次数invalid是指代码在被运行过程中被失效掉的次数。
代码最后一次被运行的时间access_time表示代码最近一次被运行的时刻。
代码运行次数hits表示由翻译代码头部的计数代码所统计得到的翻译代码的运行次数。
基于上述的缓存块的运行信息,当缓存中没有空闲缓存块可用于存储翻译得到的翻译代码的情况下,也就是当缓存中的缓存块被写满时,基于缓存中各个缓存块的运行信息,从各个缓存块中选出待释放的缓存块,并清除该待释放的缓存块中的代码。
示例性的,上述的缓存块的运行信息,包含了缓存块中存储的代码的动态特性。根据缓存块的运行信息,本申请实施例对缓存块进行清空。
比如,根据缓存块的运行信息,可以选择被失效次数最多的缓存块进行清空。缓存块的被失效次数多,说明缓存块中的无效代码越多,对这些缓存块进行整体性清空后,后面需要重新翻译的代码越少,对系统性能的影响也越小。
在一些实施例中,至少按照代码被失效次数从大到小的顺序,对各个缓存块进行排列,得到缓存块序列。
然后,每次从缓存块序列中,选出排在序列首位的缓存块,作为待释放的缓存块。
其中,至少按照代码被失效次数从大到小的顺序,对各个缓存块进行排列,得到缓存块序列,具体是:按照代码被失效的次数从大到小的顺序,对各个缓存块进行排列。在排列过程中,对于代码被失效次数相同的缓存块,按照代码动态程度从大到小的顺序排列;对于代码动态程度相同的缓存块,按照代码被运行次数从小到大的顺序排列;对于代码被运行次数相同的代码块,按照代码最后一次被运行的时间从先到后的顺序排列,最终得到缓存块序列。
经过上述排列后,从缓存块序列中选择序列首位的缓存块进行释放,使得运行次数越多、最近被运行过、越静态的代码越容易被保留,而越动态、被失效次数越多的代码越容易被清除,这样既能保证对缓存的充分的循环利用,又能将对系统运行的影响降到最低。
综上所述可以理解,本申请实施例提出的代码翻译处理方法实现了对静态代码和动态自修改代码的缓存分离,从而使得在对缓存进行释放时能够有选择地释放特定类型的代码所占用的缓存,而不必每次释放缓存时都释放全部缓存。
进一步的,上述实施例中的方案还实现了低成本地检测缓存块中的代码运行情况,并且基于代码运行情况对缓存块进行管理,保证每次释放缓存块时,释放的是无效的或者很少使用的代码,提高了对缓存的利用效率,同时提高了代码运行和翻译的效率和性能。
更进一步的,在以上动静代码缓存分离以及代码缓存分块管理的基础上,本申请方案总能低成本淘汰不再需要使用的代码缓存,同时不影响静态代码。所以可以将代码缓冲区大小降为了128MB。对于arch64体系结构而言,跳转指令可以用26位来编码跳转范围,同时因为arch64一条指令有4个字节。所有整个指令缓存128MB范围可以被编码在一条指令内,进一步提高了二进制翻译的性能。
相应的,本申请实施例还提供了一种代码翻译处理系统,该系统应用于计算机系统的处理器,该计算机系统的缓存被划分为缓存块,所述缓存块中包括第一缓存块,所述第一缓存块用于存储动态自修改代码的翻译代码,参见图5所示,所述系统包括:
动态代码检测模块100,用于确定待翻译的目标代码的代码类型;所述代码类型为静态代码、动态自修改代码或未知类型代码;
代码翻译模块110,用于对所述目标代码进行翻译,得到翻译代码;在所述目标代码为动态自修改代码的情况下,将所述翻译代码存储至所述第一缓存块。
在一些实施例中,所述缓存中还包括第二缓存块和第三缓存块,所述第二缓存块用于存储静态代码的翻译代码,所述第三缓存块用于存储未知类型代码的翻译代码,所述代码翻译模块110还用于:
在所述目标代码为静态代码的情况下,将所述翻译代码存储至所述第二缓存块;
在所述目标代码为未知类型代码的情况下,将所述翻译代码存储至所述第三缓存块。
在一些实施例中,在所述目标代码为动态自修改代码的情况下,所述动态代码检测模块100还用于:基于针对目标代码所在内存块的属性变更事件,确定所述目标代码中被修改的代码页;
所述代码翻译模块110对所述目标代码进行翻译,得到翻译代码,包括:对所述目标代码中的被修改的代码页进行翻译,得到修改翻译代码;所述将所述翻译代码存储至缓存中的第一缓存块,包括:从存储所述被修改的代码页的原有翻译代码的第一缓存块中,删除所述被修改的代码页的原有翻译代码,并将所述修改翻译代码存储至该第一缓存块。
在一些实施例中,基于针对目标代码所在内存块的属性变更事件,确定所述目标代码中被修改的代码页,包括:
基于针对目标代码所在内存块的属性变更事件,确定目标代码所在内存块的属性变更情况;所述属性变更事件用于将目标代码所在内存块的属性设置为只读属性或可写属性;
在目标代码所在内存块的属性从只读属性变为可写属性时,记录所述目标代码的各个代码页的第一摘要;
在所述目标代码所在内存块的属性从可写属性变为只读属性时,记录所述目标代码的各个代码页的第二摘要;
根据所述各个代码页的第一摘要和第二摘要,从所述目标代码中确定出被修改的代码页。
在一些实施例中,所述代码翻译模块110对所述目标代码进行翻译,得到翻译代码,包括:
对所述目标代码进行翻译,并在翻译后的代码头部添加计数代码,得到翻译代码;其中,所述计数代码用于统计所述翻译代码被运行的次数。
在一些实施例中,所述动态代码检测模块100确定待翻译的目标代码的代码类型,包括:
基于针对目标代码所在内存块的属性变更事件,确定所述目标代码所在内存块的内存地址;所述属性变更事件用于对目标代码所在内存块的内存地址的属性进行设置;
判断所述目标代码所在内存块的内存地址是否处于第一内存范围之外,以及所述目标代码所在内存块的内存大小是否在设定的内存大小范围内;其中,所述第一内存范围包括静态代码映射到内存后所占用的内存地址范围;
在所述目标代码所在内存块的内存地址处于第一内存范围内的情况下,确定所述目标代码为静态代码;
在所述目标代码所在内存块的内存地址处于第一内存范围之外,并且所述目标代码所在内存块的内存大小在设定的内存大小范围内的情况下,确定所述目标代码为动态自修改代码;
在所述目标代码不能被确定为静态代码或动态自修改代码的情况下,确定所述目标代码为未知类型代码。
在一些实施例中,在所述目标代码为动态自修改代码的情况下,所述代码翻译模块110还用于:
检测所述缓存中的第一缓存块的空闲存储空间是否足以容纳所述翻译代码;
若所述缓存中的第一缓存块的空闲存储空间不足以容纳所述翻译代码,则从所述缓存中选出空闲缓存块作为第一缓存块。
在一些实施例中,所述处理器记录所述缓存中的各个缓存块的运行信息,所述运行信息包括代码动态程度、代码被失效的次数、代码最后一次被运行的时间、代码运行次数,其中,动态自修改代码的代码动态程度大于未知类型代码的代码动态程度,未知类型代码的代码动态程度大于静态代码的代码动态程度;所述系统还包括:
失效策略模块,用于在所述目标代码为动态自修改代码并且所述缓存中没有空闲的缓存块的情况下,基于所述缓存中各个缓存块的运行信息,从各个缓存块中选出待释放的缓存块;清除所述待释放的缓存块中的代码,以使所述代码翻译模块将所述翻译代码存储至该缓存块。
在一些实施例中,基于所述缓存中各个缓存块的运行信息,从各个缓存块中选出待释放的缓存块,包括:
至少按照代码被失效次数从大到小的顺序,对各个缓存块进行排列,得到缓存块序列;
从所述缓存块序列中,选出排在序列首位的缓存块,作为待释放的缓存块。
在一些实施例中,至少按照代码被失效次数从大到小的顺序,对各个缓存块进行排列,得到缓存块序列,包括:
按照代码被失效次数从大到小的顺序,对各个缓存块进行排列,得到缓存块序列;
其中,在所述缓存块序列中,代码被失效次数相同的缓存块按照代码动态程度从大到小的顺序排列,代码动态程度相同的缓存块按照代码被运行次数从小到大的顺序排列,代码被运行次数相同的代码块按照代码最后一次被运行的时间从先到后的顺序排列。
本实施例提供的代码翻译处理系统,与本申请上述实施例所提供的代码翻译处理方法属于同一申请构思,可执行本申请上述任意实施例所提供的代码翻译处理方法,具备执行方法相应的功能模块和有益效果。未在本实施例中详尽描述的技术细节,可参见本申请上述实施例提供的代码翻译处理方法的具体处理内容,此处不再加以赘述。
以上的动态代码检测模块100和代码翻译模块110等所实现的功能可以分别由相同或不同的处理器实现,本申请实施例不作限定。
应理解以上装置中的模块可以以处理器调用软件的形式实现。例如该装置包括处理器,处理器与存储器连接,存储器中存储有指令,处理器调用存储器中存储的指令,以实现以上任一种方法或实现该装置各单元的功能,其中处理器可以为通用处理器,例如CPU或微处理器等,存储器可以为装置内的存储器或装置外的存储器。或者,装置中的单元可以以硬件电路的形式实现,可以通过对硬件电路的设计,实现部分或全部单元的功能,该硬件电路可以理解为一个或多个处理器;例如,在一种实现中,该硬件电路为ASIC,通过对电路内元件逻辑关系的设计,实现以上部分或全部单元的功能;再如,在另一种实现中,该硬件电路可以通过PLD实现,以FPGA为例,其可以包括大量逻辑门电路,通过配置文件来配置逻辑门电路之间的连接关系,从而实现以上部分或全部单元的功能。以上装置的所有单元可以全部通过处理器调用软件的形式实现,或全部通过硬件电路的形式实现,或部分通过处理器调用软件的形式实现,剩余部分通过硬件电路的形式实现。
在本申请实施例中,处理器是一种具有信号的处理能力的电路,在一种实现中,处理器可以是具有指令读取与运行能力的电路,例如CPU、微处理器、GPU、或DSP等;在另一种实现中,处理器可以通过硬件电路的逻辑关系实现一定功能,该硬件电路的逻辑关系是固定的或可以重构的,例如处理器为ASIC或PLD实现的硬件电路,例如FPGA等。在可重构的硬件电路中,处理器加载配置文档,实现硬件电路配置的过程,可以理解为处理器加载指令,以实现以上部分或全部单元的功能的过程。此外,还可以是针对人工智能设计的硬件电路,其可以理解为一种ASIC,例如NPU、TPU、DPU等。
可见,以上装置中的各单元可以是被配置成实施以上方法的一个或多个处理器(或处理电路),例如:CPU、GPU、NPU、TPU、DPU、微处理器、DSP、ASIC、FPGA,或这些处理器形式中至少两种的组合。
此外,以上装置中的各单元可以全部或部分可以集成在一起,或者可以独立实现。在一种实现中,这些单元集成在一起,以SOC的形式实现。该SOC中可以包括至少一个处理器,用于实现以上任一种方法或实现该装置各单元的功能,该至少一个处理器的种类可以不同,例如包括CPU和FPGA,CPU和人工智能处理器,CPU和GPU等。
本申请另一实施例还提出一种计算机系统,该计算机系统的缓存被划分为缓存块,所述缓存块中包括第一缓存块,所述第一缓存块用于存储动态自修改代码的翻译代码,所述计算机系统的处理器被配置为执行上述任意实施例所述的代码翻译处理方法。
基于上述的计算机系统,本申请实施例还提出一种计算机设备,该计算机设备包括上述的计算机系统。
本申请另一实施例还提出一种电子设备,参见图6所示,该设备包括:
存储器200和处理器210;
其中,所述存储器200与所述处理器210连接,用于存储程序;
所述处理器210,用于通过运行所述存储器200中存储的程序,实现上述任一实施例公开的代码翻译处理方法。
具体的,上述电子设备还可以包括:总线、通信接口220、输入设备230和输出设备240。
处理器210、存储器200、通信接口220、输入设备230和输出设备240通过总线相互连接。其中:
总线可包括一通路,在计算机系统各个部件之间传送信息。
处理器210可以是通用处理器,例如通用中央处理器(CPU)、微处理器等,也可以是特定应用集成电路(application-specific integrated circuit,ASIC),或一个或多个用于控制本发明方案程序执行的集成电路。还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
处理器210可包括主处理器,还可包括基带芯片、调制解调器等。
存储器200中保存有执行本发明技术方案的程序,还可以保存有操作系统和其他关键业务。具体地,程序可以包括程序代码,程序代码包括计算机操作指令。更具体的,存储器200可以包括只读存储器(read-only memory,ROM)、可存储静态信息和指令的其他类型的静态存储设备、随机存取存储器(random access memory,RAM)、可存储信息和指令的其他类型的动态存储设备、磁盘存储器、flash等等。
输入设备230可包括接收用户输入的数据和信息的装置,例如键盘、鼠标、摄像头、扫描仪、光笔、语音输入装置、触摸屏、计步器或重力感应器等。
输出设备240可包括允许输出信息给用户的装置,例如显示屏、打印机、扬声器等。
通信接口220可包括使用任何收发器一类的装置,以便与其他设备或通信网络通信,如以太网,无线接入网(RAN),无线局域网(WLAN)等。
处理器210执行存储器200中所存放的程序,以及调用其他设备,可用于实现本申请上述实施例所提供的任意一种代码翻译处理方法的各个步骤。
本申请实施例还提出一种芯片,该芯片包括处理器和数据接口,所述处理器通过所述数据接口读取并运行存储器上存储的程序,以执行上述任意实施例所介绍的代码翻译处理方法,具体处理过程及其有益效果可参见上述的代码翻译处理方法的实施例介绍。
除了上述方法和设备以外,本申请的实施例还可以是计算机程序产品,其包括计算机程序指令,所述计算机程序指令在被处理器运行时使得所述处理器执行本说明书上述任意实施例中描述的代码翻译处理方法中的步骤。
所述计算机程序产品可以以一种或多种程序设计语言的任意组合来编写用于执行本申请实施例操作的程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、C++等,还包括常规的过程式程序设计语言,诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。
此外,本申请的实施例还可以是存储介质,其上存储有计算机程序,计算机程序被处理器执行本说明书上述任意实施例中描述的代码翻译处理方法中的步骤。
对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本申请各实施例方法中的步骤可以根据实际需要进行顺序调整、合并和删减,各实施例中记载的技术特征可以进行替换或者组合。
本申请各实施例种装置及终端中的模块和子模块可以根据实际需要进行合并、划分和删减。
本申请所提供的几个实施例中,应该理解到,所揭露的终端,装置和方法,可以通过其它的方式实现。例如,以上所描述的终端实施例仅仅是示意性的,例如,模块或子模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个子模块或模块可以结合或者可以集成到另一个模块,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
作为分离部件说明的模块或子模块可以是或者也可以不是物理上分开的,作为模块或子模块的部件可以是或者也可以不是物理模块或子模块,即可以位于一个地方,或者也可以分布到多个网络模块或子模块上。可以根据实际的需要选择其中的部分或者全部模块或子模块来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能模块或子模块可以集成在一个处理模块中,也可以是各个模块或子模块单独物理存在,也可以两个或两个以上模块或子模块集成在一个模块中。上述集成的模块或子模块既可以采用硬件的形式实现,也可以采用软件功能模块或子模块的形式实现。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件单元,或者二者的结合来实施。软件单元可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

Claims (14)

1.一种代码翻译处理方法,其特征在于,应用于计算机系统的处理器,所述计算机系统的缓存被划分为缓存块,所述缓存块中包括第一缓存块,所述第一缓存块用于存储动态自修改代码的翻译代码,所述方法包括:
确定待翻译的目标代码的代码类型;所述代码类型为静态代码、动态自修改代码或未知类型代码;
对所述目标代码进行翻译,得到翻译代码;
在所述目标代码为动态自修改代码的情况下,将所述翻译代码存储至所述第一缓存块。
2.根据权利要求1所述的方法,其特征在于,所述缓存中还包括第二缓存块和第三缓存块,所述第二缓存块用于存储静态代码的翻译代码,所述第三缓存块用于存储未知类型代码的翻译代码,所述方法还包括:
在所述目标代码为静态代码的情况下,将所述翻译代码存储至所述第二缓存块;
在所述目标代码为未知类型代码的情况下,将所述翻译代码存储至所述第三缓存块。
3.根据权利要求1所述的方法,其特征在于,在所述目标代码为动态自修改代码的情况下,所述方法还包括:
基于针对目标代码所在内存块的属性变更事件,确定所述目标代码中被修改的代码页;
所述对所述目标代码进行翻译,得到翻译代码,包括:
对所述目标代码中的被修改的代码页进行翻译,得到修改翻译代码;
所述将所述翻译代码存储至缓存中的第一缓存块,包括:
从存储所述被修改的代码页的原有翻译代码的第一缓存块中,删除所述被修改的代码页的原有翻译代码,并将所述修改翻译代码存储至该第一缓存块。
4.根据权利要求3所述的方法,其特征在于,基于针对目标代码所在内存块的属性变更事件,确定所述目标代码中被修改的代码页,包括:
基于针对目标代码所在内存块的属性变更事件,确定目标代码所在内存块的属性变更情况;所述属性变更事件用于将目标代码所在内存块的属性设置为只读属性或可写属性;
在目标代码所在内存块的属性从只读属性变为可写属性时,记录所述目标代码的各个代码页的第一摘要;
在所述目标代码所在内存块的属性从可写属性变为只读属性时,记录所述目标代码的各个代码页的第二摘要;
根据所述各个代码页的第一摘要和第二摘要,从所述目标代码中确定出被修改的代码页。
5.根据权利要求1所述的方法,其特征在于,对所述目标代码进行翻译,得到翻译代码,包括:
对所述目标代码进行翻译,并在翻译后的代码头部添加计数代码,得到翻译代码;其中,所述计数代码用于统计所述翻译代码被运行的次数。
6.根据权利要求1所述的方法,其特征在于,确定待翻译的目标代码的代码类型,包括:
基于针对目标代码所在内存块的属性变更事件,确定所述目标代码所在内存块的内存地址;所述属性变更事件用于对目标代码所在内存块的内存地址的属性进行设置;
判断所述目标代码所在内存块的内存地址是否处于第一内存范围之外,以及所述目标代码所在内存块的内存大小是否在设定的内存大小范围内;其中,所述第一内存范围包括静态代码映射到内存后所占用的内存地址范围;
在所述目标代码所在内存块的内存地址处于第一内存范围内的情况下,确定所述目标代码为静态代码;
在所述目标代码所在内存块的内存地址处于第一内存范围之外,并且所述目标代码所在内存块的内存大小在设定的内存大小范围内的情况下,确定所述目标代码为动态自修改代码;
在所述目标代码不能被确定为静态代码或动态自修改代码的情况下,确定所述目标代码为未知类型代码。
7.根据权利要求1所述的方法,其特征在于,在所述目标代码为动态自修改代码的情况下,所述方法还包括:
检测所述缓存中的第一缓存块的空闲存储空间是否足以容纳所述翻译代码;
若所述缓存中的第一缓存块的空闲存储空间不足以容纳所述翻译代码,则从所述缓存中选出空闲缓存块作为第一缓存块。
8.根据权利要求1至7中任意一项所述的方法,其特征在于,所述处理器记录所述缓存中的各个缓存块的运行信息,所述运行信息包括代码动态程度、代码被失效的次数、代码最后一次被运行的时间、代码运行次数,其中,动态自修改代码的代码动态程度大于未知类型代码的代码动态程度,未知类型代码的代码动态程度大于静态代码的代码动态程度;所述方法还包括:
在所述缓存中没有空闲的缓存块的情况下,基于所述缓存中各个缓存块的运行信息,从各个缓存块中选出待释放的缓存块,并清除所述待释放的缓存块中的代码。
9.根据权利要求8所述的方法,其特征在于,基于所述缓存中各个缓存块的运行信息,从各个缓存块中选出待释放的缓存块,包括:
至少按照代码被失效次数从大到小的顺序,对各个缓存块进行排列,得到缓存块序列;
从所述缓存块序列中,选出排在序列首位的缓存块,作为待释放的缓存块。
10.根据权利要求9所述的方法,其特征在于,至少按照代码被失效次数从大到小的顺序,对各个缓存块进行排列,得到缓存块序列,包括:
按照代码被失效次数从大到小的顺序,对各个缓存块进行排列,得到缓存块序列;
其中,在所述缓存块序列中,代码被失效次数相同的缓存块按照代码动态程度从大到小的顺序排列,代码动态程度相同的缓存块按照代码被运行次数从小到大的顺序排列,代码被运行次数相同的代码块按照代码最后一次被运行的时间从先到后的顺序排列。
11.一种代码翻译处理系统,其特征在于,应用于计算机系统的处理器,所述计算机系统的缓存被划分为缓存块,所述缓存块中包括第一缓存块,所述第一缓存块用于存储动态自修改代码的翻译代码,所述系统包括:
动态代码检测模块,用于确定待翻译的目标代码的代码类型;所述代码类型为静态代码、动态自修改代码或未知类型代码;
代码翻译模块,用于对所述目标代码进行翻译,得到翻译代码;在所述目标代码为动态自修改代码的情况下,将所述翻译代码存储至所述第一缓存块。
12.根据权利要求11所述的系统,其特征在于,所述处理器记录所述缓存中的各个缓存块的运行信息,所述运行信息包括代码动态程度、代码被失效的次数、代码最后一次被运行的时间、代码运行次数,其中,动态自修改代码的代码动态程度大于未知类型代码的代码动态程度,未知类型代码的代码动态程度大于静态代码的代码动态程度;所述系统还包括:
失效策略模块,用于在所述目标代码为动态自修改代码并且所述缓存中没有空闲的缓存块的情况下,基于所述缓存中各个缓存块的运行信息,从各个缓存块中选出待释放的缓存块;清除所述待释放的缓存块中的代码,以使所述代码翻译模块将所述翻译代码存储至该缓存块。
13.一种计算机系统,其特征在于,所述计算机系统的缓存被划分为缓存块,所述缓存块中包括第一缓存块,所述第一缓存块用于存储动态自修改代码的翻译代码,所述计算机系统的处理器被配置为执行如权利要求1至10中任意一项所述的代码翻译处理方法。
14.一种计算机设备,其特征在于,包括如权利要求13所述的计算机系统。
CN202311649185.4A 2023-12-05 2023-12-05 代码翻译处理方法、系统、计算机系统及计算机设备 Active CN117348889B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311649185.4A CN117348889B (zh) 2023-12-05 2023-12-05 代码翻译处理方法、系统、计算机系统及计算机设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311649185.4A CN117348889B (zh) 2023-12-05 2023-12-05 代码翻译处理方法、系统、计算机系统及计算机设备

Publications (2)

Publication Number Publication Date
CN117348889A CN117348889A (zh) 2024-01-05
CN117348889B true CN117348889B (zh) 2024-02-02

Family

ID=89367062

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311649185.4A Active CN117348889B (zh) 2023-12-05 2023-12-05 代码翻译处理方法、系统、计算机系统及计算机设备

Country Status (1)

Country Link
CN (1) CN117348889B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1823322A (zh) * 2003-07-15 2006-08-23 可递有限公司 用于程序代码转换的共享代码缓存方法及设备
CN110502881A (zh) * 2019-07-31 2019-11-26 广州微算互联信息技术有限公司 动态修改安卓系统只读属性的方法、系统及存储介质

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7805710B2 (en) * 2003-07-15 2010-09-28 International Business Machines Corporation Shared code caching for program code conversion
US7934204B2 (en) * 2003-07-15 2011-04-26 International Business Machines Corporation Partitioning code in program code conversion

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1823322A (zh) * 2003-07-15 2006-08-23 可递有限公司 用于程序代码转换的共享代码缓存方法及设备
CN110502881A (zh) * 2019-07-31 2019-11-26 广州微算互联信息技术有限公司 动态修改安卓系统只读属性的方法、系统及存储介质

Also Published As

Publication number Publication date
CN117348889A (zh) 2024-01-05

Similar Documents

Publication Publication Date Title
CN107066396B (zh) 用于操作虚拟索引的物理标记的缓存的装置及方法
US8423715B2 (en) Memory management among levels of cache in a memory hierarchy
US8185692B2 (en) Unified cache structure that facilitates accessing translation table entries
JP2005500592A (ja) 共有メモリを用いて仮想メモリを実現するマルチプロセッサシステムならびにページ化メモリの整合性を管理するためのページ差し替え方法
US11080401B2 (en) Memory scanning methods and apparatus
US20100250890A1 (en) Managing working set use of a cache via page coloring
KR101451045B1 (ko) 컴퓨터 메모리 관리방법 및 컴퓨터 프로그램제품과 이를 위한 데이터 저장 장치
US9910781B2 (en) Page table including data fetch width indicator
JP2009151650A (ja) 計算機仮想化装置、そのプログラム、及びその方法
TW200417857A (en) Allocating cache lines
US20230315634A1 (en) Reconfigurable cache hierarchy framework for the storage of fpga bitstreams
CN113039530A (zh) 压缩式存储系统的空闲空间管理
US9734088B2 (en) Memory management unit and method for accessing data
CN117348889B (zh) 代码翻译处理方法、系统、计算机系统及计算机设备
US10489300B1 (en) Increasing caching efficiency using cache data patterns
US7203797B2 (en) Memory management of local variables
CN117407003B (zh) 代码翻译处理方法、装置、处理器及计算机设备
US20010032297A1 (en) Cache memory apparatus and data processing system
KR101075286B1 (ko) 프로세서에서의 스택-기반 메모리 사용의 관리
US9483180B2 (en) Memory-area property storage including data fetch width indicator
CN116795736A (zh) 数据预读取方法、装置、电子设备和存储介质
CN117891754B (zh) 处理器Cache结构的缓存方法、计算子系统以及智能计算平台
CN114968076A (zh) 用于存储管理的方法、设备、介质和程序产品
CN114780452A (zh) 一种TLB entry合并方法及一种地址转换方法
CN115357525A (zh) 探听过滤器、处理单元、计算设备和相关方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant