虚拟线性内存的硬件、软件协同扩展方法及电子设备与流程

文档序号:32741375发布日期:2022-12-30 18:36阅读:176来源:国知局
虚拟线性内存的硬件、软件协同扩展方法及电子设备与流程

1.本技术涉及电子技术领域,尤其涉及虚拟线性内存的硬件、软件协同扩展方法及电子设备。


背景技术:

2.嵌入式微控制单元(microcontroller unit,mcu)因其硬件功耗低、成本低、体积小等优点,被广泛的应用在物联网(internet of things,iot)领域的终端设备上。例如,智能穿戴设备、智能家居设备等智能设备中都配置有嵌入式mcu。受限于mcu的成本,低端电子设备上往往不具备内存管理单元(memory management unit,mmu)和内存保护单元(memoryprotectionunit,mpu),第三方应用程序可以访问所有的物理地址,与操作系统具有相同的权限。
3.当电子设备上不具有mmu和mpu时,所有的第三方应用程序与操作系统有相同的权限,均可以访问、执行系统级别的指令。很显然的,第三应用程序可能恶意执行某些系统级别的指令,或者第三方程序访问时发生了某些访存相关的错误都会影响电子设备的正常工作。
4.为了保证电子设备上操作系统与第三方应用程序的安全隔离,使得第三方应用程序不能随意访问、执行系统级别的指令,开源的webassembly(wasm)提供了一种实现第三方应用程序和操作系统安全隔离的方法:webassembly为第三方应用程序提供一个线性内存,该线性内存指定该第三方应用程序可以访问的逻辑地址限定在一个连续的范围内;该第三方应用程序在执行涉及到内存的操作时,操作系统会进行边界检查,该边界检查使得第三应用程序程序只能访问、执行线性内存内部对应的指令。对应的,第三应用程序在执行访存相关操作时发生错误,也只会限定程序内部,不会扩散到外部环境。
5.虽然webassembly提供的线性内存能够实现第三方应用程序与操作系统的安全隔离,但是,首先,第三方应用程序在访问线性内存时需要通过指针进行间接访问,增加了系统的计算开销和寄存器的负载;其次,为了避免第三应用程序在访问线性内存溢出,需要在访问线性内存中的内容时进行边界检查,而边界检查会导致代码量急剧上升,增加了第三方应用程序对存储介质的占用大小,并且边界检查本身也会增加设备的计算开销。


技术实现要素:

