CN114217882A - 在进程中运行应用的方法和装置 - Google Patents
在进程中运行应用的方法和装置 Download PDFInfo
- Publication number
- CN114217882A CN114217882A CN202110753407.1A CN202110753407A CN114217882A CN 114217882 A CN114217882 A CN 114217882A CN 202110753407 A CN202110753407 A CN 202110753407A CN 114217882 A CN114217882 A CN 114217882A
- Authority
- CN
- China
- Prior art keywords
- application
- address space
- sub
- descriptor
- segment
- 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.)
- Pending
Links
Images
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
Abstract
本说明书实施例提供了一种在进程中运行应用的方法,包括:基于描述符表中的第一段描述符获取第一地址空间,所述第一地址空间为所述进程的地址空间中与所述应用对应的子空间;将所述描述符表设置为不可访问;运行所述第一地址空间中存储的所述应用的应用代码。
Description
技术领域
本说明书实施例涉及计算机技术领域,更具体地,涉及一种在进程中运行应用的方法和装置。
背景技术
在当前的计算机系统中,通常通过一个进程运行一个应用,进程间的内存完全隔离,以此实现应用之间的内存隔离。所述进程例如可具体实现为容器。其中,容器是一种操作系统虚拟化技术,用于打包应用程序及其依赖项,并在隔离环境中运行它们。上述方式的缺点是:以容器为例,如果应用运行过程中因进行读写出现了阻塞,操作系统需要进行任务调度,切换运行另外的容器,而切换容器的开销较大。
发明内容
本说明书实施例旨在提供一种更有效的在进程中运行应用的方案,基于分段机制和内存保护键(Memory Protection Key,MPK)机制在一个进程中运行多个应用,从而在保证应用间内存隔离的同时提高操作系统运行多个应用的效率。
为实现上述目的,本说明书一个方面提供一种在进程中运行应用的方法,包括:基于描述符表中的第一段描述符获取第一地址空间,所述第一地址空间为所述进程的地址空间中与所述应用对应的子空间,其中所述描述符表中的其他描述符对应于禁止所述应用访问的内容;将所述描述符表设置为不可访问;运行所述第一地址空间中存储的所述应用的应用代码。
在一种实施方式中,所述方法还包括:在将所述描述符表设置为不可访问之后,恢复所述第一地址空间中存储的所述应用的运行现场。
在一种实施方式中,所述在将所述描述符表设置为不可访问之后,恢复所述第一地址空间中存储的所述应用的运行现场包括:通过运行所述第一地址空间中存储的应用的管理代码,在将所述描述符表设置为不可访问之后,恢复所述第一地址空间中存储的所述应用的运行现场。
在一种实施方式中,所述第一地址空间还用于存储所述应用的数据和栈,所述第一段描述符至少包括第一数据段段描述符和第一栈段段描述符,所述栈用于存储所述运行现场。
在一种实施方式中,所述方法还包括,禁用处理器的SMAP功能,将所述描述符表设置为由第一保护键的保护,所述将所述描述符表设置为不可访问包括:设置所述第一保护键对应的权限,使得所述描述符表不可访问。
在一种实施方式中,所述方法还包括,在运行所述第一地址空间中存储的所述应用的应用代码之前,通过硬件或软件代码的执行使得所述应用不能设置所述第一保护键的权限。
在一种实施方式中,所述方法还包括:在结束运行所述应用的应用代码之后,存储所述应用的运行现场,在将所述第一保护键对应的权限设置为使得所述描述符表可访问之后,跳转到其他代码。
在一种实施方式中,所述方法还包括:在应用发生异常之后,将所述描述符表设置为可访问;基于所述第一段描述符,将待恢复的应用运行现场保存到所述第一地址空间中;跳转到运行该应用的管理代码。
本说明书另一方面提供一种在进程中运行应用的装置,包括:
获取单元,用于基于描述符表中的第一段描述符获取第一地址空间,所述第一地址空间为所述进程的地址空间中与所述应用对应的子空间,其中所述描述符表中的其他描述符对应于禁止所述应用访问的内容;
设置单元,用于将所述描述符表设置为不可访问;
运行单元,用于运行所述第一地址空间中存储的所述应用的应用代码。
本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一种方法。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
附图说明
通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:
图1示出本申请实施例所应用的计算设备的示意图;
图2为基于三种机制对应用的内存进行隔离的示意图;
图3为本申请实施例提供的应用容器的结构示意图;
图4为本申请实施例提供的应用容器的启动流程图;
图5为本申请实施例提供的子应用处理模块包括的流程图;
图6为本申请实施例提供的换入子模块包括的流程图;
图7为本申请实施例提供的换出子模块包括的流程图;
图8为本申请实施例提供的一种在进程中运行应用的装置结构图。
具体实施方式
下面将结合附图描述本申请实施例。
图1示出本申请实施例所应用的计算设备的示意图。如图1中所示,该计算设备中包括CPU11和内存12。
所述CPU11例如为同时支持32位代码和64位代码的处理器IntelX64。当CPU11处于IA64模式时,支持以兼容模式运行32位应用程序,和以64位模式运行64位应用程序;在当前段描述符指示为32位代码时,CPU11进入兼容模式运行,此时应用可以使用32位模式下的所有能力,比如分段机制。
其中,分段机制是通过硬件机制对代码、数据结构、程序或应用等提供保护。以应用为例,CPU11可以在内存12中的描述符表121中为每个应用分配对应的段描述符,由段描述符指定应用对应的段(即线性地址中的一段连续的逻辑地址)。其中,描述符表121包括全局描述符表(global decriptor table,GDT)或局部描述符表(local descriptor table,LDT)。该段描述符例如包括32位代码段描述符、数据段描述符和栈段描述符,这些段描述符的基地址均被设置为分配给该应用的线性地址段的起始地址,长度均被设置为分配给该应用的线性地址的长度(该长度小于等于4G),从而每个应用可以拥有独立的逻辑地址空间或虚地址空间。比如,若在64位模式下运行32位应用程序时,此32位应用代码所使用的代码段、数据段、栈段的基地址可能均被设置为7G,段的长度限制均被设置为4G,则此32位应用程序在运行时,只能访问落在区间[7G,11G)范围内的线性地址。该段描述符还限定了对应的段的读写权限。
CPU11可通过内存12中与该段对应的段描述符访问该段,CPU11通过将应用对应的段描述符的索引存放到段寄存器111中,从而可以根据段描述符限定的读写权限访问该段描述符,获取该段描述符指定的段的线性地址,并基于该线性地址访问应用对应的段,同时,CPU11在获取到段的线性地址之后,将该线性地址缓存起来以供下次访问该段。
其中,在操作系统相关概念中,应用程序所能看到的内存地址被称作虚地址(virtual address);在intel手册上,应用程序看到的内存地址被称作逻辑地址(logicaladdress)。处理器CPU11内部的内存管理单元(MMU)负责把线性地址(linear address)翻译成物理内存地址(physical address)。
对于64位应用而言,其逻辑地址和线性地址相等,逻辑地址为64位,其中实际有效的位数为48位或52位(因处理器的具体实现而异)。对于32位应用而言,应用的寻址空间受到32位模式的限制,一个段的最大长度为4G字节,就是说,应用程序只能使用4G的逻辑地址。在32位模式下,MMU通过将访存时所使用段的基地址(在段描述符中有记录)和访存时的逻辑地址相加,得到访存时所使用的线性地址。另外,由于线性地址不等同于物理内存地址,通过处理器的内存管理单元(MMU),可以实现不同的线性地址映射到不同的物理内存地址(内存完全隔离场景);或者是某些线性地址映射到了相同的物理内存地址(比如内存压缩场景或内存共享场景),而另外的一些线性地址被映射到了不同的物理内存地址。
通常情况下,通过使用分段机制对不同的应用分配不同的线性地址,从而可实现对应用的内存空间的隔离。然而,一些恶意应用可能内置了切换段寄存器的相关指令,通过该指令切换段寄存器111中的段描述符的索引,从而可以通过读取其他应用的段描述符访问其他应用对应的段,带来不安全性,并且由于该指令的字节数较少,对切换段寄存器的相关指令进行全代码搜索和替换会造成大量的非必要替换,影响了性能。
为此,本申请实施例提供了一种在进程中运行应用的方案,在通过分段机制为各个应用分配线性地址之后,基于内存保护键(MemoryProtectionKey,MPK)机制确保在运行应用代码时不可访问描述符表,从而应用代码即使内置了切换段寄存器的相关指令,也不能通过读取其他应用的段描述符而切换到其他应用的段,提供了较严格的应用之间的内存隔离。
其中,在IntelX64兼容的处理器上,对于存储器的访问权限控制受到分段机制、分页机制、MPK机制的控制,其中分段机制包含了对于段的读写权限以及该段对应的线性地址范围;分页机制规定了应用程序可以以何种方式访问哪些线性地址,用户态下可访问的地址被称作用户态地址,对应的页面称作用户态页面;MPK机制为分页机制的补充,通过该机制在页表122中定义每个用户态页面各受哪个key保护,且由处理器中的保护键寄存器(protectionkeyrightsregister)112来定义当前处理器对被各个key保护的内存页面有何访问权限,也就是说,当访问用户态页面时,还需要查询保护键寄存器112中的信息,判断当前是否具备相应的访问权限。虽然应用可以通过执行wrpkru指令来修改保护键寄存器112中的值,从而改变处理器对被各个key保护的内存页面的访问权限,由于wrpkru指令包括的字节较多,因此可通过对应用代码及相关的代码(例如用于支持应用的代码)进行扫描和替换从而使得应用代码及相关的代码中不包含wrpkru指令,另外,还可以通过处理器的硬件机制防止应用代码更改保护键寄存器112。在启用MPK机制后,一般说来,系统软件会把key0作为默认的key。
图2为基于上述三种机制对应用的内存进行隔离的过程示意图。其中,图2左侧为图1所示计算设备中分配给用于运行各个32位应用的64位进程的地址空间,该地址空间例如为与内存的物理地址对应的一段线性地址空间。该进程例如可实现为应用容器,可用于对用户提供运行应用(或代码)的服务,图2中示意示出了64位应用容器作为示例。在该线性地址空间中,通过分段机制对32位应用1和32位应用2分别分配了4G的虚地址空间(或逻辑地址空间),另外,该线性地址空间中还存储有描述符表121,该描述符表121中包括与应用1和应用2分别对应的代码段描述符,数据段描述符和栈段描述符。其中,32位应用的代码段描述符可用于访问应用的代码,数据段描述符可用于访问应用的数据,栈段描述符可用于进行栈操作。该描述符表121中还包括64位应用容器的代码段描述符、数据段描述符和栈段描述符,64位应用容器使用64位代码段,其通过段描述符限定的基地址为0,长度为线性地址空间的最大值,从而应用容器可以访问完整的64位线性地址空间。
其中,对于每个32位应用,其较低的地址中存储有32位应用的代码、32位应用运行支持环境的代码、输入输出(IO)请求应答区,其最高端的虚地址被用于存放与64位应用容器相关的代码和数据,比如调度管理代码和调度管理数据结构。
如图2中右侧的页表122所示,将所有应用的应用容器相关代码和数据(例如32位调度管理代码和调度管理数据结构)映射到相同的物理内存页面上,且使用非默认的保护键对其进行保护(图示中,使用key1进行保护,假设默认的保护键为key0)。另外,在页表122中,对以用户态页面存放的、应用可使用的描述符表121也使用key1进行保护。可以理解,这里虽然示出以相同的保护键(即key1)对调度管理代码、调度管理数据结构和描述符表121进行保护,在实际中,也可以对其使用不同的保护键分别进行保护,例如使用key1保护描述符表121,使用key2保护调度管理代码、调度管理数据结构,从而可以根据需要将key1和key2设置为对应于不同的权限。另外,可以理解,不一定如图2中所示对描述符表121中的应用1的代码段描述符、数据段描述符和栈段描述符都使用非默认的key(例如key1)进行保护,例如,由于恶意应用可能会访问其它应用的数据和栈,因此可以仅保护应用的数据段描述符和栈段描述符,而可以将代码段描述符以内核态页面存储或者以默认的key0保护。
如此,在运行应用代码之前,首先禁用处理器的特权模式内存访问保护(Supervisor-Mode Memory Access Protection, SMAP)功能,通过禁用SMAP功能使得允许在特权模式下访问用户态内存。从而,处理器在运行32位应用代码之前可首先通过特权模式读取该应用代码对应的段描述符,并缓存该应用代码对应的地址,然后,在通过CPU在保护键寄存器112中将key1设置为不可访问的权限之后运行应用代码,从而在运行应用代码时可防止应用通过访问描述符表121修改段寄存器,防止了应用进行内存越界访问。
图3为本申请实施例提供的应用容器的结构示意图。如图3所示,应用容器中包括外部输入处理模块,用于:1)接收启动新子应用的请求;2)接收子应用的输入数据。所述子应用例如为图2中所示的应用1或应用2。应用容器还包括子应用执行线程,每个子应用执行线程可为一个或多个子应用提供执行服务。每个子应用都由一个或多个子应用执行线程负责进行执行,例如,对于多线程的子应用,一个子应用就需要使用多个子应用执行线程来完成工作。对于有的子应用而言,如编译为X86nativecode的ftp服务器应用,它可能需要在一个libraryOS里面进行运行,此时应用容器为此libraryOS提供包含子应用调度代码和子应用调度相关数据结构的子应用管理模块,libraryOS或应用容器实现应用容器适配模块,通过IO收发缓冲区实现子应用的IO。应用容器也支持在语言虚拟机、沙箱等中运行应用。
所述应用容器包括初始化模块、子应用请求处理模块、调度管理模块和外部输入处理模块,其中,调度管理模块包括换出子模块和换入子模块。下文将对这几个模块进行详细描述。
图4为本申请实施例提供的应用容器的启动流程,该流程是在应用容器对应的进程启动之后执行初始化模块而执行,包括以下步骤。
首先在步骤S41,使能处理器的MPK能力,禁用处理器的SMAP特性,也即,通过使能MPK并禁用SMAP,从而可结合分段机制和MPK机制进行对各个子应用的内存隔离。
在步骤S42,设置子空间。
具体是,将进程的虚地址空间划分为若干个互不重叠、最大为4G的子空间,其中每个子空间内部地址连续,并在存放在用户态页面的描述符表中为这些子空间创建对应的32位代码段、数据段、和栈段的段描述符,且通过MPK机制使得通过预定义保护键(例如key1)保护所述描述符表中各个子应用的需要保护的段描述符,例如,在需要保护各个子应用的代码段描述符、数据段描述符和栈段描述符的情况中,可以如图2中所示,对包括各个子应用的代码段描述符、数据段描述符和栈段描述符的部分描述符表使用key1进行保护,在另一种情况中,在仅需要保护各个子应用的数据段描述符和栈段描述符的情况中,可以对包括各个子应用的数据段描述符和栈段描述符的部分描述符表使用key1进行保护。通过设置key1保护上述部分描述符表,从而防止子应用的代码在运行时随便切换段描述符。其中,处理器在此时设置由key1保护上述需要保护的部分描述符表之后,可在保护键寄存器112中设置key1初始对应于可访问的权限。
在步骤S43,分配物理内存页面并在该物理内存页面中存放调度管理模块。
该调度管理模块如图2中所示包括32位调度管理代码和调度管理数据结构,应用容器在执行各个子应用之后,可使得各个子应用的与该调度管理模块对应的虚地址都与该相同的物理内存页面相映射,从而可协调对各个子应用的管理。
在步骤S44,启动外部输入处理模块。具体是,应用容器可创建IO服务线程执行该外部输入处理模块,以监听应用的IO请求,其中该IO请求例如包括启动新的子应用的请求,或者可包括请求对子应用输入数据等等。
在步骤S45,创建一个或多个子应用执行线程启动子应用处理模块,该子应用执行线程可以访问段描述符,并且可等待子应用运行请求以用于执行子应用。
图5为本申请实施例提供的子应用处理模块包括的流程图。
如图5所示,应用容器在开始执行子应用处理模块之后,首先,执行步骤S51,检查当前是否有新的子应用运行请求,如果没有则执行步骤S55确定是否有子应用可运行。
如果在步骤S51的检查结果为有新的子应用运行请求,则执行步骤S52,为该子应用分配子空间。具体是,为所述子应用分配其可以访问的线性地址空间和段描述符,从而指定此子应用可以访问的地址空间。
然后执行步骤S53,在子空间中准备子应用运行环境。
该步骤具体可包括以下多项设置:
(1)在所述子应用的子空间中加载应用运行支持环境,该应用运行支持环境中例如包括支持应用运行的代码,如输入输出代码等等;
(2)在所述子应用对应的子空间的预定地址(如[4G-100M,4G])处,映射所述调度管理模块包含的代码和数据(即图2中在应用1或应用2的虚地址空间中的32位调度管理代码和调度管理数据结构),并根据MPK机制将这些地址设置为非默认保护键(即key0)的保护键(例如key2)的保护,其中,key2与上述key1可以为相同的key;
(3)为所述子应用分配IO收发缓冲区物理内存,并将其映射到所述子空间中的预定地址处,例如[4G-400M,4G-100)处,该地址例如与图2中的应用1的虚地址空间中的IO请求应答区对应;
(4)为所述子应用分配应用现场保存区,并将其映射到所述子空间的预定地址(即应用现场保存区),如[4G-400M-4K, 4G-400M)处,并将所述子应用刚开始启动时对应的处理器状态保存在该现场保存区中,该线场保存区例如具有栈的形式;
(5)将所述子应用的代码和数据加载到所述的子空间中,具体加载地址受所述子应用控制,且不能与前述地址有重叠,所述子应用对应的代码、数据对应的存储地址和栈例如位于图2中的应用1的虚地址空间中的“32位应用1”处。
之后,子应用执行线程执行步骤S54,在确保子应用代码不能更改保护键寄存器之后,标记子应用可运行。
在一种实施方式中,对于子应用可能会通过自行修改保护键寄存器而作恶的情形,可通过二进制代码扫描和替换,保证子应用的可执行代码中不包含更改保护键寄存器的相关指令(即wrpkru指令),由于该指令包括5个字节,该扫描和替换不会造成大量的非必要替换。此外,还可以通过处理器的硬件机制来防止恶意代码更改保护键寄存器。
在确保子应用代码不能更改保护键寄存器之后,子应用执行线程将所述子应用标记处于可运行状态。具体是,子应用执行线程可在调度管理数据结构中记录该子应用处于可运行状态。
之后,子应用执行线程执行步骤S55,检查当前是否有子应用变为可运行状态,若有则跳转到当前可运行的子应用对应的调度管理模块的换入子模块处运行,以运行该子应用。同样地,子应用执行线程可在调度管理数据结构中查询当前是否有可运行的子应用。如果检查结果为当前没有可运行的子应用,则子应用执行线程跳转到步骤S51,再次确定有没有新的子应用运行请求。
图6为本申请实施例提供的换入子模块包括的流程图。
如图6所示,子应用执行线程在如上文所述跳转到执行调度管理模块中的换入子模块之后,首先执行步骤S61,切换子应用的段描述符。具体是,处理器11在段寄存器111中存放子应用的代码段描述符、数据段描述符和栈段描述符的索引,从而通过索引访问该子应用的代码段描述符、数据段描述符和栈段描述符,并缓存这些段描述符对应的子应用的线性地址空间。
子应用执行线程然后执行步骤S62,基于MPK机制将描述符表中的部分描述符表设置为不可访问,其中所述部分描述符表中除了包括该子应用的段描述符之外,还包括对应于禁止该子应用访问的内容的其他描述符,例如包括其他子应用的至少一个段描述符。具体是,如图1和图2所示,处理器11在保护键寄存器112中将key1对应的权限设置为不可访问,从而使得图2中受key1保护的部分描述符表变为不可访问。在key2与key1不同的情况中,子应用执行线程也可以在执行子应用的应用代码之前,将key2对应的权限设置为不可写,从而防止子应用的恶意代码更改调度管理代码。
之后,子应用执行线程执行步骤S63,恢复子应用运行现场,执行子应用。具体是,子应用执行线程基于缓存的栈段描述符对应的线性地址空间可访问子应用的线性地址空间中的栈顶指针,基于该栈顶指针恢复处理器的栈顶寄存器,从而可访问栈,并在栈中读取子应用刚开始启动时对应的处理器状态(即子应用运行现场),在处理器中恢复该子应用运行现场,并基于该子应用运行现场执行子应用的应用代码。
在图6所示过程中,子应用执行线程在运行子应用的应用代码之前,通过MPK机制将描述符表设置为不可读写,并且已经预先确保了子应用的应用代码中不能更改保护键寄存器112,因此子应用的应用代码不可能读取描述附表,也就不能通过读取其它子应用的段描述符而修改段寄存器以访问其它子应用的内存,因此更有效地进行了子应用之间的内存隔离。
当应用容器运行多个子应用时,需要在多个子应用之间进行切换,由于如上文所述,子应用的应用代码在开始运行之后就不能读取描述符表,这将使得执行一个子应用的子应用执行线程不能切换到执行另一个子应用。为此,本申请实施例中还在调度管理模块中包括换出子模块,用于使得子应用执行线程可以从一个子应用切换到另一个子应用。
图7为本申请实施例提供的换出子模块包括的流程图。
如图7所示,首先,子应用执行线程执行步骤S71,保存当前运行现场。具体是,将当前子应用的处理器运行状态保存在该子应用对应的子空间中的子应用现场保存区中,该现场保存区例如为栈的形式,在进行该保存之后,子应用执行线程还将该栈的栈顶指针保存在预定位置。可以理解,所述现场保存区不限于栈的形式,因此也不一定需要栈顶指针,子应用执行线程可以在预定位置保存现场保存区的存储地址,以用于找到该现场保存区。
在步骤S72,将上述部分描述符表设置为可访问。
具体是,子应用执行线程可使得处理器11修改保护键寄存器112中key1对应的权限,使得处理器可以访问描述符表121中的上述部分描述符表,即如图2所示,所述描述符表121中受key1保护的部分描述符表。
另外,子应用执行线程还可以设置key2,使得处理器可以写入调度管理数据结构。
在步骤S73,确定是否有其他可运行的子应用。
子应用执行线程可读取调度管理数据结构,从而确定是否有其他可运行的子应用。如果有,则可执行步骤S74,跳转到其他子应用的换入子模块,如果没有,则可执行步骤S75,跳转到图5中的步骤S51,确定有没有新的子应用运行请求。
通过在应用容器中设置换入子模块和换出子模块,使得应用容器可以在保证多个子应用内存隔离的同时在多个子应用之间进行切换。
应用容器在执行过程中,还可能会因中断/异常进入内核;内核在处理完中断/异常后,恢复子应用运行现场也涉及到了对描述符表的隐式特权模式访问;由于此时保护键寄存器中对key1的设置禁止了处理器访问描述符表,内核无法顺利恢复子应用运行现场,在该情况下,在需要从内核返回到应用的用户态时,执行如下步骤:通过wrpkru指令,将描述符表设置为可访问,即在保护键寄存器中设置key1对应的权限为可访问权限;将待恢复的子应用运行现场保存到当前子应用的现场保存区;跳转到所述子应用的换入子模块处。
一般说来,子应用运行时需要和外界进行交互(输入数据,输出数据),为此,所述应用容器中还包含外部输入处理模块和内部输出处理模块,该两个模块可以由例如IO服务线程执行。
所述内部输出处理模块的功能包括:监听IO收发缓冲区以获得子应用的输出数据,并将这些数据按照约定的方式输出。
所述外部输入处理模块的功能包括:监听来自于子应用外部的输入数据,若输入数据为新的子应用运行请求,将其该请求发送给子应用执行线程,子应用执行线程在接收到该子应用运行请求之后,从而可执行S52,以运行该子应用。若输入数据对应某个子应用的输入数据,则将所述输入数据写入所述子应用对应的IO收发缓冲区;并在调度管理数据结构中将所述子应用标记为处于可运行状态。
由所述应用容器或所述子应用提供通信适配模块,负责通过所述IO收发缓冲区进行输入数据的接收和输出数据的发送;本领域技术人员可以将通信适配模块类比为计算机虚拟化中的设备前端驱动,将外部输入处理模块和内部输出处理模块类比为计算机虚拟化中的设备后端驱动。
图8为本申请实施例提供的一种在进程中运行应用的装置结构图,包括:
获取单元81,用于基于描述符表中的第一段描述符获取第一地址空间,所述第一地址空间为所述进程的地址空间中与所述应用对应的子空间,其中所述描述符表中的其他描述符对应于禁止所述应用访问的内容;
设置单元82,用于将所述描述符表设置为不可访问;
运行单元83,用于运行所述第一地址空间中存储的所述应用的应用代码。
在一种实施方式中,所述装置还包括:恢复单元,用于在将所述描述符表设置为不可访问之后,恢复所述第一地址空间中存储的所述应用的运行现场。
在一种实施方式中,所述恢复单元还用于:通过运行所述第一地址空间中存储的应用的管理代码,在将所述描述符表设置为不可访问之后,恢复所述第一地址空间中存储的所述应用的运行现场。
在一种实施方式中,所述第一地址空间还用于存储所述应用的数据和栈,所述第一段描述符至少包括第一数据段段描述符和第一栈段段描述符,所述栈用于存储所述运行现场。
在一种实施方式中,所述设置单元还用于:禁用处理器的SMAP功能,将所述描述符表设置为由第一保护键的保护,设置所述第一保护键对应的权限,使得所述描述符表不可访问。
在一种实施方式中,所述装置还包括,执行单元,用于在运行所述第一地址空间中存储的所述应用的应用代码之前,通过硬件或软件代码的执行使得所述应用不能设置所述第一保护键的权限。
在一种实施方式中,所述装置还包括:换出单元,用于:在结束运行所述应用的应用代码之后,存储所述应用的运行现场,在将所述第一保护键对应的权限设置为使得所述描述符表可访问之后,跳转到其他代码。
在一种实施方式中,所述装置还包括:异常处理单元,用于:在应用发生异常之后,将所述描述符表设置为可访问;基于所述第一段描述符,将待恢复的应用运行现场保存到所述第一地址空间中;跳转到运行该应用的管理代码。
本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一种方法。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
通过本申请实施例提供的在进程中运行应用的方案,基于分段机制和内存保护键(Memory Protection Key,MPK)机制在一个进程中运行多个应用,从而在保证应用间内存隔离的同时提高操作系统运行多个应用的效率。
需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。其中,软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种在进程中运行应用的方法,包括:
基于描述符表中的第一段描述符获取第一地址空间,所述第一地址空间为所述进程的地址空间中与所述应用对应的子空间,其中所述描述符表中的其他描述符对应于禁止所述应用访问的内容;
将所述描述符表设置为不可访问;
运行所述第一地址空间中存储的所述应用的应用代码。
2.根据权利要求1所述的方法,还包括:在将所述描述符表设置为不可访问之后,恢复所述第一地址空间中存储的所述应用的运行现场。
3.根据权利要求2所述的方法,所述在将所述描述符表设置为不可访问之后,恢复所述第一地址空间中存储的所述应用的运行现场包括:通过运行所述第一地址空间中存储的应用的管理代码,在将所述描述符表设置为不可访问之后,恢复所述第一地址空间中存储的所述应用的运行现场。
4.根据权利要求2所述的方法,其中,所述第一地址空间还用于存储所述应用的数据和栈,所述第一段描述符至少包括第一数据段描述符和第一栈段描述符,所述栈用于存储所述应用的运行现场。
5.根据权利要求3所述的方法,还包括,禁用处理器的SMAP功能,将所述描述符表设置为由第一保护键的保护,所述将所述描述符表设置为不可访问包括:设置所述第一保护键对应的权限,使得所述描述符表不可访问。
6.根据权利要求5所述的方法,还包括,在运行所述第一地址空间中存储的所述应用的应用代码之前,通过硬件或软件代码的执行使得所述应用不能设置所述第一保护键的权限。
7.根据权利要求5所述的方法,还包括:在结束运行所述应用的应用代码之后,存储所述应用的运行现场,在将所述第一保护键对应的权限设置为使得所述描述符表可访问之后,跳转到其他代码。
8.根据权利要求3所述的方法,还包括:在应用发生异常之后,将所述描述符表设置为可访问;基于所述第一段描述符,将待恢复的应用运行现场保存到所述第一地址空间中;跳转到运行该应用的管理代码。
9.一种在进程中运行应用的装置,包括:
获取单元,用于基于描述符表中的第一段描述符获取第一地址空间,所述第一地址空间为所述进程的地址空间中与所述应用对应的子空间,其中所述描述符表中的其他描述符对应于禁止所述应用访问的内容;
设置单元,用于将所述描述符表设置为不可访问;
运行单元,用于运行所述第一地址空间中存储的所述应用的应用代码。
10.一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现权利要求1-8中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110753407.1A CN114217882A (zh) | 2021-07-03 | 2021-07-03 | 在进程中运行应用的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110753407.1A CN114217882A (zh) | 2021-07-03 | 2021-07-03 | 在进程中运行应用的方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114217882A true CN114217882A (zh) | 2022-03-22 |
Family
ID=80695860
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110753407.1A Pending CN114217882A (zh) | 2021-07-03 | 2021-07-03 | 在进程中运行应用的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114217882A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024007944A1 (zh) * | 2022-07-08 | 2024-01-11 | 华为技术有限公司 | 扩展内存隔离域的方法和电子设备 |
-
2021
- 2021-07-03 CN CN202110753407.1A patent/CN114217882A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024007944A1 (zh) * | 2022-07-08 | 2024-01-11 | 华为技术有限公司 | 扩展内存隔离域的方法和电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8453015B2 (en) | Memory allocation for crash dump | |
US8352694B2 (en) | Method of controlling memory access | |
US9430402B2 (en) | System and method for providing stealth memory | |
US8209510B1 (en) | Secure pool memory management | |
KR102051816B1 (ko) | 메모리 보호 유닛들을 사용한 가상화 지원 게스트 오퍼레이팅 시스템 | |
JP4519738B2 (ja) | メモリアクセス制御装置 | |
US6349355B1 (en) | Sharing executable modules between user and kernel threads | |
US8555024B2 (en) | Integrating data from symmetric and asymmetric memory | |
US9940268B2 (en) | Handling memory access protection and address translation in a data processing apparatus | |
US7543126B2 (en) | Apparatus, system, and method for implementing protected virtual memory subcontexts | |
US20120151184A1 (en) | Hard object: constraining control flow and providing lightweight kernel crossings | |
US7149873B2 (en) | Methods and apparatus for a dual address space operating system | |
US20130283017A1 (en) | Hard object: constraining control flow and providing lightweight kernel crossings | |
US20100251260A1 (en) | Pre-emptible context switching in a computing device | |
CN110928737B (zh) | 监控样本进程的内存访问行为的方法和装置 | |
CN113468079B (zh) | 内存访问方法及装置 | |
CN112256396B (zh) | 内存管理方法、系统及安全处理装置、数据处理装置 | |
CN113485716B (zh) | 防内存越界的程序编译方法及装置 | |
CN114217882A (zh) | 在进程中运行应用的方法和装置 | |
JP2023526811A (ja) | タグチェック装置及び方法 | |
CN106250328B (zh) | 存储器保护单元、存储器管理单元和微控制器 | |
US5450587A (en) | Expanded memory addressing scheme | |
US20080072009A1 (en) | Apparatus and method for handling interrupt disabled section and page pinning apparatus and method | |
CN113569231B (zh) | 多进程的mpu保护方法、装置及电子设备 | |
US11150887B2 (en) | Secure code patching |
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 |