CN116700841B - 一种原生api调用的方法及装置 - Google Patents

一种原生api调用的方法及装置 Download PDF

Info

Publication number
CN116700841B
CN116700841B CN202310974697.1A CN202310974697A CN116700841B CN 116700841 B CN116700841 B CN 116700841B CN 202310974697 A CN202310974697 A CN 202310974697A CN 116700841 B CN116700841 B CN 116700841B
Authority
CN
China
Prior art keywords
native api
target
native
api
virtual machine
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
CN202310974697.1A
Other languages
English (en)
Other versions
CN116700841A (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.)
Beijing CEC Huada Electronic Design Co Ltd
Original Assignee
Beijing CEC Huada Electronic Design 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 Beijing CEC Huada Electronic Design Co Ltd filed Critical Beijing CEC Huada Electronic Design Co Ltd
Priority to CN202310974697.1A priority Critical patent/CN116700841B/zh
Publication of CN116700841A publication Critical patent/CN116700841A/zh
Application granted granted Critical
Publication of CN116700841B publication Critical patent/CN116700841B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • 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)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本说明书公开了一种原生API调用的方法及装置。首先,在与目标应用的应用代码对应的WebAssembly字节码向虚拟机下载的过程中,判断目标应用调用的目标函数是否为原生API,如果是,将原生API注册表中的与目标函数对应的目标原生API的可执行代码地址写入到目标函数。然后,在目标应用调用目标原生API的过程中,将虚拟机栈中的目标原生API的参数的取值拷贝到系统栈,按照系统栈中的目标原生API的参数的取值,执行目标函数,得到目标函数的返回值。最后,将系统栈中的目标函数的返回值拷贝到虚拟机栈中,执行目标应用。从而,在虚拟机执行目标应用时,间接的对原生API进行调用。

Description