6.本技术实施例提供了线性内存的硬件、软件协同扩展方法及电子设备。该方法包括:在提前编译时,将程序中的指令转换为虚拟线性内存的指令,如读、写、内存大小、内存增加等指令。在运行时,通过本技术提供的指令直接访问内存,并基于该硬件直接完成边界检查,极大的降低了电子设备的计算开销。并且该方法还支持webassembly的multiple per-module memory等特性。
7.第一方面,一种虚拟线性内存的硬件、软件协同扩展方法,电子设备的处理器包括虚拟线性内存单元,该虚拟线性内存单元用于管理电子设备上的部分或全部物理内存,该
方法包括:电子设备获取第一文件,该第一文件包括第一应用程序的wasm字节码文件;该电子设备提前编译该第一文件时,该电子设备将该第一文件中的第一指令转换为对应的第二指令;该第一指令为普通内存访问指令,该第二指令是通过虚拟线性内存单元访问虚拟线性内存单元所管理的内存的指令。
8.在上述实施例中,电子设备在提前编译应用程序时,将读/写指令转换为基于虚拟线性内存单元的读/写指令,进而可以基于虚拟线性内存单元直接访问线性虚拟内存。该方法初步实现了应用程序和操作系统之间的安全隔离。
9.结合第一方面的一些实施例,在一些实施例中,该电子设备在提前编译该第一程序时,该电子设备将第三指令转换为对应的第四指令;该第三指令包括内存增加指令、内存大小指令,该第四指令用于调用运行时提供的接口,以使得电子设备在运行该第一文件时,该电子设备基于该第四指令调用该运行时提供的接口实现内存增加或确定内存大小。
10.在上述实施例中,电子设备将内存增加、内存大小指令转换为对运行时接口的调用,使得电子设备可以确定为应用程序分配的内存大小,以及改变应用程序的内存大小。并且,在改变应用程序的内存大小是,保持该应用程序的基址不变,避免了内存碎片带来的应用程序从内存中整体换入换出导致的开销。
11.结合第一方面的一些实施例,在一些实施例中,该电子设备执行该第二指令时,基于虚拟线性内存单元完成边界检查。
12.在上述实施例中,由于电子设备将第一指令转变为第二指令,电子设备在提前编译时,不需要为第一指令生成边界检查代码;其次,第二指令在执行时由虚拟线性内存单元这一硬件完成边间检查,降低了提前编译后文件体积的大小。
13.结合第一方面的一些实施例,在一些实施例中,该电子设备提前编译该第一文件后得到第一可执行文件;在该电子设备运行该第一可执行文件时,该电子设备基于该虚拟线性内存单元为该第一可执行文件分配虚拟线性内存;该虚拟线性内存在物理内存中为连续的,或者该虚拟线性内存在物理内存中为不连续的。
14.在上述实施例中,电子设备运行提前编译后的应用程序时,会基于线性内存单元为应用程序分配虚拟线性虚拟内存。
15.结合第一方面的一些实施例,在一些实施例中,该电子设备切换该第一可执行文件为后台时,该电子设备保存该第一可执行文件对应的配置信息。
16.在上述实施例中,电子设备切换任务时,需要保存被切换到后台的应用程序的有关虚拟线性内存单元的配置信息。
17.结合第一方面的一些实施例,在一些实施例中,该电子设备切换该第一可执行文件为前台时,该电子设备恢复该第一可执行文件对应的配置信息。
18.在上述实施例中,电子设备切换任务时,需要恢复被切换到前台的应用程序的有关虚拟线性内存单元的配置信息,使得应用程序可以正常运行。
19.结合第一方面的一些实施例,在一些实施例中,该一个或多个虚拟线性内存块被配置有独立的基址、读/写权限、大小。
20.在上述实施例中,电子设备切换任务时,需要恢复被切换到前台的应用程序的有关虚拟线性内存单元的配置信息,使得应用程序可以正常运行。
21.结合第一方面的一些实施例,在一些实施例中,电子设备获取第二文件,该第二文
件包括第二应用程序的wasm字节码文件;该电子设备提前编译该第二文件时,该电子设备将该第二文件中的该第一指令转换为对应的该第二指令;该第一程序在第一内存上的读/写权限与该第二程序在第一内存上的读/写权限不同,该第一内存对应于电子设备物理内存中的一段连续的物理地址。
22.在上述实施例中,电子设备上运行的不同程序对于同一段物理地址上的访问权限不同,保证了不同应用程序之间的安全隔离。
23.结合第一方面的一些实施例,在一些实施例中,该第一程序与该第二程序的执行级别/特权级别相同。
24.在上述实施例中,该第一应用程序与第二应用程序不配置特权态或者特权态相同,进而避免了特权态切换导致的开销。
25.第二方面,本技术提供了一种电子设备,该电子设备包括:一个或多个处理器和存储器;该存储器与该一个或多个处理器耦合,该一个或多个处理器包括虚拟线性内存单元,该虚拟线性内存单元用于管理电子设备上的部分或全部物理内存,该存储器用于存储计算机程序代码,该计算机程序代码包括计算机指令,该一个或多个处理器调用该计算机指令以使得该电子设备执行:获取第一文件,该第一文件包括第一应用程序的wasm字节码文件;提前编译该第一文件时,将该第一文件中的第一指令转换为对应的第二指令;该第一指令为普通内存访问指令,该第二指令是通过虚拟线性内存单元访问虚拟线性内存单元所管理的内存的指令。
26.在上述实施例中,电子设备在提前编译应用程序时,将读/写指令转换为基于虚拟线性内存单元的读/写指令,进而可以基于虚拟线性内存单元直接访问线性虚拟内存。该方法初步实现了应用程序和操作系统之间的安全隔离。
27.结合第二方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:在提前编译该第一程序时,将第三指令转换为对应的第四指令;该第三指令包括内存增加指令、内存大小指令,该第四指令用于调用运行时提供的接口,以使得电子设备在运行该第一文件时,基于该第四指令调用该运行时提供的接口实现内存增加或确定内存大小。
28.结合第二方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:执行该第二指令时,基于虚拟线性内存单元完成边界检查。
29.结合第二方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:提前编译该第一文件后得到第一可执行文件;在运行该第一可执行文件时,基于该虚拟线性内存单元为该第一可执行文件分配虚拟线性内存;该虚拟线性内存在物理内存中为连续的,或者该虚拟线性内存在物理内存中为不连续的。
30.结合第二方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:切换该第一可执行文件为后台时,保存该第一可执行文件对应的配置信息。
31.结合第二方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:切换该第一可执行文件为前台时,恢复该第一可执
行文件对应的配置信息。
32.结合第二方面的一些实施例,在一些实施例中,该虚拟线性内存单元为第一可执行文件提供一个或多个虚拟线性内存块。
33.结合第二方面的一些实施例,在一些实施例中,该一个或多个虚拟线性内存块被配置有独立的基址、读/写权限、大小。
34.结合第二方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:获取第二文件,该第二文件包括第二应用程序的wasm字节码文件;提前编译该第二文件时,将该第二文件中的该第一指令转换为对应的该第二指令;该第一程序在第一内存上的读/写权限与该第二程序在第一内存上的读/写权限不同,该第一内存对应于电子设备物理内存中的一段连续的物理地址。
35.结合第二方面的一些实施例,在一些实施例中,该第一程序与该第二程序的执行级别/特权级别相同。
36.第三方面,本技术实施例提供了一种芯片系统,该芯片系统应用于电子设备,该芯片系统包括一个或多个处理器,该处理器用于调用计算机指令以使得该电子设备执行如第一方面、第二方面以及第一方面中任一可能的实现方式描述的方法。
37.第四方面,本技术实施例提供一种包含指令的计算机程序产品,当上述计算机程序产品在电子设备上运行时,使得该电子设备执行如第一方面以及第一方面中任一可能的实现方式描述的方法。
38.第五方面,本技术实施例提供一种计算机可读存储介质,包括指令,当上述指令在电子设备上运行时,使得该电子设备执行如第一方面以及第一方面中任一可能的实现方式描述的方法。
39.可以理解地,上述第二方面提供的电子设备、第三方面提供的芯片系统、第四方面提供的计算机程序产品以及第五方面提供的计算机存储介质均用于执行本技术实施例所提供的方法。因此,其所能达到的有益效果可参考对应方法中的有益效果,此处不再赘述。
附图说明
40.图1为本技术涉及的物理地址与虚拟地址关系的一个示例性示意图。
41.图2a、图2b为本技术涉及的mmu功能的一个示例性示意图。
42.图3为本技术涉及的线性内存功能的一个示例性示意图。
43.图4为本技术涉及的编译器工作原理的一个示例性示意图。
44.图5为本技术涉及的mpu功能的一个示例性示意图。
45.图6为本技术实施例提供的虚拟线性内存单元交互过程的一个示例性示意图。
46.图7为本技术实施例提供的虚拟线性内存单元原理的一个示例性示意图。
47.图8为本技术实施例提供的统一地址映射模式的一个示例性示意图。
48.图9为本技术实施例提供的提前编译过程中对相关指令进行适配性处理方法的一个示例性示意图。
49.图10为本技术实施例提供的存大小(memory.size)和内存增加(memory.grow)的适配性处理的一个示例性示意图。
50.图11a、图11b为本技术实施例提供的实现内存增加方法的一个示例性示意图。
51.图12为本技术实施例提供的加载、启动、执行目标文件方法的一个示例性示意图。
52.图13为本技术实施例提供的获取wasm字节码格式的目标程序的一个示例性示意图。
53.图14为本技术实施例提供的多目标程序场景下虚拟线性内存配置信息保存、恢复的一个示例性示意图。
54.图15为本技术实施例提供的电子设备100硬件结构的一个示例性示意图。
55.图16为本技术实施例提供的电子设备100软件结构的一个示例性示意图。
具体实施方式
56.本技术以下实施例中所使用的术语只是为了描述特定实施例的目的,而并非旨在作为对本技术的限制。如在本技术的说明书和所附权利要求书中所使用的那样,单数表达形式“一个”、“一种”、“该”、“上述”、“该”和“这一”旨在也包括复数表达形式,除非其上下文中明确地有相反指示。还应当理解,本技术中使用的术语“和/或”是指并包含一个或多个所列出项目的任何或所有可能组合。
57.以下,术语“第一”、“第二”仅用于描述目的,而不能理解为暗示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征,在本技术实施例的描述中,除非另有说明,“多个”的含义是两个或两个以上。
58.首先,为了便于理解,下面先对本技术实施例涉及的相关术语及相关概念进行介绍。本发明的实施方式部分使用的术语仅用于对本发明的具体实施例进行解释,而非旨在限定本发明。
59.(1)物理地址、虚拟地址
60.物理地址为具体物理硬件可识别并访问的地址。虚拟地址为操作系统认可的应用程序内可识别并访问的地址。
61.目标程序经过编译、汇编、链接等处理生成可执行的二进制机器目标代码时,会被映射到虚拟地址空间。对于采用虚存机制的操作系统,指令中给出的地址是虚拟地址,cpu执行指令时,首先要将虚拟地址转换为物理地址,才能到主存取指令和数据。地址转换(address translation)工作可以由cpu中的内存管理单元(memory management unit,mmu)完成。
62.图1为本技术涉及的物理地址与虚拟地址关系的一个示例性示意图。
63.如图1所示,当电子设备分别运行目标程序1和目标程序2时,都会执行同样的“call虚拟地址”指令。但是,对于不同的目标程序,相同的虚拟地址经过mmu转换为不同的物理地址。例如,cpu执行目标程序1的“call虚拟地址”指令,实际上访问的为物理地址1;cpu执行目标程序2的“call虚拟地址”指令,实际上访问的为物理地址2。
64.图2a、图2b为本技术涉及的mmu功能的一个示例性示意图。
65.如图2a所示,当设备不具有mmu时,不论是操作系统还是目标程序,cpu在执行时,其访问的地址均为实际的物理地址。也就是说,cpu发出的内存地址直接通过总线传输到内存芯片中。
66.在该情况下,恶意的目标程序或者是bug可以访问、修改任意物理地址上的数据,
进而影响到电子设备的正常工作。
67.如图2b所示,当设备具有mmu时,不论是操作系统还是目标程序,cpu在执行时,cpu访问的地址会被mmu接收,该地址为虚拟地址。mmu接收后,将该地址翻译为实际的物理地址,并发到内存中。也就是说,cpu发出的内存地址首先被mmu接收,mmu在将该内存地址翻译为另一个内存地址(实际的物理地址)再通过总线发送到内存芯片中。
68.可以理解的是,当电子设备配置有mmu时,通过mmu可以实现不同应用程序之间的安全隔离,以及应用程序和操作系统之间的安全隔离。
69.值得说明的是,实现地址转换映射功能的硬件模块还可以通过其他硬件单元实现,并不局限于mmu。
70.(2)线性内存(linearmemory,lm)
71.在wasm标准中,线性内存是一块抽象的随机读取存储器(randomaccessmemory,ram)。线性内存支持按照字节维度进行寻址,并且可以在限制范围内按页动态增长。
72.在实例化wasm模块时,需要为该模块创建一个线性内存对象,如arraybuffer。其中,模块为wasm中可分发、可加载、可执行的代码单元。类似于数组,可以将索引视为内存地址,该索引即为程序可见的地址或指针。
73.图3为本技术涉及的线性内存功能的一个示例性示意图。
74.首先,不同的目标程序拥有独立的线性内存,目标程序可以直接读、写线性内存中的内容;其次,目标程序通过索引操作线性内存中的指令、数据前,wasm的引擎会进行边界检查,以确保目标程序不会访问到授权空间外的内容,即不会访问到该目标程序的线性内存外的内容。
75.如图3所示,目标程序1对应的线性内存的索引为1至7,对应于设备上内存的物理地址为4至10。当目标程序通过索引7访问内存时,通过计算线性内存物理基址+索引得到物理地址为10,进而访问。当目标程序访问线性内存的索引8时,引擎进行边界检查时会触发异常,不允许目标程序1访问越界的物理地址11,保障了内存安全。
76.可以理解的是,首先,目标程序通过指针对内存进行访问为间接访问,会增加计算量和寄存器压力。其次,编译时刻不确定的访存地址访问,需要在编译时刻插入边界检查代码,导致编译输出的文件体积膨胀。
77.(3)编译器
78.编译器是将一种语言转换为另一种语言的功能模块。其中,大部分编译器为将目标程序源代码翻译成机器码的功能模块。编译器负责执行程序处理过程中编译步骤的功能模块。
79.为了降低编译器的代码实现难度,以及提高编译器的可扩展性,在实现时,可以将编译器分为编译器前端、编译器中端、编译器后端,并对编译器前端、编译器中端、编译器后端进行独立的实现。其中,编译器前端主要负责预处理、词法分析、语法分析、语义分析,生成便于后续处理的中间表示(intermediate representation,ir)等;编译器中端进行分析和各种优化,例如常量折叠、死代码消除等;编译器后端负责生成目标代码(编译代码或机器码),目标代码为平台相关的汇编代码。其中,若程序处理过程中只存在一个编译器,该编译器在生成目标代码后会进一步将汇编代码转译为机器码;若程序处理过程中还存在汇编器,则由汇编器将汇编代码转换为机器码。
80.下面以图4所示的内容为例,示例性的介绍编译器的工作原理。
81.图4为本技术涉及的编译器工作原理的一个示例性示意图。
82.如图4所示,编译器根据程序源码识别程序所使用的编程语言,按照编程语言定义的词法、语法和语义进行分析,之后生成后端机器无关的中间代码ir序列,ir序列也是程序的表示,只是面向编译器,由编译器来理解和处理。平台无关的中间代码ir,由编译器后端翻译成面向具体硬件和平台的机器码(machine code)。
83.对于本技术涉及的webassembly(wasm)语言下的编译器则是将则是将源程序编译为二进制格式。其中,二进制格式有两种:一种是wasm二进制格式,wasm二进制格式是平台无关的二进制,配合wasm运行时,相当于java语言的字节码。其中,wasm二进制格式可以进一步被翻译为目标机器码二进制格式。
84.值得说明的,为了方便开发者理解wasm模块,wasm还提供了更容易理解的文本格式。
85.(4)提前编译(ahead of time compilation,aot)
86.操作系统中,目标程序通常有三种编译执行方式:解释执行、提前编译、即时编译。
87.解释执行包括:解释器解释执行一条或多条字节码。
88.提前编译包括:编译器将字节码进一步翻译为机器目标码,并存储在存储介质中。值得说明的是,提前编译的时刻为运行应用程序前进行编译,例如在安装应用程序时。
89.即时编译包括:在字节码被运行时加载或解释执行时刻,将字节码编译为机器目标码执行。即时编译结果仅存在于运行时内存,并不存储于存储介质。
90.其中,不同平台的机器对应的机器码可以不同,不同目标程序在不同平台上的代码可以为不同的高级语言代码如c、java、python等。
91.例如,当目标程序的源代码为c语言时,被不同方式编译后的机器码可以是汇编语言;当目标程序的源代码为java语言时,由于java目标程序在虚拟机中执行,首先java目标程序被编译为字节码文件,并加载到java虚拟机中,此时虚拟机可以通过解释执行、即时编译将字节码转变为机器码后执行。
92.可以理解的是,对于内存、计算资源有限的电子设备,目标程序在安装时花费一定的时间进行编译,生成机器目标码,能够提高目标程序的启动速度。
93.其次,下面介绍本技术涉及的实现电子设备内存安全的方法以及将webassembly中的提前编译技术应用在mcu平台上的困难。
94.在传统的电脑、笔记本上操作系统中,主要是通过虚拟内存机制以及特权态的划分实现目标程序与目标程序之间以及目标程序和操作系统之间的安全隔离。
95.其中,目标程序之间的隔离包括:通过地址转换映射功能的硬件模块,如mmu,实现不同的目标程序的虚拟地址空间彼此独立,互不影响,目标程序仅能操作虚拟地址上的数据。
96.其中,目标程序和操作系统之间的隔离包括:系统执行级别可以划分为用户态和内核态,操作系统内核运行在内核态,而目标程序则运行在用户态。用户态的程序不能随意操作内核地址空间,实现了操作系统与目标程序的安全隔离。
97.内核态时,cpu可以执行特权指令,如存取特殊寄存器指令、对输入/输出(input/output,io)映射地址的访问等,以及可以执行非特权态指令;若cpu处在用户态,则只可以
执行非特权指令。用户态与内核态的切换可以通过系统调用、异常、外设中断实现。其中,内核态可以被称为特权态、特权模式、管理模式等;对应的,用户态可以称为非特权态、一般模式、用户模式等,在此不作限定。
98.用户态cpu在访问内存时,需要将内存地址发送给mmu,进而访问到实际的物理地址;而内核态cpu在访问内存时,可以直接将内存地址发送给内存芯片,直接访问到实际的物理地址。
99.值得说明的是,可以将cpu的执行态分为更多层级。
100.可以理解的是,考虑到cpu不知道执行的指令来自于目标程序还是操作系统,为了避免目标程序随意执行特权指令导致电子设备工作正常,通过内核态和用户态的切换,使得目标程序通过跳转到操作系统的代码的方法切换到内核态,进而初步实现了操作系统和目标程序的安全隔离;其次,在用户态的目标程序访问内存受到如mmu的地址转换映射功能的硬件模块的限制,不能访问、修改内核地址空间,进一步保障了目标程序和操作系统之间的安全隔离。
101.但是,很显然的,这种特权态和非特权态之间的切换本身就会带来一定的开销。其次,对于没有配置如mmu的地址转换映射功能的硬件模块的电子设备来说,无法通过虚拟内存机制来实现目标程序和操作系统之间的安全隔离。
102.为了保障未配置mmu的电子设备的内存安全,可以通过配置mpu实现。
103.实现电子设备内存安全的方法包括:可以给电子设备配置mpu。mpu同样引入了类似的特权态分离的策略,同时利用mpu对物理内存进行分区段的权限设置,进而保证某个内存区域对某种执行级别仅提供授权的访问,而非法的访问会触发处理器异常。
104.mpu在执行功能时,是以区域(region)为单位。其中,region是一段连续的地址,并且还需要满足边界对齐等条件。不同的region可以配置不同的执行级别。
105.例如,stm32的很多型号中的设备都具有mpu。mpu可以独立的配置多个内存区域,且每个区域可以进一步配置为多个子区域。不同的区域可以配置不同的读、写等操作的权限。当处理器访问内存中的某一个区域时,mpu会比较该区域的访问权限和当时的处理器模式。如果该请求符合该区域的访问标准时,则mpu允许处理器访问;若该请求不符合该区域的访问标准时,则mpu产生异常信号以阻止处理器的访问。
106.但是,由于mpu不能提供类似虚拟内存的机制,导致bug或者恶意程序可以通过load、store等通用的指令能够寻址到任意一个物理地址。进而,可能破坏程序控制流的完整性。
107.图5为本技术涉及的mpu功能的一个示例性示意图。
108.如图5所示,可以通过mpu对内存划分不同的区域,并对不同的区域设置不同特权态或不同模式下的权限。例如,目标程序1的状态为用户模式或非特权态,目标程序2为管理模式或特权态。则在目标程序1的视角中,区域1具有读写权限,区域2具有只读权限,区域3具有只读权限,区域4无权限;而在目标程序2的视角中,区域1具有只读权限,区域2具有读写权限,区域3无权限;区域4具有只读权限。其中,区域1、区域2位于电子设备的ram中;区域3和区域4位于flash memory/rom中。
109.例如,用作通信缓冲的ram空间作为区域5,为了防止通信注入的恶意代码,可以将区域5配置为不可执行。又例如,有些程序可能需要将代码复制到sram中执行,或者将向量
表复制到sram中以提高访问速度。在复制完代码或者向量表之后,存储器空间可以作为一个区域,且该区域被定义为只读的,防止存储器空间被意外的修改。
110.可以理解的是,通过mpu配置不同特权态或模式下的权限,能够实现目标程序之间、目标程序和操作系统之间的内存安全。
111.但是,mpu硬件功能实现时还存在很多的限制。例如,过强的边界要求会极大程度的增加了电子设备的内存开销。在cortext-m4/m7等处理器上,mpu region的边界要求对齐到其自身尺寸大小处,如果定义一个1mb大小的region,则其边界必须对齐到整数mb起始位置。
112.但是,在mpu上实现目标程序之间的安全隔离需要把i/o功能留在系统内核中,这会导致目标程序在进行i/o操作时,需要切换到内核态。很显然的,内核态和用户态之间的执行级别的切换会增加电子设备的计算和内存开销。并且随着i/o操作的次数增多,计算和内存开销急剧增加,影响目标程序的流畅运行。
113.为了降低如mpu、mmu等额外的硬件带来的特权态切换导致的计算开销,可以利用webassembly技术,从软件层面保证程序与程序之间的安全隔离,以及程序和操作系统之间的安全隔离。并且,可以利用webassembly技术中提前编译技术,对目标程序进行提前编译,进而提高程序的启动速度、降低程序的内存开销。
114.但是,webassembly技术中提前编译技术直接应用在mcu平台上,仍然存在一些亟待解决的问题,包括:
115.首先,在对目标程序进行提前编译时,由于编译时目标程序存在地址不确定的外部符号,如外部库函数等,对于该不确定的访存地址访问,需要在编译时刻插入边界检查代码。其中,访存地址的访问可以使用读指令/写指令,大部分指令集都需要包括读指令/写指令。
116.值得说明的是,为了与本技术实施例提供的读指令/写指令区别,称原有的读指令/写指令为普通内存访问指令。其中,普通内存访问指令与电子设备的架构、平台相关。
117.可以理解的是,边界检查代码的插入会导致目标程序进行提前编译后输出的目标文件体积急剧膨胀,进而增加了电子设备的内存开销。并且,边界检查代码插入后改变了目标程序的程序控制流,影响后续程序的优化,使得目标程序不能流畅运行。
118.其次,webassembly的访存模型和mcu存在差异。webassembly的访存模式为线性内存,mcu在执行访存操作时,需要将webassembly中的索引翻译为线性内存物理基址+索引的间接访存操作。其中,线性内存可以参考术语解释中(2)线性内存(linearmemory,lm)中的文字描述,此处不再赘述。
119.值得说明的是,在32位mcu上,由于访存操作会被翻译为线性内存物理基址+索引的间接访存操作,可能引发整数溢出,导致通过静态分析并消除边界检查代码是非常困难的。
120.最后,在webassembly标准中,定义了memory.grow指令用于动态增加线性内存的空间,以满足程序的动态访存需求。但是电子设备上的mcu采用了统一的物理地址空间,对线性内存的扩展可能无法保持线性内存的基址不变,并且更新线性内存的基址涉及对目标程序的栈、寄存器的修改。其中,线性内存的基址可以位于通用寄存器中。
121.值得说明的是,无法结合webassembly技术以及额外的硬件mpu同时实现内存安全
以及提升目标程序的运行性能。
122.其次,下面示例性的介绍本技术实施例提供的虚拟线性内存的硬件、软件协同扩展方法。
123.其一,本技术实施例首先提供了一个用于提供虚拟线性内存(virtuallinearmemory,vlm)的处理器硬件功能模块:虚拟线性内存单元(virtuallinearmemory unit,vlmn)。该虚拟线性内存单元可以为目标程序提供一个或多个虚拟线性内存块(virtuallinearmemoryblock,vlmb)。
124.其中,每一个虚拟线性内存块可以独立的配置参数包括:物理地址基址、读/写权限、使能位等。其中,可以通过相应的i/o映射寄存器进行配置。其中,对配置参数的读/写可以借助目标指令集架构标准(instructionsetarchitecture,isa)的外设操作指令完成。
125.本技术实施例提供的虚拟线性内存单元可以为目标程序提供一个或多个虚拟线性内存,并且该虚拟线性内存单元可以使目标程序操作该虚拟线性内存,如读、写、增加内存、确定内存大小、内存扩展、内存迁移等操作。并且在执行访存类指令时,由硬件而非编译时生成的代码完成边界检查。
126.本技术实施例提供的虚拟线性内存单元可以通过硬件实现物理地址与虚拟地址之间的转换。
127.其二,本技术实施例其次提供了基于虚拟线性内存的读、写访问指令。
128.当cpu执行读、写访问指令时,可以访问虚拟线性内存单元提供的虚拟线性内存。
129.读指令的格式与目标平台的内存的读指令类似,源操作数可以是mem(汇编中的内存单元),目标操作数可以是通用寄存器(general purpose register,gpr)。若虚拟线性内存单元分配了多个vlmb,增加一个立即数用于指示读指令访问的vlmb的编号,如vlmid。
130.在实施本技术实施例提供的基于虚拟线性内存的读指令时,可以通过如vlm.load.sz gpr,mem[,vlmid]方式实现读指令的调用。其中,mem是目标isa支持的访存格式,如offset(gpr)形式,或者如立即数形式等,在此不做限定。其中,.sz表示加载的bit数,可以为8、16、32等。对于64位目标isa来说,.sz还可以取64。如果vlm.load.sz gpr,mem[,vlmid]的映射不存在,则触发处理器异常;或者改写处理器状态寄存器的某个比特位以通知应用程序进行处理。
[0131]
其中,基于虚拟线性内存的写指令包括:
[0132]
写指令的格式与目标平台的内存的写指令类似,源操作数可以是通用寄存器,目标操作数可以是mem。在实施本技术实施例提供的基于虚拟线性内存的读指令时,可以通过如vlm.store.sz mem[,vlmid],gpr方式实现读指令的调用。
[0133]
值得说明的,目标平台的内存的读/写指令可以转换为本技术实施例提供的读指令/写指令,即普通内存访问指令为转变为本技术实施例提供的读指令/写指令。下文中,以load指令、store指令指代普通内存访问指令进行具体的说明。
[0134]
其三,本技术实施例还提供了用于实现虚拟地址与物理地址变换的指令。
[0135]
cpu执行该物理地址变换到虚拟地址指令时,输入为物理地址,输出为该物理地址对应的虚拟地址;cpu执行该虚拟地址变换到物理地址的指令时,输入为虚拟地址,输出为物理地址。
[0136]
其中,该指令可以用于实现虚拟地址到物理地址的快速变换,即结果为物理地址,
且转换后的物理地址保存在gpr中;失败可能引发处理器异常或修改控制位。
[0137]
例如,该指令的格式为cvt.vlm.phy gpr,mem[,vlmid]。该指令的输入虚拟线性内存单元中的虚拟地址,输出为该虚拟地址对应的物理地址。该指令实现时的硬件逻辑和实现读指令vlm.load和写指令vlm.store时通过vlm地址查找物理地址的方法的硬件逻辑一致。
[0138]
或者cvt.vlm.phy gpr,mem[,vlmid]指令不通过硬件实现,而是通过vlmu的配置信息,利用软件指令也能完成虚拟地址到物理地址的映射,如在多虚拟地址模式(multi-vlmb mode)下,cvt.vlm.phy rd,rs,32,0这条指令,可以等价于如下的代码实现:
[0139][0140][0141]
其中,可以认为rd为需要被确定的物理地址;rs为已知的虚拟地址。
[0142]
具体的,if!vlmb.en||rs+32》=vlmb[0].size判断当虚拟线性内存块使能且没有越界的情况下(vlmb.en=1,则虚拟线性内存块使能;vlmb.en=0,则虚拟线性内存块没有使能;||表示或;vlmb[0].size表示第一个虚拟线性内存块的大小),计算得到物理地址rd=虚拟线性内存块+虚拟地址(vlmb[0].base表示第一个虚拟线性内存块的基址),其中虚拟地址等价于偏移、索引或指针。若虚拟线性内存块没有使能,或者出现越界的情况下,trap则引发处理器异常或修改控制位。
[0143]
其中,对应的,该指令还可以用于实现物理地址到虚拟地址的快速变换,即结果为虚拟地址,且转换后的物理地址保存在gpr中;失败可能引发处理器异常或修改控制位。
[0144]
该指令的格式可以为cvt.phy.vlmmem[,vlmid],gpr
[0145]
与虚拟地址到物理地址的快速变化类似的,物理地址到虚拟地址的快速变化可以用硬件实现,也可以用软件方式实现。若认为实现虚拟地址到物理地址的快速变化为正映射,则可以认为物理地址到虚拟地址的快速变化为该正映射的逆,或逆映射。
[0146]
值得说明的是,实现虚拟地址到物理地址的快速变换的硬件电路可以与实现物理地址到虚拟地址变换的硬件电路不同,即在电子设备上,存在两个不同的硬件电路分别用于实现虚拟地址到物理地址的快速变换和物理地址到虚拟地址的快速变换。
[0147]
值得说明的是,在物理地址和虚拟地址的快速变换过程中,在multi-vlmb模式下,转换可能出现跨虚拟线性内存块边界的情况,导致转换得到的物理地址可能不连续。在该情况下,可以有多种方式处理该情况,例如利用multi-vlmb尺寸固定的特点,对跨边界的部分进行分段处理;又例如,在runtime函数中,直接利用vlm.store/vlm.load读取虚拟线性内存空间数据;又例如,利用直接存储器访问(direct memory access,dma)进行块数据搬运等,在此不做限定。
[0148]
其四,本技术实施例提供了虚拟线性内存的多种访问模式。
[0149]
用户可以通过配置虚拟线性内存单元的控制寄存器决定任意模式的使能与否,使得在不需要虚拟线性内存的情况下,可以关闭对应的功能,以降低功耗。还可以通过配置控
制寄存器,选择不同的模式,例如统一地址映射模式(unified vlmb mode)、多虚拟地址模式等。
[0150]
其中,统一地址映射模式主要是用于在不支持mmu的处理器上实现动态线性内存扩展工,并解决内存碎片引起的连续地址空间分配失败的问题。在实现时,若使能统一地址模式,将虚拟线性内存块按照编号(vlmid)组织成一个连续的虚拟地址空间,而不同编号的虚拟线性内存块的物理基址可以连续也可以不连续。
[0151]
其中,多虚拟地址模式主要是用于支持webassembly的模块多内存(multiple per-module memory)特性。在实现时,若使能多虚拟地址模式,每个虚拟线性内存块具有独立的虚拟地址空间、物理基址、偏移映射;每个虚拟线性内存块可以设置不同的访问权限,如读写权限或者只读权限。
[0152]
值得说明的是,在任意一种模式下,可以配合设计相应的dma指令,实现虚拟线性内存空间数据块和物理地址空间之间的数据搬运操作。
[0153]
在介绍完本技术实施例提供的虚拟线性内存、虚拟线性内存单元、虚拟线性内存块后,下面示例性的介绍虚拟线性内存单元的工作过程和虚拟线性内存单元的工作原理。
[0154]
图6为本技术实施例提供的虚拟线性内存单元交互过程的一个示例性示意图。
[0155]
如图6所示,当cpu未配置虚拟线性内存单元时,可以通过读指令load、写指令store,直接对物理地址上的数据进行读/写操作。当cpu配置虚拟线性内存单元时,可以兼容直接通过读指令load、写指令store进行访存操作,还可以支持cpu通过虚拟线性内存单元进行访存操作。其中,cpu通过虚拟线性内存单元进行访存操作时,cpu执行的读指令为vlm.load、cpu执行的写指令为vlm.store,虚拟线性内存单元可以将虚拟地址转换为物理地址后,进行对应的访存操作。
[0156]
图7为本技术实施例提供的虚拟线性内存单元原理的一个示例性示意图。
[0157]
如图7所示,虚拟线性内存单元可以通过控制寄存器配置多个虚拟线性内存块,其中编号为0的虚拟线性内存块对应的物理地址范围为0x2000_8000到0x2000_8fff。
[0158]
可以理解的是,虚拟线性内存单元负责物理地址与虚拟地址的映射/转换。
[0159]
其中,虚拟线性内存单元的配置信息可以如下表1所示。
[0160]
表1
[0161][0162]
表1示出了本技术实施例提供的虚拟线性内存单元的配置信息的一个示例性示意图。
[0163]
如上表1所示,可以通过在控制寄存器配置如表2所示的内容,实现配置虚拟线性内存单元。其中,需要配置的参数包括编号vlmid、权限permission、基址、大小等参数,未被配置的参数为默认值。
[0164]
可以理解的是,图6和图7对应的文字描述中的虚拟地址可以理解为webassembly中的索引/指针,进而通过虚拟线性内存单元实现webassembly中的线性内存的访存操作。
[0165]
下面结合表2以及图8示例性的介绍配置同一虚拟地址模式。
[0166]
表2
[0167][0168][0169]
表2为本技术实施例提供的统一地址映射模式配置信息的一个示例性示意表。
[0170]
图8为本技术实施例提供的统一地址映射模式的一个示例性示意图。
[0171]
如图8所示,可以配置虚拟线性内存单元如上表2所示实现统一地址映射模式的配置。很显然的,工作在统一地址映射模式的虚拟线性内存单元可以配置多个大小相同或不同的虚拟内存单元块。
[0172]
在目标程序的视角中,多个大小相同或不同的虚拟内存单元块对应的虚拟地址或索引/指针是连续的;而在电子设备的视角中,多个大小相同或不同的虚拟内存单元块对应的物理地址可以是不连续的。
[0173]
可以理解的是,虚拟线性内存单元能够通过分配多个大小相同或不同的虚拟内存单元块降低内存碎片引起的连续地址空间分配失败的几率,提高内存的使用效率。
[0174]
可以理解的是,本技术提供的虚拟线性内存不需要占用处理器的通用寄存器存放线性内存基址,从而降低寄存器压力,有利于生成更加高效的后端代码。且基址的变更是对目标程序透明的,降低了运行时更新指针/索引对程序的影响。
[0175]
在介绍了本技术实施例提供的虚拟线性内存、虚拟线性内存单元、虚拟线性内存块等概念后,示例性的介绍本技术实施例提供的基于虚拟线性内存等硬件以及软件协同扩展方法。其中,该软件协同扩展方法主要包括两个方面,其一为编译器执行访存类指令时的适配性处理,其二为运行时和操作系统的适配性处理。
[0176]
其一,在现有webassembly提前编译过程中,对原有的内存的访问类指令进行适配性处理,使得提前编译器编译后输出的文件能够支持实施本技术实施例提供的访存类指令。其次,还需要增加内存大小(memory.size)指令和内存增加(memory.grow)指令的适配性处理,并支持webassembly的bulk-memory扩展操作。
[0177]
其二,需要操作系统和运行时提供相应的支持,如完成虚拟线性内存单元的初始化,实现相关的回调函数。并可以保存一个或多个虚拟线性内存单元的配置信息,以完成多
目标程序切换时的相关状态的保存和恢复。
[0178]
首先,介绍关于访存类指令的适配性处理。对于访存类指令的适配性处理主要包括:从原有的读指令/写指令的指令编码中获取偏移offset、标识id等信息,基于该信息将原有的读指令/写指令转换为本技术实施例提供的基于虚拟线性内存的读指令/写指令。
[0179]
图9为本技术实施例提供的提前编译过程中对相关指令进行适配性处理方法的一个示例性示意图。
[0180]
如图9所示,在提前编译时,需要对内存访问类指令进行适配性处理,具体包括三种类型的指令,分别为读指令/写指令,内存大小、增加指令,memory-bulk指令。
[0181]
其中,对于读指令/写指令的适配性处理包括:
[0182]
从普通内存访问指令的指令编码中获取信息,并基于该信息生成本技术实施例提供的读指令/写指令。
[0183]
具体的,可以从原有的读指令store、写指令load的指令编码中获取align、offset、id等信息,然后从操作数栈获取基址base。其次,在获取到align、offset、id、base等信息后,生成对应的内联(intrinsic)函数调用。在编译器的后端,这类intrinsic函数直接转换为对应的vlm.load和vlm.store指令。
[0184]
其中,例如,可以通过如下代码的形式获取align、offset、id等信息。
[0185]
align=read_leb_unit32();
[0186]
offset=read_leb_unit32();
[0187]
id=read_leb_unit32();
[0188]
base=pop();
[0189]
ptr=base+offset;
[0190]
在获取到align、offset、id、base等信息后。通过对应的vlm.load指令,完成读操作。例如,可以通过如下代码的形式实现读操作。
[0191]
res=emit_vlm_load(ptr,align,id);
[0192]
emit_excep_handle_code();
[0193]
push(res);
[0194]
在如上的代码形式中,res为被读取的值,emit_vlm_load为对应的vlm.load指令,emit_excep_handle_code()为异常代码,用于返回对应错误的code;push(res)可以将需要被读取的数据压出栈。
[0195]
类似的,在获取到align、offset、id、base等信息后。通过对应的vlm.store指令,完成写操作。例如,可以通过如下代码的形式实现写操作。
[0196]
value=pop();
[0197]
res=emit_vlm_store(ptr,align,id,value);
[0198]
在如上的代码形式中,emit_vlm_store为对应的vlm.store指令,value为需要被写入的值。
[0199]
值得说明的是,在一些情况下,若是需要进行符号位扩展或者补0扩展的情况,则调用目标平台isa的相应指令进行处理。
[0200]
值得说明的是,在一些情况下,对于不支持或者不需要支持多虚拟地址模式的情况下,可以忽略vlmid;而对于使能多虚拟地址模式的情况下,需要将memidx(立即数)翻译
为vlmid(立即数)。
[0201]
可以理解的是,在实现vlm.load和vlm.store指令时,通过emit_vlm_load、emit_vlm_store实现对应的读写操作,由于虚拟线性内存单元能够基于配置信息确定任一个目标程序对应的物理地址的范围的,若ptr位于该范围内,则直接进行对应的操作;若ptr不位于该范围内,虚拟线性内存不会允许该程序访问物理地址范围内的内容,进而完成了边界检查。故,不需要在编译时生成边界检查的代码。
[0202]
可以理解的是,利用虚拟线性内存支持的访存类指令去代替普通内存访问指令,同时利用硬件机制实现边界检查,简化了代码和控制流,有利于编译器后端进行优化以及减少目标文件的体积,也不需要专用或通用的寄存器存储程序在内存中的基址。
[0203]
其中,对于内存大小(memory.size)和内存增加(memory.grow)的适配性处理包括:
[0204]
提前编译器调用运行时中的api,即在webassembly中需要调用webassembly微运行时(wasm-micro-runtime,wamr)中的api,以实现内存大小(memory.size)和内存增加(memory.grow)的适配性处理。
[0205]
图10为本技术实施例提供的存大小(memory.size)和内存增加(memory.grow)的适配性处理的一个示例性示意图。
[0206]
如图10所示,内存大小指令和内存大小指令的实现可以通过如下的方式实现。
[0207]
例如,可以通过如下代码的形式实现确定内存的大小。
[0208]
func=“wasm_runtime_memory_size”;
[0209]
ret=build_call(func);
[0210]
push(ret);
[0211]
wasm_runtime_memory_size为wamr提供的用于确定内存大小的api,ret为该api的返回值,通过调用该wasm_runtime_memory_size,可以确定内存的大小。
[0212]
类似的,例如可以通过如下代码的形式实现内存的增加。
[0213]
delta=pop();
[0214]
func=“wasm_runtime_enlarge_memory”;
[0215]
ret=build_call(func);
[0216]
push(ret);
[0217]
wasm_runtime_enlarge_memory为wamr提供的用于增加内存的api,ret为该api的返回值,通过调用该wasm_runtime_memory_size,可以增加内存的分配。
[0218]
其中,对于bulk-memory扩展的适配性处理包括:
[0219]
可以通过dma指令完成搬运,例如可以通过emit_vlm_dma_intrinsic函数实现,编译器后端可以将emit_vlm_dma_intrinsic翻译为对应的库调用或者是定制的指令序列。其中,通过dma指令可以实现多种模式,例如copy模式、fill模式等,在此不作限定。
[0220]
copy模式包括:虚拟线性内存与物理地址之间、虚拟线性内存与虚拟线性内存之间的复制;fill模式包括:将标量数值赋值给虚拟线性内存。示例性的,以op_fill指代fill模式,以op_copy_v2v指代copy模式中虚拟线性内存与虚拟线性内存之间的复制;以op_copy_v2p指代copy模式中虚拟线性内存复制到物理地址;以op_copy_p2v指代copy模式中物理地址复制到虚拟线性内存。
[0221]
在实现copy模式时,可以通过如下代码的形式实现:
[0222]
len=pop();
[0223]
val=pop();
[0224]
dst=pop();
[0225]
emit_vlm_dma_intrinsic(op_fill,dst,len,val);
[0226]
在实现fill模式时,可以通过如下代码的形式实现:
[0227]
en=pop();
[0228]
val=pop();
[0229]
dst=pop();
[0230]
emit_vlm_dma_intrinsic(op_copy_v2v,dst,len,val);
[0231]
很明显的,一些指令如内存大小指令、内存增加指令等指令需要运行时以及操作系统提供实现对应功能的api。下面示例性的介绍操作系统和运行时提供相应api的方法。
[0232]
下面以图10所示的内容为例示例性的介绍实现内存大小指令(memory.size)、内存增加指令(memory.grow)的方法。
[0233]
图10为本技术实施例提供的实现内存大小指令(memory.size)、内存增加指令(memory.grow)的方法的一个示例性示意图。
[0234]
如图10所示,在执行提前编译,当遇到内存增加指令时,可以通过步骤s1001、步骤s1002、步骤s1003、步骤s1004、步骤s1005实现内存增加(memory.grow)。
[0235]
s1001:目标文件运行时。
[0236]
目标程序被提前编译后,生成机器码格式的目标文件。当目标文件启动后,即运行时,电子设备会按照目标文件的逻辑执行目标文件中的代码。
[0237]
s1002:内存增加指令。
[0238]
当电子设备执行目标文件中的指令时,遇到内存增加指令时,执行步骤1003。
[0239]
s1003:获取线性内存的基址、以及需要分配的大小。
[0240]
获取目标文件的线性内存的基址、以及需要分配的大小。其中,基址可以通过虚拟线性内存单元的配置信息获取;需要分配的大小来自于内存增加指令中的输入参数。执行步骤s1004。
[0241]
s1004:调用操作系统提供的接口分配内存空间。
[0242]
在确定线性内存的基址以及需要分配的大小后,可以通过接口调用操作系统提供的接口分配内存,使得新分配的内存的大小等于需要分配的大小。执行步骤s1005。
[0243]
s1005:修改虚拟线性内存的配置信息。
[0244]
在分配内存成功后,对应的,修改该目标文件对应的虚拟线性内存/虚拟线性内存单元中的配置信息。
[0245]
s1006:内存大小指令。
[0246]
当电子设备执行目标文件中的指令时,遇到内存增加指令时,执行步骤1007。
[0247]
s1007:查询虚拟线性内存单元的配置信息,并返回对应的虚拟线性内存块大小。
[0248]
结合通过查询目标文件对应的虚拟线性内存单元的配置信息,可以得到目标aot对应的一个或多个虚拟线性内存块的大小。其中,虚拟线性内存单元的配置信息可以参考上文中表1、表2对应文字描述,此处不在赘述。
[0249]
在上文中,实现内存大小(memory.size)和内存增加(memory.grow)的适配性处理需要wamr提供“wasm_runtime_memory_size”以及“wasm_runtime_enlarge_memory”。下面以“wasm_runtime_enlarge_memory”为例,结合图11a、图11b所示的内容示例性的介绍wamr构建api的方法。
[0250]
很显然的,可以通过读取、修改虚拟线性内存的控制寄存器,实现对应的功内存大小(memory.size)、内存增加(memory.grow)方法。
[0251]
图11a、图11b为本技术实施例提供的实现内存增加方法的一个示例性示意图。
[0252]
在实现内存增加(memory.grow)方法时,首先需要获取当前线性内存的物理地址基址,然后利用操作系统提供的api分配新的更大的内存空间。其中该api与操作系统有关,例如可以是c标准库中的realloc()方法。其中,realloc()方法的声明为void*realloc(void*ptr,size_t size),ptr为指向重新分配内存的内存块的指针,size为内存块的新大小。
[0253]
如图11a所示,线性内存1大小为4kb,旧线性内存的物理基址为0x2000_8000,线性内存1对应的物理地址为0x2000_8000至0x2000_8fff。在调用内存增加(memory.grow)方法后,线性内存2大小为8kb,线性内存2的基址未变化仍然为0x2000_8000,且线性内存2对应的物理地址为连续的,即0x2000_8000至0x2000_9fff。
[0254]
可能由于内存碎片的存在,电子设备物理的堆内存中不存在足够大的连续物理地址空间,realloc()方法失败。在该情况下,可以仅分配新的增加的内存。
[0255]
如图11b所示,电子设备的堆内存中存在较多的内存碎片,此时通过本技术实施例提供的虚拟线性内存、虚拟线性内存块,在0x00ff_f000至0x00ff_ffff分配一个新的虚拟线性内存块。在该情况下线性内存1与线性内存3相同,线性内存4对应的物理地址为0x00ff_f000至0x00ff_ffff。
[0256]
值得说明的是,在目标程序的视角,线性内存3与线性内存4为连续的,仍然可以通过索引/指针完成线性内存3和线性内存4的访存相关操作。
[0257]
可以理解的是,本技术实施例提供的访存类指令,实现对线性内存读写操作及转换的下件,避免了引入一个额外的间接内存访问层带来的寄存器压力以及节省了大量的计算开销。
[0258]
上文主要介绍了,在提前编译过程中,对访存类指令的适配性处理。下面结合图12示例性的介绍,目标程序在被提前编译为目标文件后,操作系统如何加载、启动、执行目标文件。
[0259]
图12为本技术实施例提供的加载、启动、执行目标文件方法的一个示例性示意图。
[0260]
如图12所示,本技术实施例提供的加载、启动、执行目标文件方法包括:
[0261]
s1201:将目标程序提前编译为目标文件,在编译过程中完成访存类指令的适配性处理。
[0262]
具体的,电子设备可以有多种方式获取wasm字节码格式的目标程序,例如,可以从应用商店下载获取、或者网络下载获取等多种方式获取,在此不作限定。
[0263]
在获取到目标程序后,对目标程序进行提前编译为目标文件,其中目标文件的格式为机器码。在提前编译时,对目标程序的访存类指令进行适配性处理,如读指令、写指令、内存大小、内存增加指令等,具体可以参考上文中图9、图10、图11a、图11b对应的文字描述,
此处不再赘述。
[0264]
下面结合图13所示的内容,示例性的介绍获取wasm字节码格式的目标程序的过程。
[0265]
图13为本技术实施例提供的获取wasm字节码格式的目标程序的一个示例性示意图。
[0266]
如图13所示,电子设备如手表、手环、vr/ar眼镜、家居设备等,可以通过应用商店或网络等多种方式下载目标程序如应用程序或驱动程序。其中,目标程序可以是wasm字节码格式的。
[0267]
s1202:加载目标文件,完成非线性内存类加载、线性内存加载。
[0268]
加载目标文件时,按照操作系统默认的逻辑加载非线性内存类,加载线性内存,并在加载过程中,并且完成物理内存的分配。执行步骤s1202。
[0269]
s1203:虚拟线性内存单元使能、虚拟线性内存块配置。
[0270]
由于在步骤s1202时,操作系统已经加载了线性内存,故可以使能目标文件的虚拟线性内存单元,并配置虚拟线性内存块。其中,配置虚拟线性内存块的方法可以参考上文中表1、表2对应的文字描述,此处不再赘述。
[0271]
s1204:启动、执行目标文件。
[0272]
操作系统在启动目标文件后,执行目标文件时,通过本技术实施例提供的访存类指令实现对虚拟线性内存的读写操作。其他的指令,可以按照原有的逻辑执行。
[0273]
s1205:关闭目标文件,释放物理内存,除能虚拟线性内存单元。
[0274]
关闭目标文件时,操作系统需要释放目标文件运行时占用的物理内存,并除能目标文件对应的虚拟线性内存单元。
[0275]
结合图9、图10、图12所示的内容,可以理解的是,申请实施例提供的虚拟线性内存的硬件、软件协同扩展方法,首先提供一组扩展的指令实现对线性内存读写操,并且通过指令的转换,避免引入额外的间接内存访问层而导致的寄存器压力及相应的计算开销。其次,本技术通过提供的虚拟线性内存这一硬件单元实现线性内存的边界检查,避免了在编译转换阶段插入检查代码,减少了目标程序编译后生成的目标文件的体积。
[0276]
很显然的,与具有mpu的电子设备相同,本技术实施例提供的虚拟线性内存的硬件、软件协同扩展方法通过虚拟线性内存也实现了不同物理地址上的不同权限设置。
[0277]
但不同的是,本技术实施例提供的虚拟线性内存的硬件、软件协同扩展方法并没有划分特权/模式,避免了由于特权/模式切换导致的开销,通过在同一特权/模式下通过软件协同实现不同物理地址上的不同权限设置,进而保证了安全性。其次,本技术实施例提供的虚拟线性内存的硬件、软件协同扩展方法还提供了虚拟地址和对应的访存指令。
[0278]
很显然的,与具有mmu的电子设备相同,本技术实施例提供的虚拟线性内存的硬件、软件协同扩展方法通过虚拟线性内存也实现了虚拟地址,并可以配置虚拟地址与物理地址之间的映射关系。
[0279]
但不同的是,本技术并没有划分特权/模式,避免了由于特权/模式切换导致的开销,通过在同一特权/模式下通过软件协同实现不同物理地址上的不同权限设置,进而保证了安全性。
[0280]
当操作系统同时运行多个目标程序时,响应于用户的操作,在切换目标程序时,需
要保存被换出目标程序的虚拟线性内存单元的配置信息,并恢复换入目标程序的虚拟线性内存单元的配置信息。
[0281]
下面以图14所示的内容为例,示例性的介绍多目标程序场景下,在目标程序切换时,配置信息的保存与恢复。其中,为了方便描述,当目标程序换入时,称该程序切换到前台;当目标程序换出时,称该程序切换到后台。
[0282]
图14为本技术实施例提供的多目标程序场景下虚拟线性内存配置信息保存、恢复的一个示例性示意图。
[0283]
如图14所示,在多目标程序场景下,保存、恢复目标程序的方法包括:
[0284]
s1401:操作系统切换目标程序1至后台,切换目标程序2至前台。
[0285]
响应于用户的操作,或者由操作系统本身决定,将目标程序1切换至前台,并将原先在前台的目标程序2至前台。
[0286]
其中,当响应于用户的操作,对目标程序进行切换时,操作系统可以根据目标程序对应的线程是否被切换,确定被切换至后台的目标程序以及确定被切换至前台的目标程序。
[0287]
执行步骤s1301。
[0288]
s1402:保存目标程序1的配置信息,恢复目标程序2的配置信息。
[0289]
操作系统可以将目标程序1的虚拟线性内存单元的配置信息存到目标程序1的线程的上下文结构体中,并且禁用虚拟线性内存单元;对应的,操作系统可以从目标程序2的线程的上下文结构体中获取虚拟线性内存单元的配置信息,并依据该信息配置虚拟线性内存单元。
[0290]
值得说明的是,目标程序1被切换至后台前,若目标程序1的虚拟线性内存单元处于使能状态,则在目标程序1被切换至后台后,目标程序1的虚拟线性内存单元处于禁用状态。
[0291]
值得说明的是,在恢复目标程序2的配置信息时,若目标程序线程上下文中配置信息为空,可以重新初始化目标程序2的配置信息。
[0292]
值得说明的是,本技术实施例提供的虚拟线性内存的硬件、软件协同扩展方法,并不局限于webassembly提前编译以及嵌入式实时操作系统场景。例如,利用申请实施例提供的虚拟线性内存的硬件、软件协同扩展方法,可以直接生成机器相关(机器码)的沙箱执行模块;又例如,对于配置有mmu的电子设备,结合本技术实施例提供的虚拟线性内存的硬件、软件协同扩展方法以及可信的中间表示代码,可以为内核态提供一种安全的沙箱隔离机制,实现安全隔离的内核扩展、驱动开发接口等。
[0293]
最后,下面介绍本技术提供的电子设备。
[0294]
本技术实施例中电子设备可以为移动电子设备,也可以为智能家居设备等,在此不作限定。
[0295]
图15为本技术实施例提供的电子设备100硬件结构的一个示例性示意图。
[0296]
下面以电子设备100为例对实施例进行具体说明。应该理解的是,电子设备100可以具有比图中所示的更多的或者更少的部件,可以组合两个或多个的部件,或者可以具有不同的部件配置。图中所示出的各种部件可以在包括一个或多个信号处理和/或专用集成电路在内的硬件、软件、或硬件和软件的组合中实现。
flash memory等,按照存储单元电位阶数划分可以包括单阶存储单元(single-level cell,slc)、多阶存储单元(multi-level cell,mlc)、三阶储存单元(triple-level cell,tlc)、四阶储存单元(quad-level cell,qlc)等,按照存储规范划分可以包括通用闪存存储(英文:universal flash memory storage,ufs)、嵌入式多媒体存储卡(embedded multi media card,emmc)等。
[0308]
随机存取存储器130可以由处理器110直接进行读写,可以用于存储操作系统或其他正在运行中的程序的可执行程序(例如机器指令),还可以用于存储用户及应用程序的数据等。
[0309]
非易失性存储器140也可以存储可执行程序和存储用户及应用程序的数据等,可以提前加载到随机存取存储器中,用于处理器110直接进行读写。
[0310]
传感器模块150可以包括压力传感器、陀螺仪传感器、气压传感器、磁传感器、加速度传感器、距离传感器、接近光传感器、环境光传感器、指纹传感器、触摸传感器、骨传导传感器等。
[0311]
通信模块160可以包括移动通信模块、无线通信模块。
[0312]
显示模块170可以包括显示屏。
[0313]
图16为本技术实施例提供的电子设备100软件结构的一个示例性示意图。
[0314]
嵌入式电子设备100的软件系统可以采用分层架构,事件驱动架构,微核架构,微服务架构,或云架构。
[0315]
例如,电子设备的软件结构包括:应用层200、实时操作系统201、驱动层202。
[0316]
应用层200可以包括中间件,应用程序包,驱动程序包。应用程序包可以包括相机,图库,日历,通话,地图,导航,wlan,蓝牙,音乐,视频,短信息等应用程序
[0317]
实时操作系统201又称即时操作系统,它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。
[0318]
驱动层202可以包括硬件相关的设备驱动程序。
[0319]
上述实施例中所用,根据上下文,术语“当

时”可以被解释为意思是“如果
…”
或“在

后”或“响应于确定
…”
或“响应于检测到
…”
。类似地,根据上下文,短语“在确定

时”或“如果检测到(所陈述的条件或事件)”可以被解释为意思是“如果确定
…”
或“响应于确定
…”
或“在检测到(所陈述的条件或事件)时”或“响应于检测到(所陈述的条件或事件)”。
[0320]
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。该计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行该计算机程序指令时,全部或部分地产生按照本技术实施例该的流程或功能。该计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。该计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,该计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。该计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。该可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如dvd)、或者半导体介质(例如固态硬盘)等。
[0321]
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,该流程可以由计算机程序来指令相关的硬件完成,该程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法实施例的流程。而前述的存储介质包括:rom或随机存储记忆体ram、磁碟或者光盘等各种可存储程序代码的介质。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1