CN117707652A - 数据编译、参数传递方法及装置 - Google Patents
数据编译、参数传递方法及装置 Download PDFInfo
- Publication number
- CN117707652A CN117707652A CN202311723575.1A CN202311723575A CN117707652A CN 117707652 A CN117707652 A CN 117707652A CN 202311723575 A CN202311723575 A CN 202311723575A CN 117707652 A CN117707652 A CN 117707652A
- Authority
- CN
- China
- Prior art keywords
- memory
- module
- address
- webassembly
- variable
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 89
- 230000015654 memory Effects 0.000 claims abstract description 485
- 230000008569 process Effects 0.000 claims abstract description 31
- 230000006870 function Effects 0.000 claims description 59
- 238000013507 mapping Methods 0.000 claims description 31
- 238000012546 transfer Methods 0.000 claims description 12
- 230000004044 response Effects 0.000 claims description 9
- 230000005540 biological transmission Effects 0.000 claims description 4
- 238000004458 analytical method Methods 0.000 description 9
- 238000010586 diagram Methods 0.000 description 9
- 238000002716 delivery method Methods 0.000 description 3
- 230000008676 import Effects 0.000 description 2
- 230000001343 mnemonic effect Effects 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- JEIPFZHSYJVQDO-UHFFFAOYSA-N iron(III) oxide Inorganic materials O=[Fe]O[Fe]=O JEIPFZHSYJVQDO-UHFFFAOYSA-N 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000003825 pressing Methods 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4482—Procedural
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45579—I/O management, e.g. providing access to device drivers or storage
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45583—Memory management, e.g. access or allocation
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy 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)
- Devices For Executing Special Programs (AREA)
Abstract
本说明书提供有数据编译、参数传递方法及装置。所述方法包括:资源受限设备的虚拟机响应于编译命令,将待编译的源代码编译为WebAssembly模块;在编译过程中,为所述WebAssembly模块分配空闲的内存地址,并在分配到的内存地址中记录所述WebAssembly模块的变量参数;以及,生成与所述内存地址唯一对应的内存地址编码。
Description
技术领域
本说明书实施例涉及计算机领域,尤其涉及一种数据编译、参数传递方法及装置。
背景技术
WebAssembly(也可以简称为wasm)是一种新型代码技术,其可以为诸如C、C++和Rust等高级编程语言提供一个高效的编译目标;且具有快速、高效、可移植的特点,可以在不同平台上以接近本地速度运行。
使用高级编程语言编写的应用程序代码,需要编译为WebAssembly字节码构成的实现若干功能的WebAssembly模块,然后进一步由虚拟机依次运行这些WebAssembly模块。WebAssembly模块是应用模块、库模块程序编译、加载和执行的基本单元。WebAssembly模块中包含有应用程序的函数、表、内存空间大小、全局变量、导入信息和导出信息等。
虚拟机运行时,可以根据当前运行的WebAssembly模块中定义的内存空间大小,为WebAssembly模块分配独立的线性内存(数据内存区)。每个WebAssembly模块可以有自己独立的线性内存,且每个WebAssembly应用模块只能访问自身的、或者模块的线性内存。
经过编译的WebAssembly模块中的变量被编译为从一个指定偏移开始,其数据存储空间连续分布的数据段。
WebAssembly模块之间进行函数调用时,被调用方的WebAssembly模块传递给调用方的WebAssembly模块的参数时,是基于自身线性内存的编译,这就导致调用方调用的函数无能正确访问传递过来的数据,从而产生错误的执行结果。
举例:模块A调用模块B的函数,传递了模块A的线性内存偏移(作为指针的取值)给模块B的函数,模块B的函数执行时,根据参数,和模块的全局数据内存区的访问规则,则从模块B的全局数据内存区获取数组或者结构体元素的值,这必然导致模块B的函数并没有访问到模块A传递过来的数据,产生错误的执行结果。
发明内容
本说明书实施例提供的一种数据编译、参数传递方法及装置。用以解决资源受限设备中WebAssembly模块之间进行函数调用时,由于线性内存偏移导致函数执行结果错误的问题。
根据本说明书实施例的第一方面,提供一种数据编译方法,应用于资源受限设备的虚拟机,所述方法包括:
资源受限设备的虚拟机响应于编译命令,将待编译的源代码编译为WebAssembly模块;
在编译过程中,为所述WebAssembly模块的变量参数分配内存地址,并在分配到的内存地址中记录所述WebAssembly模块的变量参数;以及,生成与所述内存地址唯一对应的内存地址编码。
可选的,所述变量参数包括可读写变量参数和只读变量参数;在编译过程中,还会生成所述WebAssembly模块的全局数据段信息;所述全局数据段信息包括所述WebAssembly模块中的可读写变量参数信息、只读变量参数信息和所述WebAssembly模块的变量参数结束地址信息;
其中,所述可读写变量参数信息包括可读写变量参数的内存块标识和内存基址;
所述只读变量参数信息包括只读变量参数的内存块标识和内存基址;
所述变量参数结束地址信息包括变量参数结束的内存块标识和内存地址。
可选的,所述为所述WebAssembly模块的变量参数分配内存地址,包括:
获取所述编译命令中配置的内存基址参数;其中,所述内存基址参数包括内存块标识和内存基址;
从所述内存基址参数指定的内存基址开始,为所述WebAssembly模块的变量参数顺序分配空闲的内存地址;
所述方法还包括:
响应于编译完成的WebAssembly模块下载到所述资源受限设备,为所述WebAssembly模块分配空闲的物理存储地址。
可选的,所述WebAssembly模块的变量参数包括只读变量参数、可读写变量参数和自定义类型变量参数;
所述为所述WebAssembly模块分配空闲的物理存储地址,包括:
针对所述WebAssembly模块中的只读变量参数,分配非易失性存储器中空闲的物理存储地址,并将所述只读变量参数存储到所述非易失性存储器;
针对所述WebAssembly模块中的可读写变量参数,分配易失性存储器中空闲的物理存储地址,并将所述可读写变量参数存储到所述易失性存储器;
确定与所述内存地址编码唯一对应的所述物理存储地址的映射。
可选的,所述确定与所述内存地址编码唯一对应的所述物理存储地址的映射,包括:
针对所述只读变量参数,将所述只读变量参数的内存地址编码的编码值减去只读变量参数的内存基址,再加上只读变量参数的物理存储空间起始地址,得到物理存储地址;
针对所述可读写变量参数,将所述可读写变量参数的内存地址编码的编码值减去可读写变量参数的内存基址,再加上可读写变量参数的物理存储空间起始地址,得到物理地址;
其中,所述只读参数变量的物理存储空间起始地址,或者可读写变量参数的物理存储空间起始地址,都由内存块标识映射得到。
可选的,所述内存地址编码的大小包括4个字节;
其中,所述4个字节中的低2字节用于记录对内存地址进行编码得到的编码值,所述4个字节中的高2字节若干比特用于记录内存块标识。
根据本说明书实施例的第二方面,提供一种参数传递方法,应用于资源受限设备的虚拟机执行WebAssembly模块之间的函数调用,所述WebAssembly模块通过前述数据编译方法完成编译;所述方法包括:
响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,获取第二WebAssembly模块编译过程中生成的内存地址编码;
将所述内存地址编码传递给所述第一WebAssembly模块,以使所述第一WebAssembly模块解析所述内存地址编码对应的物理存储地址,并访问所述物理存储地址记录的所述第二WebAssembly模块的变量参数,以及将所述变量参数带入所述目标函数后执行。
可选的,所述解析所述内存地址编码对应的物理存储地址,包括:
解析所述内存地址编码的编码值;
获取所述第二WebAssembly模块的全局数据段信息;所述全局数据段信息包括所述第二WebAssembly模块中的只读变量参数的内存基址、所述第二WebAssembly模块中的可读写变量参数的内存基址;
如果所述编码值大于等于所述只读变量参数的内存基址,且小于所述可读写变量参数的内存基址,则将所述编码值减去所述只读变量参数的内存基址,再加上所述只读变量参数的物理存储空间起始地址,得到所述内存地址编码对应的非易失性存储器的物理存储地址;
如果所述编码值大于等于所述可读写变量参数的内存基址,且小于自定义参数变量的内存基址,则将所述编码值减去所述可读写变量参数的内存基址,再加上所述第二WebAssembly模块在内存的物理起始地址,得到所述内存地址编码对应的易失性存储器的物理存储地址。
可选的,所述内存地址编码的大小包括4个字节;
其中,所述4个字节中的低2字节用于记录对内存地址进行编码得到的编码值,所述4个字节中的高2字节若干比特用于记录内存块标识;
所述解析所述内存地址编码的编码值,包括:
解析所述内存地址编码的低2字节的编码值。
可选的,所述获取所述第二WebAssembly模块的全局数据段信息,包括:
解析所述内存地址编码中的高2字节,确定内存块标识;
如果所述第二WebAssembly模块的模块标识为预设定值,确定所述第二WebAssembly模块为应用模块,获取所述第二WebAssembly模块的全局数据段信息;其中,所述应用模块包括从源代码中的应用相关代码编译得到的WebAssembly模块;
如果所述第二WebAssembly模块的模块标识为非预设定值,确定所述第二WebAssembly模块为库模块,根据映射表查找与所述内存块标识对应的目标模块,获取所述目标模块的全局数据段信息;其中,所述库模块包括从源代码中的库相关代码编译得到的WebAssembly模块。
可选的,所述映射表包括内存块标识、模块标识,所述映射表在WebAssembly模型下载到资源受限设备的过程中建立,或者在代码执行应用流程时建立;
所述模块标识为所述资源受限设备中所有的WebAssembly模块对应的编码,所述模块标识按照WebAssembly模块下载到资源受限设备的顺序递增编码。
根据本说明书实施例的第三方面,提供一种参数传递方法,所述方法包括:
为所有WebAssembly模块提供共享内存空间,所述共享内存空间的内存块标识为0,共享内存基址取值小于所有WebAssembly模块的内存基址取值或者大于所有WebAssembly模块的内存最大取值;如果共享内存基址取值小于所有WebAssembly模块的内存基址取值,所述内存空间大小为所述WebAssembly模块的内存基址取值的最小值减去共享内存空间基址;
响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,将第二WebAssembly模块的变量参数拷贝到共享内存中,并将该共享内存的起始地址编码作为参数传递给第一WebAssembly模块;
所述第一WebAssembly模块在接收到参数后,解析起始地址编码,并在内存地址值小于所有WebAssembly模块的内存基址时,则从解析得到的共享内存的物理地址中获取记录的所述第二WebAssembly模块的参数变量,以及将所述变量参数带入所述目标函数后执行。
可选的,所述解析起始地址编码,包括:
通过调用操作系统提供的API解析起始地址编码对应的共享地址的物理地址;
或者,通过所述起始地址编码的指针,确定指针指向的共享内存的物理地址。
根据本说明书实施例的第四方面,提供一种数据编译装置,应用于资源受限设备的虚拟机,所述装置包括:
编译单元,资源受限设备的虚拟机响应于编译命令,将待编译的源代码编译为WebAssembly模块;
在所述编译单元执行编译过程中,为所述WebAssembly模块的变量参数分配内存地址,并在分配到的内存地址中记录所述WebAssembly模块的变量参数;以及,生成与所述内存地址唯一对应的内存地址编码。
根据本说明书实施例的第五方面,提供一种参数传递装置,应用于资源受限设备的虚拟机执行WebAssembly模块之间的函数调用,所述WebAssembly模块通过前述数据编译方法完成编译,所述装置包括:
获取单元,响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,获取第二WebAssembly模块编译过程中生成的内存地址编码;
传递单元,将所述内存地址编码传递给所述第一WebAssembly模块,以使所述第一WebAssembly模块解析所述内存地址编码对应的物理存储地址,并访问所述物理存储地址记录的所述第二WebAssembly模块的变量参数,以及将所述变量参数带入所述目标函数后执行。
根据本说明书实施例的第六方面,提供一种参数传递装置,
共享单元,为所有WebAssembly模块提供共享内存空间,所述共享内存空间的内存块标识为0,共享内存基址取值小于所有WebAssembly模块的内存基址取值或者大于所有WebAssembly模块的内存最大取值;如果共享内存基址取值小于所有WebAssembly模块的内存基址取值,所述内存空间大小为所述WebAssembly模块的内存基址取值的最小值减去共享内存空间基址;
调用单元,响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,将第二WebAssembly模块的变量参数拷贝到共享内存中,并将该共享内存的起始地址编码作为参数传递给第一WebAssembly模块;
传递单元,所述第一WebAssembly模块在接收到参数后,解析起始地址编码,并在内存地址值小于所有WebAssembly模块的内存基址或者大于所有WebAssembly模块的内存最大取值时,则从解析得到的共享内存的物理地址中获取记录的所述第二WebAssembly模块的参数变量,以及将所述变量参数带入所述目标函数后执行。
根据本说明书实施例的第七方面,提供一种电子设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为上述任一项方法。
本说明书实施例,提供了一种应用于资源受限设备的虚拟机的数据编译和参数传递方案。在编译过程中,对存储WebAssembly模块的变量参数的内存地址进行编码,得到与内存地址唯一对应的内存地址编码;进一步在参数传递时,通过解析内存地址编码来还原正确的内存地址,从而可以确保参数变量的正确传递。
附图说明
图1是本说明书一实施例提供的数据编译方法的流程图;
图2是本说明书一实施例提供的参数传递方法的流程图;
图3是本说明书一实施例提供的基于共享内存的参数传递方法的流程图;
图4是本说明书一实施例提供的数据编译装置和参数传递装置的硬件结构图;
图5是本说明书一实施例提供的数据编译装置的模块;
图6是本说明书一实施例提供的参数传递装置的模块;
图7是本说明书一实施例提供的基于共享内存的参数传递装置的模块。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书的一些方面相一致的装置和方法的例子。
在本说明书使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书。在本说明书和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
本发明旨在提供一种资源受限设备中WebAssembly模块编译时,线性内存数据编译方法,以及虚拟机运行时跨模块间函数调用、参数传递的方法。
以下请参考图1所示的数据编译方法流程示意图,该方法可以应用于资源受限设备的虚拟机,该方法可以包括以下步骤:
步骤110,资源受限设备的虚拟机响应于编译命令,将待编译的源代码编译为WebAssembly模块;
步骤120,在编译过程中,为所述WebAssembly模块的变量参数分配内存地址,并在分配到的内存地址中记录所述WebAssembly模块的变量参数;以及,生成与所述内存地址唯一对应的内存地址编码。
本说明书中,分配的内存地址可以是从编译命令中配置的内存基址参数作为基址开始选择的。一般的,基址不能为0,因为0值如果赋值给指针,语法上就会存在错误。
示例性的,为所述WebAssembly模块的变量参数分配的内存地址,可以包括:
获取所述编译命令中配置的内存基址参数;其中,所述内存基址参数包括内存块标识和内存基址;
从所述内存基址参数指定的内存基址开始,为所述WebAssembly模块的变量参数顺序分配空闲的内存地址。
进一步的,在下载WebAssembly模块到资源受限设备上的情况下,响应于编译完成的WebAssembly模块下载到所述资源受限设备,为所述WebAssembly模块分配空闲的物理存储地址。
本说明书中,基于编译命令的内存基址参数((内存块标识<<16)|内存基址)来从该内存基址开始分配空闲的内存地址,并建立内存地址与内存块标识之间的映射关系。
示例性的,任一WebAssembly模块的变量参数对应的物理存储地址可以使用4个字节的内存地址编码表示。
其中,所述4个字节中的低2字节可以用于记录对存储变量参数的内存地址进行编码得到的编码值。
而所述4个字节中的高2字节可以用于记录内存块标识。由于2字节最大可以为16比特(bit),因此高2字节共可标识最少65535个WebAssembly模块的内存块。
示例性的,根据WebAssembly模块的不同类型可以设置对应的模块标识。例如,与应用模块对应的模块标识和与库模块对应的模块标识;
其中,所述应用模块包括从源代码中的应用相关代码编译得到的WebAssembly模块,所述库模块包括从源代码中的库相关代码编译得到的WebAssembly模块;
不同应用模块的内存块标识具有相同的预设定值(如0,或其它固定值),不同库模块的内存块标识为按照库模块的顺序递增或者按照库模块功能的类别编码的整数。
示例性的,库模块的内存块标识编码从N比特最大的整数取值开始,顺序分配。例如,如果一个平台可支持的最多模块个数为64,则库模块的内存块编码占用低5比特,从63开始,顺序递减分配给编译的模块,库模块A内存块标识为63,库模块2内存块标识为62;当然,也可以从1开始,顺序递增分配内存块标识。
需要说明的是,如果两个库模块不会被任何其他模块同时导入,则这两个库模块可以使用相同的内存块标识。此外,如果一个库模块在下载到资源受限设备后,被该资源受限设备升级,则升级后该库模块也可以使用与原库模块相同的内存块标识。
本说明书中,在编译过程中,还会生成所述WebAssembly模块的全局数据段信息;所述全局数据段信息包括所述WebAssembly模块中的只读变量参数信息(rodata_base)、所述WebAssembly模块中的可读写变量参数信息(rwdata_base)、和所述WebAssembly模块的变量参数结束地址信息(data_end);
其中,所述可读写变量参数信息包括可读写变量参数的内存块标识和内存基址;
所述只读变量参数信息包括只读变量参数的内存块标识和内存基址;
所述变量参数结束地址信息包括变量参数结束的内存块标识和内存地址。
示例性的,所述WebAssembly模块的变量参数除了只读变量参数、可读写变量参数之外,还可以包括自定义类型变量参数(xxdata_base)。
上述为所述WebAssembly模块分配空闲的物理存储地址,可以包括:
针对所述WebAssembly模块中的只读变量参数,分配非易失性存储器中空闲的物理存储地址,并将所述只读变量参数存储到所述非易失性存储器;
针对所述WebAssembly模块中的可读写变量参数,分配易失性存储器中空闲的物理存储地址,并将所述可读写变量参数存储到所述易失性存储器;
确定与所述内存地址编码唯一对应的所述物理存储地址的映射。
示例性的,上述确定与所述内存地址编码唯一对应的所述物理存储地址的映射,可以包括:
设备执行WebAssembly字节码,针对所述只读变量参数的解析,将所述只读变量参数的内存地址编码的编码值减去只读变量参数的内存基址,再加上只读变量参数的物理存储空间起始地址,从而得到物理存储地址。这一过程可以参考如下公式1所示:
s= x - rodata_base + rodata_startAddr 公式1
其中,x表示编码值,s表示物理存储地址,rodata_base表示只读变量参数的内存基址,rodata_startAddr表示只读变量参数的物理存储空间起始地址。
设备执行WebAssembly字节码,针对所述可读写变量参数的解析,将所述可读写变量参数的内存地址编码的编码值减去可读写变量参数的内存基址,再加上可读写变量参数的物理存储空间起始地址,得到物理地址。这一过程可以参考如下公式2所示:
s= x - rwdata_base + y 公式2
其中,x表示编码值,s表示物理存储地址,y表示WebAssembly模块在内存的物理起始地址,rwdata_base表示可读写变量参数的内存基址。
在完成解析之后,WebAssembly模块被其它模块调用时就可以基于内存地址编码来实现变量参数的正确传递。
所述只读参数变量的物理存储空间起始地址,或者可读写变量参数的物理存储空间起始地址,都由内存块标识映射得到。
以下请参考图2所示的参数传递方法流程示意图,该方法可以应用于资源受限设备的虚拟机执行WebAssembly模块之间的函数调用,所述WebAssembly模块通过前述数据编译方法完成编译,该方法可以包括以下步骤:
步骤210,响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,获取第二WebAssembly模块编译过程中生成的内存地址编码;
步骤220,将所述内存地址编码传递给所述第一WebAssembly模块,以使所述第一WebAssembly模块解析所述内存地址编码对应的物理存储地址,并访问所述物理存储地址记录的所述第二WebAssembly模块的变量参数,以及将所述变量参数带入所述目标函数后执行。
通过上述实施例,当第二WebAssembly模块跨模块地调用第一WebAssembly模块的目标函数时,需要将第二WebAssembly模块的变量参数(如全局数组、指针或者结构体等)传递给第一WebAssembly模块。
本说明书为了避免由于内存偏移导致参数传递错误,不再直接基于内存传递参数,而是将调用方即第二WebAssembly模块在编译过程中生成的内存地址编码传递给被调用方即第一WebAssembly模块;由第一WebAssembly模块通过解析传递过来的内存地址编码访问到正确的物理存储地址,进而从正确的物流存储地址获取到正确的变量参数,从而执行目标函数。
示例性的,上述所述解析所述内存地址编码对应的物理存储地址,可以包括:
解析所述内存地址编码的编码值;
获取所述第二WebAssembly模块的全局数据段信息;所述全局数据段信息包括所述第二WebAssembly模块中的只读变量参数的内存基址、所述第二WebAssembly模块中的可读写变量参数的内存基址;
如果x∈[rodata_base,rwdata_base),即所述编码值大于等于所述只读变量参数的内存基址,且小于所述可读写变量参数的内存基址,则计算s=x-rodata_base
+rodata_startAddr,即将所述编码值减去所述只读变量参数的内存基址,再加上所述只读变量参数的物理存储空间起始地址,得到所述内存地址编码对应的非易失性存储器的物理存储地址。
如果x∈[rwdata_base,xxdata_base),即所述编码值大于等于所述可读写变量参数的内存基址,且小于自定义参数变量的内存基址,则计算s=((x-rwdata_base)+y),即将所述编码值减去所述可读写变量参数的内存基址,再加上所述第二WebAssembly模块在内存的物理起始地址,得到所述内存地址编码对应的易失性存储器的物理存储地址。
其中,所述第二WebAssembly模块在内存的物理起始地址(即y),可以根据映射表获取。
在资源受限设备中,为导入WebAssembly模块的模块标识、导入WebAssembly模块的内存块标识建立映射表,即映射表可以包括内存块标识、模块标识。其中,所述模块标识为所述资源受限设备中所有的WebAssembly模块对应的编码,所述模块标识按照WebAssembly模块下载到资源受限设备的顺序递增编码。
该映射表可以在WebAssembly模型下载到资源受限设备的过程中建立,或者在代码执行应用流程时建立。例如,在虚拟机启动,执行该WebAssembly模块的入口函数前,生成内存块标识到模块标识的映射表。
映射表举例:
内存块标识0(1字节)+所在模块标识X(1字节);
……;
内存块标识N(1字节)+所在模块标识Y(1字节)。
为节省存储空间,可按照偏移顺序存储模块标识,而偏移索引即为内存块标识。
虚拟机执行入口函数时,根据选择的应用模块中导入的其他模块,为导入的所有其他模块、与当前选择应用的应用模块一起,分配合适大小的内存(易失性存储空间)。每个导入模块所需要的内存空间大小为该模块的全局数据段信息中rwdata的大小;而rodata在模块下载过程中,被存储到非易失性存储器中。
虚拟机执行入口函数时,建立所有被分配了内存空间的WebAssembly模块的模块标识与其所分配的内存块标识的映射;
内存访问WebAssembly字节码时,根据字节码load/store字节码,执行时从栈上获取基址addr偏移,与memarg.offset相加获取实际的内存地址。
如前所述,所述内存地址编码的大小包括4个字节;
其中,所述4个字节中的低2字节用于记录对内存地址进行编码得到的编码值,所述4个字节中的高2字节若干比特用于记录内存块标识;
相应地,前述解析所述内存地址编码的编码值,包括:
解析所述内存地址编码的低2字节的编码值。
示例性的,前述获取所述第二WebAssembly模块的全局数据段信息,可以包括:
解析所述内存地址编码中的高2字节,确定内存块标识;
如果所述第二WebAssembly模块的模块标识为预设定值,确定所述第二WebAssembly模块为应用模块,获取所述第二WebAssembly模块的全局数据段信息;其中,所述应用模块包括从源代码中的应用相关代码编译得到的WebAssembly模块;
如果所述第二WebAssembly模块的模块标识为非预设定值,确定所述第二WebAssembly模块为库模块,根据映射表查找与所述内存块标识对应的目标模块,获取所述目标模块的全局数据段信息;其中,所述库模块包括从源代码中的库相关代码编译得到的WebAssembly模块。
在获取到全局数据段信息之后,对比全局数据段信息中记录的只读变量参数的内存基址和可读写变量参数的内存基址,确定存储变量参数的存储器类型,进而解析得到存储器类型的物理存储地址。
即前述实施例中,如果x∈[rodata_base,rwdata_base),说明变量参数存储在非易失性存储器中,物理存储地址s=x-rodata_base+rodata_startAddr。
而如果x∈[rwdata_base,xxdata_base),说明变量参数存储在易失性存储器中,物理存储地址s=((x-rwdata_base)+y)。
在解析得到物理存储地址之后,虚拟机就可以控制第一WebAssembly模块访问所述物理存储地址中记录的所述第二WebAssembly模块的变量参数,并进一步将所述变量参数带入所述目标函数后执行。
综合上述实施例,在编译过程中,对存储WebAssembly模块的变量参数的内存地址进行编码,得到与内存地址唯一对应的内存地址编码;进一步在参数传递时,通过解析内存地址编码来还原正确的内存地址,从而可以确保参数变量的正确传递。
本说明书还提供了一种确保参数变量正确传递的方法实施例,如图3所示,可以包括:
步骤310,为所有WebAssembly模块提供共享内存空间,所述共享内存空间的内存块标识为0,共享内存基址取值小于所有WebAssembly模块的内存基址取值或者大于所有WebAssembly模块的内存最大取值;如果共享内存基址取值小于所有WebAssembly模块的内存基址取值,所述内存空间大小为所述WebAssembly模块的内存基址取值的最小值减去共享内存空间基址;
步骤320,响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,将第二WebAssembly模块的变量参数拷贝到共享内存中,并将该共享内存的起始地址编码作为参数传递给第一WebAssembly模块;
步骤330,所述第一WebAssembly模块在接收到参数后,解析起始地址编码,并在内存地址值小于所有WebAssembly模块的内存基址或者大于所有WebAssembly模块的内存最大取值时,则从解析得到的共享内存的物理地址中获取记录的所述第二WebAssembly模块的参数变量,以及将所述变量参数带入所述目标函数后执行。
该实施例可以为所有WebAssembly模块提供共享内存空间,
所述共享内存空间的内存块标识为0,共享内存基址取值应小于所有WebAssembly模块的内存基址取值;所述内存空间大小=(所有WebAssembly模块的内存基址取值中的最小值–共享内存空间基址)。例如,共享内存基址为1,所有其他WebAssembly模块的内存基址都为1024,则共享内存大小1023(比特)。
在设置了共享内存空间之后,如果第二WebAssembly模块调用第一WebAssembly模块中的目标函数,则可以将第二WebAssembly模块的变量参数拷贝到共享内存中,并将该共享内存的起始地址编码作为参数传递给第一WebAssembly模块。
所述第一WebAssembly模块在接收到参数后,解析起始地址编码,并在内存地址值小于所有WebAssembly模块的内存基址时,则从解析得到的共享内存的物理地址中获取记录的所述第二WebAssembly模块的参数变量,以及将所述变量参数带入所述目标函数后执行。
当第一WebAssembly模块得到传递过来的参数(即共享内存的起始地址编码),解析该起始地址编码,判断内存地址值是否小于所有WebAssembly模块的内存基址;
如果在内存地址值小于所有WebAssembly模块的内存基址时,访问解析得到的共享内存的物理地址,以获取记录的所述第二WebAssembly模块的参数变量,并进一步将所述变量参数带入所述目标函数后执行。
示例性的,上述解析起始地址编码,可以包括:
通过调用操作系统提供的API解析起始地址编码对应的共享地址的物理地址;或者,通过所述起始地址编码的指针,确定指针指向的共享内存的物理地址。
通过设置共享内存可以确保参数的正确传递,且减少了复杂解析定位的过程。
下面结合一个示例性的应用编程加以说明:
#define SHARE_MEMORY_START 1
u8*shareMemPtr=(u8*)(SHARE_MEMORY_START);
u32 memRef=getCurrentAppRoot();
memread(memRef,shareMemPtr,0x04);
或者编程如下:
u8*shareMemPtr=(u8*)getShareMemStart();
u32 memRef=getCurrentAppRoot();
memread(memRef,shareMemPtr,0x04);
1)内存指令:
i32.load;
内存加载,从内存中读4字节并压栈。
2)格式:
i32.load;
memarg.offset。
3)助记符|操作码:
i32.load=0x28。
4)栈:
…addr->…value。
5)描述:
执行时从栈上获取addr,与memarg.offset相加获取实际内存地址。在内存中读取4字节数据value压到栈顶。
6)运行时异常:
如果内存地址超过内存有效范围,抛OUT_OF_MEMORY_EXCEPTION异常。
i32.store;
存储指令,向内存中“存储”4字节数。
7)格式:
i32.store;
memarg.offset。
8)助记符|操作码:
i32.store=0x36。
9)栈:
…addr,value->…。
10)描述:
执行时从栈上获取i32类型value和addr,addr与memarg.offset相加获取实际内存地址,将value存入到内存中。
11)运行时异常:
如果内存地址超过内存有效范围,抛OUT_OF_MEMORY_EXCEPTION异常。
12)全局变量内存:
全局变量内存为运行模块存放模块全局数据。
13)辅助栈:
辅助栈为当前运行函数的局部结构类型数据数据区,用于存放函数的局部数组的元素、结构体的元素。
辅助栈空间为逻辑通道共享。每个逻辑通道上被选择的应用,使用同一个辅助栈空间。
14)虚拟机栈:
虚拟机采用了基于栈结构。
虚拟机栈是用来储存帧的,它保存参数、局部变量、中间运行结果以及返回值和调用方法等。
虚拟机的函数调用会创建一个帧结构并压入栈帧。函数返回时,从调用栈弹出对应栈帧并销毁。函数调用,就是创建和销毁栈帧的过程。但在任一时刻,只有位于调用栈顶的栈帧是活跃的,也就是所谓的当前栈帧。
15)虚拟机错误:
虚拟机运行过程会出现错误、资源限制,一旦出现这类错误,虚拟机就不能继续正常运行。虚拟机运行过程中,可以报告并处理虚拟机错误,虚拟机错误不能由应用代码抛出和处理。
虚拟机错误产生后,运行环境并不能恢复为正常,继续执行会导致违反安全、虚拟机或者系统软件的正常操作,虚拟机应停止执行字节码,具体响应信息与实现相关,本规范不做强制要求。
16)虚拟机抛出异常:
虚拟机抛出异常,虚拟机并不能定义抛出的所有违反安全的异常集合。
如果被访问数据所属的安全环境与当前执行字节码指令所在的安全环境不一致,虚拟机必须抛出安全异常。
如果字节码指令超出了虚拟机规范定义的限制说明,虚拟机也可以抛出其他异常。
17)应用抛出异常:
应用如果在运行的过程中,如果检查到数据、变量或者执行流程与预期不符合,也可以自己编程抛出异常。
与前述数据编译、参数传递方法实施例相对应,本说明书还提供了数据编译、参数传递装置的实施例。所述装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将非易失性存储器中对应的计算机程序读取到内存中运行形成的。从硬件层面而言,如图4所示,为本说明书中数据编译装置、参数传递装置所在设备的一种硬件结构图,除了图4所示的处理器、网络接口、内存以及非易失性存储器之外,实施例中装置所在的设备通常根据通信实际功能,还可以包括其他硬件,对此不再赘述。
请参见图5,为本说明书一实施例提供的数据编译装置的模块图,所述装置对应了图1所示实施例,应用于资源受限设备,所述装置包括:
编译单元510,资源受限设备的虚拟机响应于编译命令,将待编译的源代码编译为WebAssembly模块;
在所述编译单元510执行编译过程中,为所述WebAssembly模块的变量参数分配内存地址,并在分配到的内存地址中记录所述WebAssembly模块的变量参数;以及,生成与所述内存地址唯一对应的内存地址编码。
可选的,所述变量参数包括可读写变量参数和只读变量参数;在所述编译单元510执行编译过程中,还会生成所述WebAssembly模块的全局数据段信息;所述全局数据段信息包括所述WebAssembly模块中的可读写变量参数信息、只读变量参数信息和所述WebAssembly模块的变量参数结束地址信息;
其中,所述可读写变量参数信息包括可读写变量参数的内存块标识和内存基址;
所述只读变量参数信息包括只读变量参数的内存块标识和内存基址;
所述变量参数结束地址信息包括变量参数结束的内存块标识和内存地址。
可选的,所述为所述WebAssembly模块的变量参数分配内存地址,包括:
获取所述编译命令中配置的内存基址参数;其中,所述内存基址参数包括内存块标识和内存基址;
从所述内存基址参数指定的内存基址开始,为所述WebAssembly模块的变量参数顺序分配空闲的内存地址;
所述装置还包括:
分配单元,响应于编译完成的WebAssembly模块下载到所述资源受限设备,为所述WebAssembly模块分配空闲的物理存储地址。
可选的,所述WebAssembly模块的变量参数包括只读变量参数、可读写变量参数和自定义类型变量参数;
所述分配单元在为所述WebAssembly模块分配空闲的物理存储地址,进一步包括:
第一分配子单元,针对所述WebAssembly模块中的只读变量参数,分配非易失性存储器中空闲的物理存储地址,并将所述只读变量参数存储到所述非易失性存储器;
第二分配子单元,针对所述WebAssembly模块中的可读写变量参数,分配易失性存储器中空闲的物理存储地址,并将所述可读写变量参数存储到所述易失性存储器;
映射确定子单元,确定与所述内存地址编码唯一对应的所述物理存储地址的映射。
可选的,所述映射确定子单元,进一步包括:
第一映射子单元,针对所述只读变量参数,将所述只读变量参数的内存地址编码的编码值减去只读变量参数的内存基址,再加上只读变量参数的物理存储空间起始地址,得到物理存储地址;
第二映射子单元,针对所述可读写变量参数,将所述可读写变量参数的内存地址编码的编码值减去可读写变量参数的内存基址,再加上可读写变量参数的物理存储空间起始地址,得到物理地址;
其中,所述只读参数变量的物理存储空间起始地址,或者可读写变量参数的物理存储空间起始地址,都由内存块标识映射得到。
可选的,所述内存地址编码的大小包括4个字节;
其中,所述4个字节中的低2字节用于记录对内存地址进行编码得到的编码值,所述4个字节中的高2字节若干比特用于记录内存块标识。
请参见图6,为本说明书一实施例提供的参数传递装置的模块图,所述装置对应了图2所示实施例,应用于资源受限设备的虚拟机执行WebAssembly模块之间的函数调用,所述WebAssembly模块通过前述数据编译方法完成编译,所述装置包括:
获取单元610,响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,获取第二WebAssembly模块编译过程中生成的内存地址编码;
传递单元620,将所述内存地址编码传递给所述第一WebAssembly模块,以使所述第一WebAssembly模块解析所述内存地址编码对应的物理存储地址,并访问所述物理存储地址记录的所述第二WebAssembly模块的变量参数,以及将所述变量参数带入所述目标函数后执行。
可选的,所述传递单元620在解析所述内存地址编码对应的物理存储地址,进一步包括:
解析子单元,解析所述内存地址编码的编码值;
获取子单元,获取所述第二WebAssembly模块的全局数据段信息;所述全局数据段信息包括所述第二WebAssembly模块中的只读变量参数的内存基址、所述第二WebAssembly模块中的可读写变量参数的内存基址;
地址转换子单元,如果所述编码值大于等于所述只读变量参数的内存基址,且小于所述可读写变量参数的内存基址,则将所述编码值减去所述只读变量参数的内存基址,再加上所述只读变量参数的物理存储空间起始地址,得到所述内存地址编码对应的非易失性存储器的物理存储地址;如果所述编码值大于等于所述可读写变量参数的内存基址,且小于自定义参数变量的内存基址,则将所述编码值减去所述可读写变量参数的内存基址,再加上所述第二WebAssembly模块在内存的物理起始地址,得到所述内存地址编码对应的易失性存储器的物理存储地址。
可选的,所述内存地址编码的大小包括4个字节;
其中,所述4个字节中的低2字节用于记录对内存地址进行编码得到的编码值,所述4个字节中的高2字节若干比特用于记录内存块标识;
所述解析子单元,进一步包括解析所述内存地址编码的低2字节的编码值。
可选的,所述获取子单元,进一步包括:
解析所述内存地址编码中的高2字节,确定内存块标识;
如果所述第二WebAssembly模块的模块标识为预设定值,确定所述第二WebAssembly模块为应用模块,获取所述第二WebAssembly模块的全局数据段信息;其中,所述应用模块包括从源代码中的应用相关代码编译得到的WebAssembly模块;
如果所述第二WebAssembly模块的模块标识为非预设定值,确定所述第二WebAssembly模块为库模块,根据映射表查找与所述内存块标识对应的目标模块,获取所述目标模块的全局数据段信息;其中,所述库模块包括从源代码中的库相关代码编译得到的WebAssembly模块。
可选的,所述映射表包括内存块标识、模块标识,所述映射表在WebAssembly模型下载到资源受限设备的过程中建立,或者在代码执行应用流程时建立;
所述模块标识为所述资源受限设备中所有的WebAssembly模块对应的编码,所述模块标识按照WebAssembly模块下载到资源受限设备的顺序递增编码。
请参见图7,为本说明书一实施例提供的基于共享内存的参数传递装置的模块图,所述装置对应了图3所示实施例,所述装置包括:
共享单元710,为所有WebAssembly模块提供共享内存空间,所述共享内存空间的内存块标识为0,共享内存基址取值小于所有WebAssembly模块的内存基址取值或者大于所有WebAssembly模块的内存最大取值,如果共享内存基址取值小于所有WebAssembly模块的内存基址取值;所述内存空间大小为所述WebAssembly模块的内存基址取值的最小值减去共享内存空间基址;
调用单元720,响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,将第二WebAssembly模块的变量参数拷贝到共享内存中,并将该共享内存的起始地址编码作为参数传递给第一WebAssembly模块;
传递单元730,所述第一WebAssembly模块在接收到参数后,解析起始地址编码,并在内存地址值小于所有WebAssembly模块的内存基址或者大于所有WebAssembly模块的内存最大取值时,则从解析得到的共享内存的物理地址中获取记录的所述第二WebAssembly模块的参数变量,以及将所述变量参数带入所述目标函数后执行。
可选的,所述解析起始地址编码,包括:
通过调用操作系统提供的API解析起始地址编码对应的共享地址的物理地址;
或者,通过所述起始地址编码的指针,确定指针指向的共享内存的物理地址。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上图5-图7描述了数据编译、参数传递装置的内部功能模块和结构示意,其实质上的执行主体可以为一种电子设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行上述任一数据编译、参数传递方法的实施例。
在上述电子设备的实施例中,应理解,该处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application SpecificIntegrated Circuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,而前述的存储器可以是只读存储器(英文:read-only memory,缩写:ROM)、随机存取存储器(英文:random access memory,简称:RAM)、快闪存储器、硬盘或者固态硬盘。结合本发明实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于电子设备实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本说明书的其它实施方案。本说明书旨在涵盖本说明书的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本说明书的一般性原理并包括本说明书未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本说明书的真正范围和精神由下面的权利要求指出。
应当理解的是,本说明书并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本说明书的范围仅由所附的权利要求来限制。
Claims (17)
1.一种数据编译方法,其特征在于,应用于资源受限设备的虚拟机,所述方法包括:
资源受限设备的虚拟机响应于编译命令,将待编译的源代码编译为WebAssembly模块;
在编译过程中,为所述WebAssembly模块的变量参数分配内存地址,并在分配到的内存地址中记录所述WebAssembly模块的变量参数;以及,生成与所述内存地址唯一对应的内存地址编码。
2.根据权利要求1所述的方法,其特征在于,所述变量参数包括可读写变量参数和只读变量参数;在编译过程中,还会生成所述WebAssembly模块的全局数据段信息;所述全局数据段信息包括所述WebAssembly模块中的可读写变量参数信息、只读变量参数信息和所述WebAssembly模块的变量参数结束地址信息;
其中,所述可读写变量参数信息包括可读写变量参数的内存块标识和内存基址;
所述只读变量参数信息包括只读变量参数的内存块标识和内存基址;
所述变量参数结束地址信息包括变量参数结束的内存块标识和内存地址。
3.根据权利要求2所述的方法,其特征在于,所述为所述WebAssembly模块的变量参数分配内存地址,包括:
获取所述编译命令中配置的内存基址参数;其中,所述内存基址参数包括内存块标识和内存基址;
从所述内存基址参数指定的内存基址开始,为所述WebAssembly模块的变量参数顺序分配空闲的内存地址;
所述方法还包括:
响应于编译完成的WebAssembly模块下载到所述资源受限设备,为所述WebAssembly模块分配空闲的物理存储地址。
4.根据权利要求3所述的方法,其特征在于,所述WebAssembly模块的变量参数包括只读变量参数、可读写变量参数和自定义类型变量参数;
所述为所述WebAssembly模块分配空闲的物理存储地址,包括:
针对所述WebAssembly模块中的只读变量参数,分配非易失性存储器中空闲的物理存储地址,并将所述只读变量参数存储到所述非易失性存储器;
针对所述WebAssembly模块中的可读写变量参数,分配易失性存储器中空闲的物理存储地址,并将所述可读写变量参数存储到所述易失性存储器;
确定与所述内存地址编码唯一对应的所述物理存储地址的映射。
5.根据权利要求4所述的方法,其特征在于,所述确定与所述内存地址编码唯一对应的所述物理存储地址的映射,包括:
针对所述只读变量参数,将所述只读变量参数的内存地址编码的编码值减去只读变量参数的内存基址,再加上只读变量参数的物理存储空间起始地址,得到物理存储地址;
针对所述可读写变量参数,将所述可读写变量参数的内存地址编码的编码值减去可读写变量参数的内存基址,再加上可读写变量参数的物理存储空间起始地址,得到物理地址;
所述只读参数变量的物理存储空间起始地址,或者可读写变量参数的物理存储空间起始地址,都由内存块标识映射得到。
6.根据权利要求5所述的方法,其特征在于,所述内存地址编码的大小包括4个字节;
其中,所述4个字节中的低2字节用于记录对内存地址进行编码得到的编码值,所述4个字节中的高2字节若干比特用于记录内存块标识。
7.一种参数传递方法,其特征在于,应用于资源受限设备的虚拟机执行WebAssembly模块之间的函数调用,所述WebAssembly模块通过权利要求1所述的数据编译方法完成编译;所述方法包括:
响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,获取第二WebAssembly模块编译过程中生成的内存地址编码;
将所述内存地址编码传递给所述第一WebAssembly模块,以使所述第一WebAssembly模块解析所述内存地址编码对应的物理存储地址,并访问所述物理存储地址记录的所述第二WebAssembly模块的变量参数,以及将所述变量参数带入所述目标函数后执行。
8.根据权利要求7所述的方法,其特征在于,所述解析所述内存地址编码对应的物理存储地址,包括:
解析所述内存地址编码的编码值;
获取所述第二WebAssembly模块的全局数据段信息;所述全局数据段信息包括所述第二WebAssembly模块中的只读变量参数的内存基址、所述第二WebAssembly模块中的可读写变量参数的内存基址;
如果所述编码值大于等于所述只读变量参数的内存基址,且小于所述可读写变量参数的内存基址,则将所述编码值减去所述只读变量参数的内存基址,再加上所述只读变量参数的物理存储空间起始地址,得到所述内存地址编码对应的非易失性存储器的物理存储地址;
如果所述编码值大于等于所述可读写变量参数的内存基址,且小于自定义参数变量的内存基址,则将所述编码值减去所述可读写变量参数的内存基址,再加上所述第二WebAssembly模块在内存的物理起始地址,得到所述内存地址编码对应的易失性存储器的物理存储地址。
9.根据权利要求8所述的方法,其特征在于,所述内存地址编码的大小包括4个字节;
其中,所述4个字节中的低2字节用于记录对内存地址进行编码得到的编码值,所述4个字节中的高2字节若干比特用于记录内存块标识;
所述解析所述内存地址编码的编码值,包括:
解析所述内存地址编码的低2字节的编码值。
10.根据权利要求9所述的方法,其特征在于,所述获取所述第二WebAssembly模块的全局数据段信息,包括:
解析所述内存地址编码中的高2字节,确定内存块标识;
如果所述第二WebAssembly模块的模块标识为预设定值,确定所述第二WebAssembly模块为应用模块,获取所述第二WebAssembly模块的全局数据段信息;其中,所述应用模块包括从源代码中的应用相关代码编译得到的WebAssembly模块;
如果所述第二WebAssembly模块的模块标识为非预设定值,确定所述第二WebAssembly模块为库模块,根据映射表查找与所述内存块标识对应的目标模块,获取所述目标模块的全局数据段信息;其中,所述库模块包括从源代码中的库相关代码编译得到的WebAssembly模块。
11.根据权利要求10所述的方法,其特征在于,所述映射表包括内存块标识、模块标识,所述映射表在WebAssembly模型下载到资源受限设备的过程中建立,或者在代码执行应用流程时建立;
所述模块标识为所述资源受限设备中所有的WebAssembly模块对应的编码,所述模块标识按照WebAssembly模块下载到资源受限设备的顺序递增编码。
12.一种参数传递方法,其特征在于,所述方法包括:
为所有WebAssembly模块提供共享内存空间,所述共享内存空间的内存块标识为0,共享内存基址取值小于所有WebAssembly模块的内存基址取值或者大于所有WebAssembly模块的内存最大取值;如果共享内存基址取值小于所有WebAssembly模块的内存基址取值,则所述内存空间大小为所述WebAssembly模块的内存基址取值的最小值减去共享内存空间基址;
响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,将第二WebAssembly模块的变量参数拷贝到共享内存中,并将该共享内存的起始地址编码作为参数传递给第一WebAssembly模块;
所述第一WebAssembly模块在接收到参数后,解析起始地址编码,并在内存地址值小于所有WebAssembly模块的内存基址或者大于所有WebAssembly模块的内存最大取值时,则从解析得到的共享内存的物理地址中获取记录的所述第二WebAssembly模块的参数变量,以及将所述变量参数带入所述目标函数后执行。
13.根据权利要求12所述的方法,其特征在于,所述解析起始地址编码,包括:
通过调用操作系统提供的API解析起始地址编码对应的共享地址的物理地址;
或者,通过所述起始地址编码的指针,确定指针指向的共享内存的物理地址。
14.一种数据编译装置,其特征在于,应用于资源受限设备的虚拟机,所述装置包括:
编译单元,资源受限设备的虚拟机响应于编译命令,将待编译的源代码编译为WebAssembly模块;
在所述编译单元执行编译过程中,为所述WebAssembly模块的变量参数分配内存地址,并在分配到的内存地址中记录所述WebAssembly模块的变量参数;以及,生成与所述内存地址唯一对应的内存地址编码。
15.一种参数传递装置,其特征在于,应用于资源受限设备的虚拟机执行WebAssembly模块之间的函数调用,所述WebAssembly模块通过权利要求1所述的数据编译方法完成编译,所述装置包括:
获取单元,响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,获取第二WebAssembly模块编译过程中生成的内存地址编码;
传递单元,将所述内存地址编码传递给所述第一WebAssembly模块,以使所述第一WebAssembly模块解析所述内存地址编码对应的物理存储地址,并访问所述物理存储地址记录的所述第二WebAssembly模块的变量参数,以及将所述变量参数带入所述目标函数后执行。
16.一种参数传递装置,其特征在于,所述装置包括:
共享单元,为所有WebAssembly模块提供共享内存空间,所述共享内存空间的内存块标识为0,共享内存基址取值小于所有WebAssembly模块的内存基址取值或者大于所有WebAssembly模块的内存最大取值;所述内存空间大小为所述WebAssembly模块的内存基址取值的最小值减去共享内存空间基址;
调用单元,响应于第二WebAssembly模块调用第一WebAssembly模块中的目标函数,将第二WebAssembly模块的变量参数拷贝到共享内存中,并传递该共享内存的起始地址编码作为参数,给第一WebAssembly模块;
传递单元,所述第一WebAssembly模块在接收到参数后,解析起始地址编码,并在内存地址值小于所有WebAssembly模块的内存基址或者大于所有WebAssembly模块的内存最大取值时,则将解析的共享内存的物理地址,并从该物理地址获取记录的参数变量,以调用目标函数。
17.一种电子设备,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行上述权利要求1-13中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311723575.1A CN117707652B (zh) | 2023-12-14 | 2023-12-14 | 数据编译、参数传递方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311723575.1A CN117707652B (zh) | 2023-12-14 | 2023-12-14 | 数据编译、参数传递方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117707652A true CN117707652A (zh) | 2024-03-15 |
CN117707652B CN117707652B (zh) | 2024-06-11 |
Family
ID=90143820
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311723575.1A Active CN117707652B (zh) | 2023-12-14 | 2023-12-14 | 数据编译、参数传递方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117707652B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050010911A1 (en) * | 2003-07-12 | 2005-01-13 | Samsung Electronics Co., Ltd. | Shared library system and method of building the system |
WO2013002979A2 (en) * | 2011-06-29 | 2013-01-03 | Microsoft Corporation | Debugging in a multiple address space environment |
CN115659333A (zh) * | 2022-10-13 | 2023-01-31 | 南方科技大学 | 一种基于二进制插桩的沙箱、内存隔离方法及存储介质 |
CN116303143A (zh) * | 2023-04-26 | 2023-06-23 | 浙江大学 | 基于LLVM编译框架来增强WebAssembly内存安全的方法 |
CN116661910A (zh) * | 2023-08-01 | 2023-08-29 | 北京中电华大电子设计有限责任公司 | 一种应用调用的方法及装置 |
-
2023
- 2023-12-14 CN CN202311723575.1A patent/CN117707652B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050010911A1 (en) * | 2003-07-12 | 2005-01-13 | Samsung Electronics Co., Ltd. | Shared library system and method of building the system |
WO2013002979A2 (en) * | 2011-06-29 | 2013-01-03 | Microsoft Corporation | Debugging in a multiple address space environment |
CN115659333A (zh) * | 2022-10-13 | 2023-01-31 | 南方科技大学 | 一种基于二进制插桩的沙箱、内存隔离方法及存储介质 |
CN116303143A (zh) * | 2023-04-26 | 2023-06-23 | 浙江大学 | 基于LLVM编译框架来增强WebAssembly内存安全的方法 |
CN116661910A (zh) * | 2023-08-01 | 2023-08-29 | 北京中电华大电子设计有限责任公司 | 一种应用调用的方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN117707652B (zh) | 2024-06-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107291480B (zh) | 一种函数调用方法及装置 | |
CN107025559B (zh) | 一种业务处理方法及装置 | |
US11507362B1 (en) | System and method for generating a binary patch file for live patching of an application | |
US20130086369A1 (en) | Compiling code for an enhanced application binary interface (abi) with decode time instruction optimization | |
US7979685B1 (en) | Multiple instruction execution mode resource-constrained device | |
CN116680015B (zh) | 函数调用方法、装置、电子设备及可读存储介质 | |
CN112130926B (zh) | 应用程序运行的方法、装置、终端设备及存储介质 | |
CN111625225A (zh) | 一种程序指定数据输出方法和装置 | |
CN112882732A (zh) | 一种软件开发工具包sdk中功能代码的更新方法和装置 | |
US7685588B2 (en) | Platform independent binary instrumentation and memory allocation method | |
CN113485716B (zh) | 防内存越界的程序编译方法及装置 | |
CN117075960B (zh) | 程序重构方法、应用跨平台迁移方法、装置与计算设备 | |
CN116680014B (zh) | 数据处理方法和装置 | |
CN103198244A (zh) | 保护动态链接库的方法 | |
CN117707652B (zh) | 数据编译、参数传递方法及装置 | |
CN115292721B (zh) | 一种安卓兼容环境适配多Linux内核的启动方法 | |
CN112631613A (zh) | 基于区块链平台的智能合约部署和调用方法及相关设备 | |
WO2022194173A1 (zh) | 补丁方法及相关设备 | |
CN115994348A (zh) | 程序流水线的控制方法、处理装置和存储介质 | |
CN114924947A (zh) | 代码测试方法、装置、电子设备及存储介质 | |
CN117251234B (zh) | 基于补丁的函数调用方法及装置 | |
KR20070081868A (ko) | 이동통신시스템에서 효율적으로 소프트웨어를 업데이트하는방법 | |
CN115421875B (zh) | 二进制翻译方法及装置 | |
CN111694730B (zh) | 一种消除错误引用控件资源的方法及装置 | |
CN115421876B (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 |