一种原生API调用的方法及装置
技术领域
本说明书涉及计算机技术领域,尤其涉及一种原生API调用的方法及装置。
背景技术
WebAssembly是一种能够将其他编程语言编译为浏览器可执行的二进制文件的技术。例如,为诸如C/C++等语言提供一个编译目标,以便它们可以在Web上运行。也就是说,WebAssembly并不是一门编程语言,而是一份字节码标准,需要用高级编程语言编译出WebAssembly字节码放到虚拟机中才能运行。
目前,WebAssembly字节码在虚拟机上运行,没有直接访问计算机的本地资源(如磁盘、网络、文件系统等)的权限。并且,操作系统中的原生API通过操作系统的编程语言进行编写,不能转换为WebAssembly字节码,也不能在虚拟机的解释器中执行,从而,导致虚拟机无法直接调用原生API。
因此,如何通过WebAssembly字节码对原生API进行调用,则是一个亟待解决的问题。
发明内容
本说明书提供一种原生API调用的方法、装置、电子设备及机器可读存储介质,以通过WebAssembly字节码对原生API进行调用。
本说明书采用下述技术方案:
本说明书提供了一种原生API调用的方法,所述方法应用于电子设备上搭载的用于运行应用的虚拟机,所述虚拟机的内存空间中存储有由若干个原生API的信息组成的原生API注册表,所述原生API的信息包括:可执行代码地址、参数,包括:
在与目标应用的应用代码对应的WebAssembly字节码向所述虚拟机下载的过程中,判断所述目标应用调用的目标函数是否为原生API,如果是,将所述原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数;
在所述目标应用调用目标原生API的过程中,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈,以使所述电子设备上搭载的操作系统在与所述目标原生API的可执行代码地址上,按照所述系统栈中的所述目标原生API的参数的取值,执行所述目标函数,得到所述目标函数的返回值;
将所述系统栈中的所述目标函数的返回值拷贝到所述虚拟机栈中,执行所述目标应用。
可选地,所述电子设备包括:资源受限设备。
可选地,所述原生API的信息还包括:原生API标识;
在如果是,将所述原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数之前,所述方法还包括:
如果是,判断所述原生API注册表中是否存在与所述目标函数的API标识相同的原生API标识;
如果是,判断所述原生API注册表中是否存在与所述目标函数的参数相同的原生API的参数。
可选地,在判断所述原生API注册表中是否存在与所述目标函数的API标识相同的原生API标识之前,所述方法还包括:
按照预设的校验算法,对所述原生API注册表中的原生API标识进行运算,得到所述原生API注册表中的原生API标识的运算结果;
判断所述原生API注册表中是否存在与所述目标函数的API标识相同的原生API标识,包括:
按照预设的校验算法,对所述目标函数的原生API标识进行运算,得到所述目标函数的原生API标识的运算结果;
判断所述原生API注册表中是否存在与所述目标函数的API标识的运算结果相同的原生API标识的运算结果。
可选地,在判断所述原生API注册表中是否存在与所述目标函数的参数相同的原生API的参数之前,所述方法还包括:
按照预设的校验算法,对所述原生API注册表中的原生API的参数进行运算,得到所述原生API注册表中的原生API的参数的运算结果;
判断所述原生API注册表中是否存在与所述目标函数的参数相同的原生API的参数,包括:
按照预设的校验算法,对所述目标函数的参数进行运算,得到所述目标函数的参数的运算结果;
判断所述原生API注册表中是否存在与所述目标函数的参数的运算结果相同的原生API的参数的运算结果。
可选地,所述虚拟机的内存空间包括:易失存储设备;
在判断所述目标应用调用的目标函数是否为原生API之前,所述方法还包括:
根据获取到的目标应用所需的原生API 的信息,对存储在所述易失存储设备中的原生API注册表进行修改,得到修改后的原生API注册表;
将所述原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数,包括:
将所述修改后的原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数。
可选地,所述虚拟机的内存空间包括:非易失存储设备,所述非易失存储设备中存储有所述原生API注册表。
可选地,所述原生API注册表由通过预设的数据结构连接的若干个子表组成,所述原生API注册表的子表中设置有子表标识。
可选地,在将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈之前,所述方法还包括:
获取所述目标应用的内存地址范围;
判断所述原生API的参数中是否存在指针类型的参数,如果是,判断所述指针类型的参数所在的内存地址是否超出所述目标应用的内存地址范围;
如果是,向所述目标应用返回错误信息;如果否,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈。
可选地,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈,包括:
根据所述目标原生API的参数的取值,计算所述目标原生API的参数在虚拟机栈的内存地址;
根据所述目标原生API的参数在虚拟机栈的内存地址,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈。
本说明书提供了一种原生API调用的装置,所述装置应用于电子设备上搭载的用于运行应用的虚拟机,所述虚拟机的内存空间中存储有由若干个原生API的信息组成的原生API注册表,所述原生API的信息包括:可执行代码地址、参数,包括:
判断模块,用于在与目标应用的应用代码对应的WebAssembly字节码向所述虚拟机下载的过程中,判断所述目标应用调用的目标函数是否为原生API,如果是,将所述原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数;
拷贝模块,用于在所述目标应用调用所述目标原生API的过程中,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈,以使所述电子设备上搭载的操作系统在与所述目标原生API的可执行代码地址上,按照所述系统栈中的所述目标原生API的参数的取值,执行所述目标函数,得到所述目标函数的返回值;
执行模块,用于将所述系统栈中的所述目标函数的返回值拷贝到所述虚拟机栈中,执行所述目标应用。
本说明书提供了一种电子设备,包括通信接口、处理器、存储器和总线,所述通信接口、所述处理器和所述存储器之间通过总线相互连接;
所述存储器中存储机器可读指令,所述处理器通过调用所述机器可读指令,执行上述原生API调用的方法。
本说明书提供了一种机器可读存储介质,所述机器可读存储介质存储有机器可读指令,所述机器可读指令在被处理器调用和执行时,实现上述原生API调用的方法。
本说明书采用的上述至少一个技术方案能够达到以下有益效果:
在本说明书提供的原生API调用的方法中,虚拟机的内存空间中存储有由若干个原生API的信息组成的原生API注册表。在与目标应用的应用代码对应的WebAssembly字节码向所述虚拟机下载的过程中,判断目标应用调用的目标函数是否为原生API,如果是,将原生API注册表中的与目标函数对应的目标原生API的可执行代码地址写入到目标函数。然后,在目标应用调用目标原生API的过程中,将虚拟机栈中的目标原生API的参数的取值拷贝到系统栈,以使电子设备上搭载的操作系统在与目标原生API的可执行代码地址上,按照系统栈中的目标原生API的参数的取值,执行目标函数,得到目标函数的返回值。最后,将系统栈中的目标函数的返回值拷贝到虚拟机栈中,执行目标应用。从而,在虚拟机执行与目标应用的应用代码对应的WebAssembly字节码时,间接的对原生API进行调用。
附图说明
此处所说明的附图用来提供对本说明书的进一步理解,构成本说明书的一部分,本说明书的示意性实施例及其说明用于解释本说明书,并不构成对本说明书的不当限定。在附图中:
图1是一示例性的实施例示出的一种原生API调用的方法的流程图;
图2是一示例性的实施例示出的虚拟机栈与系统栈之间的参数传递的示意图;
图3是一示例性的实施例示出的原生API的调用过程的示意图;
图4是一示例性的实施例示出的一种原生API调用的装置所在电子设备的结构图;
图5是一示例性的实施例示出的一种原生API调用的装置的框图。
具体实施方式
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
为了使本技术领域的人员更好地理解本说明书实施例中的技术方案,下面先对本说明书实施例涉及的相关技术,进行简要说明。
WebAssembly是一种能够将其他编程语言编译为浏览器可执行的二进制文件的技术。例如,为诸如C/C++等语言提供一个编译目标,以便它们可以在Web上运行。也就是说,WebAssembly并不是一门编程语言,而是一份字节码标准,需要用高级编程语言编译出字节码放到WebAssembly虚拟机中才能运行。
原生API(Native API)是指操作系统提供的一组本地接口,为开发人员提供了底层操作系统功能的接口,例如文件管理、进程管理、线程管理、网络通信、内存管理等。
可执行代码地址是指计算机的内存中存储可执行程序的物理位置或虚拟位置。
资源受限设备(Resource Constrained Device)通常是指电量供应有限,计算能力有限,以及存储容量有限的电子设备。例如,智能卡(Smart Card)和安全单元(SecureElement)等。
虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
虚拟机栈(VirtualMachine Stack)可以是在运行虚拟机时为每个线程创建的一块内存区域,可以用来储存栈帧(Stack Frame)。
系统栈(System Stack)可以是操作系统在运行过程中为每个线程或进程所维护的一块内存区域。系统栈可以是计算机系统中用于管理函数调用和局部变量的一种内存结构,系统栈可以用来储存栈帧。
栈帧是用于支持函数调用和返回的一种数据结构,存储了参数、局部变量、中间运行结果、返回值以及调用方法等信息。其中,每一个函数从调用开始至执行完成的过程,都对应着一个栈帧从入栈到出栈的过程。例如,虚拟机在调用函数时,会创建一个栈帧并压入虚拟机栈。在执行函数完成时,会销毁与该函数对应的栈帧。再例如,操作系统在调用函数时,会创建一个栈帧并压入系统栈。在执行函数完成时,会销毁与该函数对应的栈帧。
在实际应用中,WebAssembly字节码在虚拟机上运行,没有直接访问计算机的本地资源(如磁盘、网络、文件系统等)的权限。并且,操作系统中的原生API通过操作系统的编程语言进行编写,不能转换为WebAssembly字节码,也不能在虚拟机的解释器中执行,从而,导致虚拟机无法直接调用原生API。
基于此,本说明书提出了一种在虚拟机执行与目标应用的应用代码对应的WebAssembly字节码时,通过虚拟机栈与系统栈之间的参数传递,间接的对原生API进行调用的技术方案。
以下结合附图,详细说明本说明书各实施例提供的技术方案。
图1是一示例性的实施例示出的一种原生API调用的方法的流程图,具体包括以下步骤:
S100:在与目标应用的应用代码对应的WebAssembly字节码向所述虚拟机下载的过程中,判断所述目标应用调用的目标函数是否为原生API,如果是,将所述原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数。
在本说明书实施例中,原生API调用的方法应用于电子设备上搭载的用于运行应用的虚拟机,执行主体可以是虚拟机。虚拟机的物理载体可以是电子设备,电子设备包括:服务器、服务器集群、资源受限设备等。为了便于描述,下面仅以虚拟机为执行主体,对本说明书提供的原生API调用的方法进行说明。
在本说明书实施例中,虚拟机的内存空间中存储有由若干个原生API的信息组成的原生API注册表。原生API的信息包括:可执行代码地址、参数。这里提到的参数包括:输入参数、输出参数、返回值等。
其中,原生API的参数可以通过字符串编码进行表示。例如,字符“u”代表整型变量,“*”代表指针变量,“-”代表指针变量的长度。字符串“(*-u)u”表示原生API有三个输入参数,且存在返回值。括号内的三个参数用于表示输入参数,第一个参数为指针变量,第二个参数是指针变量的长度,第三个参数是整型变量,括号外的参数用于表示返回值,返回值是整型变量。再例如,原生API的参数还可以按照特定规则进行排序之后,通过序号进行表示。例如,序号1表示原生API有一个整型变量参数且没有返回值,序号2表示原生API有一个整型变量参数和一个整型返回值,序号3表示原生API有一个指针类型变量参数且没有返回值等。
需要说明的是,原生API注册表可以由通过预设的数据结构连接的若干个子表组成,原生API注册表的子表中设置有子表标识。这里提到的数据结构包括但不限于数组、集合、链表。这里提到的子表标识可以包括:原生API功能的分类标识、原生API类型的分类标识、原生API可执行代码地址的分类标识等。
例如,原生API功能的分类标识可以是指按照原生 API支持的功能进行分类,得到的分类标识,功能可以包括:通信功能、存储功能等。原生API类型的分类标识可以是指按照原生 API中的参数数量进行分类,得到的分类标识。原生API可执行代码地址的分类标识可以是指按照原生 API的内存地址所处的存储空间进行分类,得到的分类标识。存储空间包括:线性内存空间、安全瞬态数据空间等。安全瞬态数据空间可以用于存放安全性较高的应用临时数据。
在实际应用中,函数可能是原生API,也可能是API,而由于虚拟机无法直接调用原生API。因此,虚拟机需要先判断调用的函数是否为原生API,如果是,虚拟机可以按照原生API调用的方法,间接的对原生API进行调用。如果否,虚拟机可以正常调用API。
在本说明书实施例中,在与目标应用的应用代码对应的WebAssembly字节码向虚拟机下载的过程中,判断目标应用调用的目标函数是否为原生API,如果是,将原生API注册表中的与目标函数对应的目标原生API的可执行代码地址写入到目标函数。
其中,判断目标应用调用的目标函数是否为原生API的方法可以有多种。例如,虚拟机可以是检查目标函数的模块标识是否为指定字符串。如果是,确定目标函数是原生API,如果否,确定目标函数不是原生API。指定字符串可以为“native”。再例如,目标函数模块标识按照特定规则进行排序之后,通过序号进行表示。虚拟机可以是检查目标函数的模块标识是否为指定序号。如果是,确定目标函数是原生API,如果否,确定目标函数不是原生API。再例如,将上述指定字符串或指定序号按照预设的校验算法进行运算,得到的运算结果,根据运算结果,判断目标函数是否为原生API。本说明书不对目标函数的模块标识的表示方法进行限定。
需要说明的是,预设的校验算法可以是指循环冗余校验算法(Cyclic RedundancyCheck,CRC)、哈希算法(Hash)等。本说明书不对校验算法进行限定。
在本说明书实施例中,原生API注册表可以存储在易失存储设备或非易失存储设备。由于,易失存储设备中的存储空间较小,较为稀缺,因此,在原生API固定不变的情况下,虚拟机可以将原生API注册表存储在非易失存储设备。例如,通过常量数组的形式固定原生API注册表的内容,只存储在一个主表中,在系统编译完成后自动完成所有原生API的添加。
而在原生API注册表中的原生API需要进行更改的情况下,原生API注册表可以存储在易失存储设备。虚拟机可以根据获取到的目标应用所需的原生API 的信息,对存储在易失存储设备中的原生API注册表进行修改,得到修改后的原生API注册表。
例如,在系统执行过程中,通过动态下载或补丁等形式,对原生API注册表进行修改。修改方式包括但不限于对原生API注册表进行修改、添加、删除,以及对原生API注册表的子表进行增加、删除以及对对原生API注册表的子表的排序进行修改。
然后,虚拟机可以将修改后的原生API注册表中的与目标函数对应的目标原生API的可执行代码地址写入到目标函数。
需要说明的是,若确定原生API注册表存储于易失存储设备中,每次系统初始化时,需要进行原生API注册表初始化。若确定原生API注册表存储于非易失存储设备中,只在第一次系统初始化时,需要进行原生API注册表初始化。
在本说明书实施例中,原生API的信息还包括:原生API标识。这里提到的原生API标识可以是指函数名的字符串,例如,函数名的字符串可以为“sys_api_name”。原生API标识还可以按照特定规则进行排序之后,通过序号进行表示。例如,原生API注册表中的第一个原生API的原生API标识为1,第二个原生API的原生API标识为2 ,以此类推。
在与目标应用的应用代码对应的WebAssembly字节码向虚拟机下载的过程中,判断目标应用调用的目标函数是否为原生API,如果否,目标应用调用目标函数。如果是,判断原生API注册表中是否存在与目标函数的API标识相同的原生API标识。
如果否,向目标应用返回错误信息。如果是,判断原生API注册表中是否存在与目标函数的参数相同的原生API的参数。
如果否,向目标应用返回错误信息。如果是,将原生API注册表中的与目标函数对应的目标原生API的可执行代码地址写入到目标函数。
在实际应用中,由于计算机的存储空间有限,虚拟机可以将原生API注册表中的原生API的信息进行计算,得到占用存储空间较少的与原生API对应的运算结果,从而,减少原生API注册表所占用的存储空间。
在本说明书实施例中,虚拟机可以按照预设的校验算法,对原生API注册表中的原生API标识进行运算,得到原生API注册表中的原生API标识的运算结果。
然后,虚拟机可以按照预设的校验算法,对目标函数的原生API标识进行运算,得到目标函数的原生API标识的运算结果。
最后,虚拟机可以判断原生API注册表中是否存在与目标函数的API标识的运算结果相同的原生API标识的运算结果。
进一步的,虚拟机可以按照预设的校验算法,对原生API注册表中的原生API的参数进行运算,得到原生API注册表中的原生API的参数的运算结果。
然后,虚拟机可以按照预设的校验算法,对目标函数的参数进行运算,得到目标函数的参数的运算结果。
最后,虚拟机可以判断原生API注册表中是否存在与目标函数的参数的运算结果相同的原生API的参数的运算结果。
需要说明的是,原生API标识的运算结果占用2字节的存储空间。原生API参数占用1个字节的存储空间。原生API可执行地址的运算结果占用4个字节的存储空间。
S102:在所述目标应用调用所述目标原生API的过程中,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈,以使所述电子设备上搭载的操作系统在与所述目标原生API的可执行代码地址上,按照所述系统栈中的所述目标原生API的参数的取值,执行所述目标函数,得到所述目标函数的返回值。
由于,WebAssembly字节码在虚拟机上运行,而操作系统中的原生API通过操作系统的编程语言进行编写,不能在虚拟机的解释器中执行,这两者位于不同的运行环境,从而,导致虚拟机无法直接调用原生API。
基于此,虚拟机可以将虚拟机栈中的原生API的参数的取值拷贝到系统栈,以使操作系统按照系统栈中的原生API的参数的取值,执行目标应用,从而,间接的调用原生API。
在本说明书实施例中,虚拟机可以执行与目标应用的应用代码对应的WebAssembly字节码,在目标应用调用目标原生API的过程中,将虚拟机栈中的目标原生API的参数的取值拷贝到系统栈,以使电子设备上搭载的操作系统在与目标原生API的可执行代码地址上,按照系统栈中的目标原生API的参数的取值,执行目标函数,得到目标函数的返回值。
在实际应用中,原生API的参数的参数类型有多种,例如、整型变量、指针变量等。指针变量是一种特殊类型的变量,它存储了变量的内存地址。由于,每个应用对应有一个独立的内存空间。当指针变量的内存地址超出与目标应用对应的内存地址范围,会导致执行应用出现错误。
基于此,虚拟机需要在将虚拟机栈中的目标原生API的参数的取值拷贝到系统栈之前,判断指针变量中的内存地址是否超出与目标应用对应的内存地址范围。
在本说明书实施例中,虚拟机可以获取所述目标应用的内存地址范围。
然后,判断原生API的参数中是否存在指针类型的参数,如果是,判断指针类型的参数所在的内存地址是否超出目标应用的内存地址范围。
如果是,向目标应用返回错误信息。如果否,将虚拟机栈中的目标原生API的参数的取值拷贝到系统栈。
其中,由于虚拟机不支持指针变量,若确定原生API的参数类型为指针变量,虚拟机需要将参数转换为指针变量,并拷贝到系统栈。例如,通过参数获得指针变量在内存空间中的偏移量,加上内存空间的起始内存地址,得到指针变量对应的内存地址。
在实际应用中,由于不同的原生API中的参数数量不同,导致不同的原生API的参数在虚拟机栈中的内存空间不同。因此,虚拟机需要先确定出目标原生API的参数在虚拟机栈中的内存空间,再将虚拟机栈中的目标原生API的参数的取值拷贝到系统栈。
在本说明书实施例中,虚拟机可以根据目标原生API的参数的取值,计算目标原生API的参数在虚拟机栈的内存地址。
然后,虚拟机可以根据目标原生API的参数在虚拟机栈的内存地址,将虚拟机栈中的目标原生API的参数的取值拷贝到系统栈。具体如图2所示。
图2是一示例性的实施例示出的虚拟机栈与系统栈之间的参数传递的示意图。
在图2中,栈指针的原始位置可以是指栈指针在调用目标函数之前的位置。栈指针的新位置可以是指栈指针在调用目标函数之后的位置。虚拟机可以根据目标原生API的参数的取值,计算目标原生API的参数在虚拟机栈的内存地址。再根据目标原生API的参数在虚拟机栈的内存地址,将虚拟机栈中的目标原生API的参数的取值拷贝到系统栈。
S104:将所述系统栈中的所述目标函数的返回值拷贝到所述虚拟机栈中,执行所述目标应用。
在本说明书实施例中,虚拟机可以将系统栈中的目标函数的返回值拷贝到虚拟机栈中,执行目标应用。
由于虚拟机无法传递参数类型为指针变量的参数,判断目标函数的返回值是否为指针变量,如果是,虚拟机将指针变量转换为虚拟机能操作的内存空间的偏移量后,拷贝到虚拟机栈。如果否,返回值不做处理,直接拷贝到虚拟机栈。
在本说明书实施例中,虚拟机可以在执行与目标应用的应用代码对应的WebAssembly字节码时,间接的对原生API进行调用。具体如图3所示。
图3是一示例性的实施例示出的原生API的调用过程的示意图。
在图3中,虚拟机的内存空间中存储有原生API注册表。在与目标应用的应用代码对应的WebAssembly字节码向虚拟机下载的过程中,判断目标应用调用的目标函数的模块标识是否为原生API的模块标识,如果是,判断原生API注册表中是否存在与目标函数的API标识相同的原生API标识。
如果是,判断原生API注册表中是否存在与目标函数的参数相同的原生API的参数。
如果是,将原生API注册表中的与目标函数对应的目标原生API的可执行代码地址写入到目标函数。
然后,在所述目标应用调用目标原生API的过程中,虚拟机可以获取目标应用的内存地址范围,判断原生API的参数中是否存在指针类型的参数,如果是,判断指针类型的参数所在的内存地址是否超出目标应用的内存地址范围。
如果否,虚拟机需要将虚拟机能操作的内存空间的偏移量转换为指针变量。
接着,虚拟机可以将指针变量拷贝到系统栈,以使电子设备上搭载的操作系统在与目标原生API的可执行代码地址上,按照系统栈中的指针变量,执行目标函数,得到目标函数的返回值。
最后,判断目标函数的返回值是否为指针变量,如果是,虚拟机将指针变量转换为虚拟机能操作的内存空间的偏移量后,拷贝到虚拟机栈。如果否,返回值不做处理,直接拷贝到虚拟机栈。
从上述方法中可以看出,虚拟机的内存空间中存储有由若干个原生API的信息组成的原生API注册表。在与目标应用的应用代码对应的WebAssembly字节码向虚拟机下载的过程中,判断目标应用调用的目标函数是否为原生API,如果是,将原生API注册表中的与目标函数对应的目标原生API的可执行代码地址写入到目标函数。然后,在目标应用调用目标原生API的过程中,将虚拟机栈中的目标原生API的参数的取值拷贝到系统栈,以使电子设备上搭载的操作系统在与目标原生API的可执行代码地址上,按照系统栈中的目标原生API的参数的取值,执行目标函数,得到目标函数的返回值。最后,将系统栈中的目标函数的返回值拷贝到虚拟机栈中,执行目标应用。从而,在虚拟机执行与目标应用的应用代码对应的WebAssembly字节码时,间接的对原生API进行调用。
与上述原生API调用的方法的实施例对应的,本说明书还提供了一种原生API调用的装置的实施例。
请参见图4,图4是一示例性的实施例示出的一种原生API调用的装置所在电子设备的结构图。在硬件层面,该设备包括处理器402、内部总线404、网络接口406、内存408以及非易失性存储器410,当然还可能包括其他所需要的硬件。本说明书一个或多个实施例可以基于软件方式来实现,比如由处理器402从非易失性存储器410中读取对应的计算机程序到内存408中然后运行。当然,除了软件实现方式之外,本说明书一个或多个实施例并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
请参见图5,图5是一示例性的实施例示出的一种原生API调用的装置的框图。该原生API调用的装置可以应用于如图5所示的电子设备中,以实现本说明书的技术方案。其中,所述原生API调用的装置可以包括:
判断模块500,用于在与目标应用的应用代码对应的WebAssembly字节码向虚拟机下载的过程中,判断所述目标应用调用的目标函数是否为原生API,如果是,将所述原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数;
拷贝模块502,用于在所述目标应用调用所述目标原生API的过程中,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈,以使所述电子设备上搭载的操作系统在与所述目标原生API的可执行代码地址上,按照所述系统栈中的所述目标原生API的参数的取值,执行所述目标函数,得到所述目标函数的返回值;
执行模块504,用于将所述系统栈中的所述目标函数的返回值拷贝到所述虚拟机栈中,执行所述目标应用。
可选的,所述电子设备包括:资源受限设备。
可选的,所述原生API的信息还包括:原生API标识,所述判断模块500,具体用于如果是,判断所述原生API注册表中是否存在与所述目标函数的API标识相同的原生API标识,如果是,判断所述原生API注册表中是否存在与所述目标函数的参数相同的原生API的参数。
可选的,所述判断模块500,具体用于按照预设的校验算法,对所述原生API注册表中的原生API标识进行运算,得到所述原生API注册表中的原生API标识的运算结果,按照预设的校验算法,对所述目标函数的原生API标识进行运算,得到所述目标函数的原生API标识的运算结果,判断所述原生API注册表中是否存在与所述目标函数的API标识的运算结果相同的原生API标识的运算结果。
可选的,所述判断模块500,具体用于按照预设的校验算法,对所述原生API注册表中的原生API的参数进行运算,得到所述原生API注册表中的原生API的参数的运算结果,按照预设的校验算法,对所述目标函数的参数进行运算,得到所述目标函数的参数的运算结果,判断所述原生API注册表中是否存在与所述目标函数的参数的运算结果相同的原生API的参数的运算结果。
可选的,所述虚拟机的内存空间包括:易失存储设备,所述判断模块500,具体用于根据获取到的目标应用所需的原生API 的信息,对存储在所述易失存储设备中的原生API注册表进行修改,得到修改后的原生API注册表,将所述修改后的原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数。
可选的,所述虚拟机的内存空间包括:非易失存储设备,所述非易失存储设备中存储有所述原生API注册表。
可选的,所述原生API注册表由通过预设的数据结构连接的若干个子表组成,所述原生API注册表的子表中设置有子表标识。
可选的,所述判断模块500,具体用于获取所述目标应用的内存地址范围,判断所述原生API的参数中是否存在指针类型的参数,如果是,判断所述指针类型的参数所在的内存地址是否超出所述目标应用的内存地址范围,如果是,向所述目标应用返回错误信息;如果否,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈。
可选的,所述拷贝模块502,具体用于根据所述目标原生API的参数的取值,计算所述目标原生API的参数在虚拟机栈的内存地址,根据所述目标原生API的参数在虚拟机栈的内存地址,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例只是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
在一个典型的配置中,计算机包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,并且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准,并提供有相应的操作入口,供用户选择授权或者拒绝。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。

Claims (13)

1.一种原生API调用的方法,所述方法应用于电子设备上搭载的用于运行应用的虚拟机,所述虚拟机的内存空间中存储有由若干个原生API的信息组成的原生API注册表,所述原生API的信息包括:可执行代码地址、参数,包括:
在与目标应用的应用代码对应的WebAssembly字节码向所述虚拟机下载的过程中,判断所述目标应用调用的目标函数是否为原生API,如果是,将所述原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数;
在所述目标应用调用所述目标原生API的过程中,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈,以使所述电子设备上搭载的操作系统在与所述目标原生API的可执行代码地址上,按照所述系统栈中的所述目标原生API的参数的取值,执行所述目标函数,得到所述目标函数的返回值;
将所述系统栈中的所述目标函数的返回值拷贝到所述虚拟机栈中,执行所述目标应用。
2.如权利要求1所述的方法,所述电子设备包括:资源受限设备。
3.如权利要求1所述的方法,所述原生API的信息还包括:原生API标识;
在如果是,将所述原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数之前,所述方法还包括:
如果是,判断所述原生API注册表中是否存在与所述目标函数的API标识相同的原生API标识;
如果是,判断所述原生API注册表中是否存在与所述目标函数的参数相同的原生API的参数。
4.如权利要求3所述的方法,在判断所述原生API注册表中是否存在与所述目标函数的API标识相同的原生API标识之前,所述方法还包括:
按照预设的校验算法,对所述原生API注册表中的原生API标识进行运算,得到所述原生API注册表中的原生API标识的运算结果;
判断所述原生API注册表中是否存在与所述目标函数的API标识相同的原生API标识,包括:
按照预设的校验算法,对所述目标函数的原生API标识进行运算,得到所述目标函数的原生API标识的运算结果;
判断所述原生API注册表中是否存在与所述目标函数的API标识的运算结果相同的原生API标识的运算结果。
5.如权利要求3所述的方法,在判断所述原生API注册表中是否存在与所述目标函数的参数相同的原生API的参数之前,所述方法还包括:
按照预设的校验算法,对所述原生API注册表中的原生API的参数进行运算,得到所述原生API注册表中的原生API的参数的运算结果;
判断所述原生API注册表中是否存在与所述目标函数的参数相同的原生API的参数,包括:
按照预设的校验算法,对所述目标函数的参数进行运算,得到所述目标函数的参数的运算结果;
判断所述原生API注册表中是否存在与所述目标函数的参数的运算结果相同的原生API的参数的运算结果。
6.如权利要求1所述的方法,所述虚拟机的内存空间包括:易失存储设备;
在判断所述目标应用调用的目标函数是否为原生API之前,所述方法还包括:
根据获取到的目标应用所需的原生API 的信息,对存储在所述易失存储设备中的原生API注册表进行修改,得到修改后的原生API注册表;
将所述原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数,包括:
将所述修改后的原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数。
7.如权利要求1所述的方法,所述虚拟机的内存空间包括:非易失存储设备,所述非易失存储设备中存储有所述原生API注册表。
8.如权利要求1所述的方法,所述原生API注册表由通过预设的数据结构连接的若干个子表组成,所述原生API注册表的子表中设置有子表标识。
9.如权利要求1所述的方法,在将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈之前,所述方法还包括:
获取所述目标应用的内存地址范围;
判断所述原生API的参数中是否存在指针类型的参数,如果是,判断所述指针类型的参数所在的内存地址是否超出所述目标应用的内存地址范围;
如果是,向所述目标应用返回错误信息;如果否,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈。
10.如权利要求1所述的方法,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈,包括:
根据所述目标原生API的参数的取值,计算所述目标原生API的参数在虚拟机栈的内存地址;
根据所述目标原生API的参数在虚拟机栈的内存地址,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈。
11.一种原生API调用的装置,所述装置应用于电子设备上搭载的用于运行应用的虚拟机,所述虚拟机的内存空间中存储有由若干个原生API的信息组成的原生API注册表,所述原生API的信息包括:可执行代码地址、参数,包括:
判断模块,用于在与目标应用的应用代码对应的WebAssembly字节码向所述虚拟机下载的过程中,判断所述目标应用调用的目标函数是否为原生API,如果是,将所述原生API注册表中的与所述目标函数对应的目标原生API的可执行代码地址写入到所述目标函数;
拷贝模块,用于在所述目标应用调用所述目标原生API的过程中,将虚拟机栈中的所述目标原生API的参数的取值拷贝到系统栈,以使所述电子设备上搭载的操作系统在与所述目标原生API的可执行代码地址上,按照所述系统栈中的所述目标原生API的参数的取值,执行所述目标函数,得到所述目标函数的返回值;
执行模块,用于将所述系统栈中的所述目标函数的返回值拷贝到所述虚拟机栈中,执行所述目标应用。
12.一种电子设备,包括通信接口、处理器、存储器和总线,所述通信接口、所述处理器和所述存储器之间通过总线相互连接;
所述存储器中存储机器可读指令,所述处理器通过调用所述机器可读指令,执行权利要求1至10任一项所述的方法。
13.一种机器可读存储介质,所述机器可读存储介质存储有机器可读指令,所述机器可读指令在被处理器调用和执行时,实现权利要求1至10任一项所述的方法。
CN202310974697.1A 2023-08-03 2023-08-03 一种原生api调用的方法及装置 Active CN116700841B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310974697.1A CN116700841B (zh) 2023-08-03 2023-08-03 一种原生api调用的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310974697.1A CN116700841B (zh) 2023-08-03 2023-08-03 一种原生api调用的方法及装置

Publications (2)

Publication Number Publication Date
CN116700841A CN116700841A (zh) 2023-09-05
CN116700841B true CN116700841B (zh) 2023-09-26

Family

ID=87837809

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310974697.1A Active CN116700841B (zh) 2023-08-03 2023-08-03 一种原生api调用的方法及装置

Country Status (1)

Country Link
CN (1) CN116700841B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108563517A (zh) * 2018-03-30 2018-09-21 腾讯科技(深圳)有限公司 系统接口的调用方法及装置
CN112882732A (zh) * 2021-01-22 2021-06-01 支付宝(杭州)信息技术有限公司 一种软件开发工具包sdk中功能代码的更新方法和装置

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11683296B2 (en) * 2019-08-23 2023-06-20 Appbrilliance, Inc. Headless browser system with virtual API
US11341192B2 (en) * 2020-01-28 2022-05-24 Sap Se Cross platform collaborative document management system

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108563517A (zh) * 2018-03-30 2018-09-21 腾讯科技(深圳)有限公司 系统接口的调用方法及装置
CN112882732A (zh) * 2021-01-22 2021-06-01 支付宝(杭州)信息技术有限公司 一种软件开发工具包sdk中功能代码的更新方法和装置

Non-Patent Citations (5)

* Cited by examiner, † Cited by third party
Title
Borui Li 等.Bringing webassembly to resource-constrained iot devices for seamless device-cloud integration.《Proceedings of the 20th Annual International Conference on Mobile Systems, Applications and Services》.2022,第261–272页. *
Elliott Wen 等.Wasmachine: Bring the edge up to speed with a webassembly os.《2020 IEEE 13th International Conference on Cloud Computing》.2020,第353-360页. *
Wenzhao Zhang 等.A Low-code Development Framework for Cloud-native Edge Systems.《ACM Transactions on Internet Technology》.2023,第23卷第1–22页. *
李正 等.API使用的关键问题研究.《软件学报》.2018,第1716-1738页. *
韩兰胜 等.基于API函数及其参数相结合的恶意软件行为检测.《计算机应用研究》.2013,第30卷第3407-3410、3425页. *

Also Published As

Publication number Publication date
CN116700841A (zh) 2023-09-05

Similar Documents

Publication Publication Date Title
CN107025559B (zh) 一种业务处理方法及装置
CN116661910B (zh) 一种应用调用的方法及装置
US8818967B2 (en) Method for compressing identifiers
CN112308716B (zh) 区块链智能合约执行方法、装置、设备及计算机存储介质
CN111897623B (zh) 一种集群管理方法、装置、设备及存储介质
CN116680015B (zh) 函数调用方法、装置、电子设备及可读存储介质
CN112380401B (zh) 业务数据的核对方法和装置
CN101484876A (zh) 多任务虚拟机的堆组织
CN116680014B (zh) 数据处理方法和装置
CN116700629B (zh) 数据处理方法和装置
CN116700841B (zh) 一种原生api调用的方法及装置
CN109409037B (zh) 一种数据混淆规则的生成方法、装置及设备
CN110941443A (zh) 修改sdk中文件名的方法、装置及电子设备
CN115203746A (zh) 数据账户的访问授权方法及装置
EP4020297A1 (en) Method for managing a volatile memory and java card device
CN114416057A (zh) 项目代码打包方法、装置、终端设备及存储介质
CN117251234B (zh) 基于补丁的函数调用方法及装置
CN116755845B (zh) 数据处理方法和装置
CN116700840B (zh) 文件执行方法、装置、电子设备及可读存储介质
CN117785728A (zh) 数据处理方法和装置
CN116955209B (zh) WebAssembly虚拟机的测试方法和装置
CN114338580B (zh) 一种公众号项目开发方法、装置及存储介质
CN117033064A (zh) 一种代码异常处理的方法及装置
CN116382785B (zh) 用于数据处理的方法及装置、计算设备及存储介质
CN113448588B (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