内存管理方法、装置、设备及存储介质与流程
未命名
09-22
阅读:70
评论:0
1.本发明涉及计算机技术领域,特别是涉及一种内存管理方法、装置、一种电子设备以及一种存储介质。
背景技术:
2.通常情况下,动态语言一般通过解释器解释执行,为了提升运行效率,引入了即时编译器(jit编译器,just in time compiler),即在解释运行的过程中的适当时机,将源代码编译成目标机器的二进制代码,直接在目标处理器上运行。即时编译器作为应用程序运行时的一部分,与即时编译器动态生成的代码运行在同一地址空间,即应用程序对应的进程空间,动态生成的代码位于代码生成区域(code generate area,cga),这意味着代码生成区域所在的内存区间需要至少同时具备写(w)和执行(x)权限,也即该内存区间即支持写入动态代码(即动态代码的生成),又支持执行动态生成的代码。但如此一来,使得恶意代码具有了非法写入并执行的可能,这将大大降低该内存区间的安全性。
技术实现要素:
3.鉴于上述问题,提出了本发明实施例以便提供一种克服上述问题或者至少部分地解决上述问题的内存管理方法,以解决动态代码生成过程中,代码生成区域对应的内存区间因同时具有写权限和执行权限,导致该内存区间安全性较低的问题。
4.相应的,本发明实施例还提供了一种电子设备以及一种存储介质,用以保证上述方法的实现及应用。
5.为了解决上述问题,本发明实施例公开了一种内存管理方法,应用于电子设备,所述电子设备中包括目标线程、操作系统以及中央处理器;所述方法包括:
6.所述目标线程触发操作系统或中央处理器启动tlb的填写,其中,所述目标线程为所述中央处理器上当前运行的线程;
7.所述操作系统或所述中央处理器确定所述目标线程所需的内存区域对应的页表项是否同时具有写权限和执行权限;
8.在所述页表项同时具有所述写权限和所述执行权限的情况下,所述操作系统或所述中央处理器确定所述页表项所指示的所述内存区域同时具有动态代码生成需求和动态代码执行需求;
9.所述操作系统或所述中央处理器根据所述目标线程的线程描述符中的预设标记位,对所述页表项配置所述预设标记位所指示的操作权限,并将配置操作权限后的所述页表项作为所述目标线程对应的tlb表项写入所述tlb中,以使所述目标线程仅能以所述tlb表项中配置的操作权限访问所述tlb表项所指示的内存区域;
10.其中,所述预设标记位用于指定对应线程对所需内存区域仅具有所述写权限和所述执行权限中的一种操作权限,所述目标线程包括同一应用程序进程中的动态代码生成线程和动态代码执行线程中的至少一种,所述动态代码生成线程的预设标记位与所述动态代
码执行线程的预设标记位被配置为不同标记。
11.可选地,所述方法还包括:
12.当一个线程的内存访问请求触发缺页异常时,若触发缺页的内存区域同时具有所述写权限和所述执行权限,且触发缺页的操作与所述线程的所述预设标记位的标记所指示的操作权限不匹配,则所述操作系统或所述中央处理器确定触发缺页的所述操作为非允许的异常操作;
13.所述操作系统或所述中央处理器执行所述非允许的异常操作所对应的预设异常处理操作。
14.可选地,在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,还包括:
15.在所述操作系统内核的线程描述符中定义所述预设标记位,并声明所述预设标记位用于指示对应线程对同时具有写权限和执行权限的页表项仅具有所述写权限和所述执行权限中的一种。
16.可选地,在所述中央处理器启动tlb的填写的情况下,在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,还包括:
17.在所述中央处理器的微码中配置预设寄存器,并配置所述预设寄存器的第一预设字段用于指示在tlb填写时,是否对同时具有写权限和执行权限的页表项调整写入tlb的操作权限,以及配置所述预设寄存器的第二预设字段用于指示在填写tlb时,当所述第一预设字段使能时,根据当前运行线程的预设标记位所指示的操作权限,对同时具有写权限和执行权限的页表项进行操作权限的配置。
18.可选地,所述方法还包括:
19.在所述动态代码生成线程与所述动态代码执行线程之间进行线程上下文切换时,所述操作系统根据切换后的线程的预设标记位,将所述预设寄存器的所述第一预设字段配置为使能,将所述第二预设字段配置为所述预设标记位的值。
20.可选地,在所述中央处理器启动tlb的填写的情况下,所述操作系统或所述中央处理器根据所述目标线程的线程描述符中的预设标记位,对所述页表项配置所述预设标记位所指示的操作权限,包括:
21.所述中央处理器读取所述预设寄存器;
22.当所述预设寄存器的所述第一预设字段使能时,所述中央处理器对所述页表项配置所述第二预设字段的值所指示的操作权限。
23.可选地,在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,还包括:
24.所述应用程序进程创建所述动态代码生成线程;
25.所述动态代码生成线程通过系统调用,将所述动态代码生成线程的预设标记位配置为指示仅能够使用写权限的第一标记。
26.可选地,在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,还包括:
27.所述应用程序进程创建所述动态代码执行线程;
28.所述动态代码执行线程通过系统调用,将所述动态代码执行线程的预设标记位配
置为指示仅能够使用执行权限的第二标记。
29.可选地,所述系统调用被配置为在一个线程的生命周期中只允许被所述线程调用一次,以使所述线程在所述生命周期内只允许配置一次所述预设标记位。
30.可选地,所述目标线程触发操作系统或中央处理器启动tlb的填写,包括:
31.所述目标线程发出内存访问请求,触发所述操作系统或所述中央处理器处理所述请求;
32.所述操作系统或所述中央处理器响应于所述请求产生tlb未命中时,启动tlb的填写。
33.可选地,所述动态代码生成线程包括即时编译器线程,所述动态代码执行线程包括解释器线程。
34.本发明实施例还公开了一种电子设备,包括有存储器、以及一个或者一个以上的程序,其中一个或者一个以上程序存储于存储器中,且经配置以由一个或者一个以上的处理器执行所述一个或者一个以上的程序,所述程序包含用于进行以下操作的指令:
35.目标线程触发操作系统或中央处理器启动tlb的填写,其中,所述目标线程为所述中央处理器上当前运行的线程;
36.所述操作系统或所述中央处理器确定所述目标线程所需的内存区域对应的页表项是否同时具有写权限和执行权限;
37.在所述页表项同时具有所述写权限和所述执行权限的情况下,所述操作系统或所述中央处理器确定所述页表项所指示的所述内存区域同时具有动态代码生成需求和动态代码执行需求;
38.所述操作系统或所述中央处理器根据所述目标线程的线程描述符中的预设标记位,对所述页表项配置所述预设标记位所指示的操作权限,并将配置操作权限后的所述页表项作为所述目标线程对应的tlb表项写入所述tlb中,以使所述目标线程仅能以所述tlb表项中配置的操作权限访问所述tlb表项所指示的内存区域;
39.其中,所述预设标记位用于指定对应线程对所需内存区域仅具有所述写权限和所述执行权限中的一种操作权限,所述目标线程包括同一应用程序进程中的动态代码生成线程和动态代码执行线程中的至少一种,所述动态代码生成线程的预设标记位与所述动态代码执行线程的预设标记位被配置为不同标记。
40.本发明实施例还公开了一种内存管理装置,所述装置包括:
41.第一确定模块,用于在目标线程触发操作系统或中央处理器启动tlb的填写的情况下,确定所述目标线程所需的内存区域对应的页表项是否同时具有写权限和执行权限;其中,所述目标线程为所述中央处理器上当前运行的线程;
42.第二确定模块,用于在所述页表项同时具有所述写权限和所述执行权限的情况下,确定所述页表项所指示的所述内存区域同时具有动态代码生成需求和动态代码执行需求;
43.第一配置模块,用于根据所述目标线程的线程描述符中的预设标记位,对所述页表项配置所述预设标记位所指示的操作权限,并将配置操作权限后的所述页表项作为所述目标线程对应的tlb表项写入所述tlb中,以使所述目标线程仅能以所述tlb表项中配置的操作权限访问所述tlb表项所指示的内存区域;
44.其中,所述预设标记位用于指定对应线程对所需内存区域仅具有所述写权限和所述执行权限中的一种操作权限,所述目标线程包括同一应用程序进程中的动态代码生成线程和动态代码执行线程中的至少一种,所述动态代码生成线程的预设标记位与所述动态代码执行线程的预设标记位被配置为不同标记。
45.可选地,所述装置还包括:
46.第三确定模块,用于当一个线程的内存访问请求触发缺页异常时,若触发缺页的内存区域同时具有所述写权限和所述执行权限,且触发缺页的操作与所述线程的所述预设标记位的标记所指示的操作权限不匹配,则确定触发缺页的所述操作为非允许的异常操作;
47.执行模块,用于执行所述非允许的异常操作所对应的预设异常处理操作。
48.可选地,所述装置还包括:
49.定义模块,用于在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,在所述操作系统内核的线程描述符中定义所述预设标记位,并声明所述预设标记位用于指示对应线程对同时具有写权限和执行权限的页表项仅具有所述写权限和所述执行权限中的一种。
50.可选地,所述装置还包括:
51.第二配置模块,用于在所述中央处理器启动tlb的填写的情况下,在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,在所述中央处理器的微码中配置预设寄存器,并配置所述预设寄存器的第一预设字段用于指示在tlb填写时,是否对同时具有写权限和执行权限的页表项调整写入tlb的操作权限,以及配置所述预设寄存器的第二预设字段用于指示在填写tlb时,当所述第一预设字段使能时,根据当前运行线程的预设标记位所指示的操作权限,对同时具有写权限和执行权限的页表项进行操作权限的配置。
52.可选地,所述装置还包括:
53.第三配置模块,用于在所述动态代码生成线程与所述动态代码执行线程之间进行线程上下文切换时,根据切换后的线程的预设标记位,将所述预设寄存器的所述第一预设字段配置为使能,将所述第二预设字段配置为所述预设标记位的值。
54.可选地,在所述第一配置模块,具体用于:
55.所述中央处理器启动tlb的填写的情况下,读取所述预设寄存器;
56.当所述预设寄存器的所述第一预设字段使能时,对所述页表项配置所述第二预设字段的值所指示的操作权限。
57.可选地,所述装置还包括:
58.第一创建模块,用于在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,创建所述动态代码生成线程;
59.第四配置模块,用于通过系统调用,将所述动态代码生成线程的预设标记位配置为指示仅能够使用写权限的第一标记。
60.可选地,所述装置还包括:
61.第二创建模块,用于在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,创建所述动态代码执行线程;
62.第五配置模块,用于通过系统调用,将所述动态代码执行线程的预设标记位配置
为指示仅能够使用执行权限的第二标记。
63.可选地,所述系统调用被配置为在一个线程的生命周期中只允许被所述线程调用一次,以使所述线程在所述生命周期内只允许配置一次所述预设标记位。
64.可选地,所述装置还包括:
65.触发模块,用于通过所述目标线程发出内存访问请求,触发所述操作系统或所述中央处理器处理所述请求;
66.启动模块,用于响应于所述请求产生tlb未命中时,启动tlb的填写。
67.可选地,所述动态代码生成线程包括即时编译器线程,所述动态代码执行线程包括解释器线程。
68.本发明实施例还公开了一种可读存储介质,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行如上所述的内存管理方法。
69.本发明实施例包括以下优点:
70.在本发明实施例中,当目标线程触发操作系统或中央处理器启动tlb填写时,操作系统或中央处理器首先可以确定目标线程所需内存区域对应的页表项是否同时具有写权限和执行权限,若是,则可以确定目标线程所需的内存区域同时具有动态代码生成需求和动态代码执行需求,进而可以对该页表项配置目标线程的线程描述符中的预设标记位所指示的操作权限,并作为目标线程对应的一个tlb表项写入目标线程所在进程的tlb中,如此,可使目标线程在当前处理器上只能够以预设标记位所指示的权限访问该tlb表项所指示的内存。对于同一应用程序进程中的动态代码生成线程和动态代码执行线程,可以通过预设标记位的不同标记,对同一内存配置不同的操作权限,可使动态代码生成线程对动态代码生成区域对应内存仅具有写权限,使动态代码执行线程对动态代码生成区域对应内存仅具有执行权限,从而提高了动态代码所在内存区域的安全性。
附图说明
71.图1是相关技术的一种没有实现w xor x的方案o的示意图;
72.图2是相关技术的一种实现w xor x的方案a的示意图;
73.图3是相关技术的一种实现w xor x的方案b的示意图;
74.图4是本发明的一种内存管理方法的步骤流程图;
75.图5是本发明的另一种内存管理方法的步骤流程图;
76.图6是本发明的一种实现w xor x的方案d的示意图;
77.图7是本发明的一种内存管理装置的结构框图;
78.图8是根据一示例性实施例示出的一种用于配置内存权限的电子设备的结构框图。
具体实施方式
79.为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
80.在对本发明实施例进行详细说明之前,首先对相关技术的发展进行进一步介绍。
81.针对互联网早期的盛行的缓冲区溢出攻击,计算机厂商通过在处理器的内存管理
单元(memory management unit,mmu)中引入不可执行(no execute,nx)权限,将应用程序运行栈的权限由读(r)+写(w)+执行(x)变为r+w,即使攻击者通过缓冲区溢出向栈注入了恶意代码,这些注入的代码也会因为缺乏执行(x)权限而在尝试执行时触发异常,操作系统因此介入,阻止攻击进一步扩散。这一实践意味着保证内存区域的w xor x,即内存区域不能同时获得写(w)权限和执行(x)权限,可以极大降低恶意代码注入的风险。
82.网页开发中使用的javascript这类动态语言,早期是在网页浏览器中通过解释器解释执行的(即不会创建新的可执行的代码),为了提升javascript的执行效率,引入了jit编译器,作为运行时的一部分,解释器在解释执行的过程中会统计javascript源程序的各个代码片段在解释执行时的性能数据,将部分执行频度高的代码片段通过jit编译器直接转化为二进制代码,写入代码生成区域中(即动态代码生成),后将控制流转移到动态生成代码所在的代码生成区域处执行,一旦动态生成的代码执行完毕或者满足其他条件,控制流将回到解释器继续执行,如此往复,解释器根据运行时的统计信息不断调整动态生成代码,控制流不断在解释器与动态生成的代码间来回切换。
83.参照图1,示出了没有实现w xor x的方案o,其中:
84.在最上层,外层的方框表示进程,即单个进程中的单个线程对cga同时具有写(w)和执行(x)的权限。图示中,w or x,表示同一时刻,对一个内存区域的所有访问请求,可以是w请求和x请求中任意一种;而wxor x,则表示在同一时刻,单个实体对一个内存区域的访问请求,只能是w请求或x请求。
85.中间层,表示具有特权的操作系统(operating system,os)内核,以及内核中针对该进程维护的页表,页表的其中的一个页表项描述的是cga的映射关系,包括虚拟地址、物理地址,长度(即cga的内存大小)和权限。
86.最下层,表示处理器(如中央处理器cpu,central processing unit)上的tlb中包含的该cga的页表项信息,其中,tlb(translation lookaside buffer,转换检测缓冲区)可以理解为处理器上的一种专门用来缓存页表项的高速缓存,os内核维护的cga的映射与权限信息的页表,需要以tlb项的方式被处理器感知,进而完成虚拟地址到物理地址的转换,以及相应的权限检查。
87.在方案o中,进程中的不同线程对cga同时具有写(w)和执行(x)的权限,因此,无法实现w xor x。
88.上述jit编译器引入的代码生成区域同时具有写(w)权限和执行(x)权限,违反了w xor x的原则,恶意的javascript代码可以利用浏览器或jit编译器中的漏洞,向代码生成区域中注入并执行任意代码,极大伤害了浏览器的安全性。
89.业界与学术界对此问题的解决方案包括如下两种:
90.方案a:mozilla作为业内主流的网页浏览器开发商,在其浏览器firefox v46中引入w xor x支持,即在jit编译器线程在生成代码前,通过系统调用将代码生成区域的执行(x)权限去除,写(w)权限恢复,在代码生成后、跳转到代码生成区域开始执行前,通过系统调用将代码生成区域的写(w)权限去除,执行(x)权限恢复,之后解释器线程对动态生成的代码进行解释执行。也即通过限制写(w)权限和执行(x)权限的作用时间,使得同一时刻,写(w)权限和执行(x)权限仅有一个可使用。
91.在方案a中,jit编译器线程和解释器线程同属于应用程序(例如浏览器)进程。
92.参照图2,示出了实现w xor x的方案a的三个阶段,其中:
93.在t1阶段,表示方案a在实施x限制的状态;
94.在t2阶段,表示a方案使用mprotect系统调用完成x-》w的权限转换后的状态;
95.在t3阶段,表示a方案完成mprotect后,实施w限制的状态。
96.方案b:学界提出的jitsafe技术,是通过为jit编译器创建独立地址空间的方式解决的,即代码生成区域在jit编译器进程中与应用程序进程(解释器所在进程)中通过共享内存实现写(w)权限与执行(x)权限的分离,代码生成区域在jit编译器进程中只有写(x)权限,而在解释器中则只有执行(x)权限。当解释器需要jit编译器进程生成代码时,通过ipc(inter-process communication,进程间通信)/rpc(remote procedure call,远程过程调用)通知jit编译器进程,jit编译器进程通过ipc/rpc以及共享内存传递的信息生成二进制代码,完成后,再通过ipc/rpc通知解释器将控制流转移到代码生成区域来执行动态生成的代码。
97.参照图3,示出了实现w xor x的方案b,在方案b中,将jit编译器创建为独立于应用程序进程(解释器所在进程)之外的进程,从而通过设置不同进程对共享内存区域具有不同权限,来实现共享内存区域的w xor x。
98.方案a的缺点在于:
99.1、安全性不足。虽然实现了w xor x,但是仍然需要mprotect这类系统调用来修改内存区域的权限,即jit编译器在事实上仍然对代码生成区域拥有写(w)权限和执行(x)权限,只是通过系统调用对执行(x)权限加以限制,但是,系统调用仍然存在被恶意传参的风险,进而通过恶意传参是的jit编译器具有了执行(x)权限,导致代码生成区域的安全性降低。
100.2、性能开销大。每次动态生成代码,都需要两次mprotect系统调用,而系统调用的开销较大。
101.方案b的虽然实现了更为严格的w xor x,但是仍具有以下缺点:
102.1、性能开销依然很大。由于为jit编译器创建了独立的进程,并使用共享内存,因此,每次动态生成代码都需要两次ipc/rpc以及相关的进程上下文切换(jit编译器进程与应用程序进程的上下文切换),不同进程有不同的地址空间,因此,进程的切换需要跨地址空间,导致性能开销较大。
103.基于上述相关技术,本发明在操作系统层面提出一种以线程为粒度实现写(w)权限与执行(x)权限分离的设计,可供网页浏览器和虚拟机等应用实现安全高效的jit编译服务。
104.本发明实施例的核心构思之一在于,在操作系统中的线程描述符中引入一个标记位m,表明该线程需要访问同时具有写(w)权限和执行(x)权限的内存页时,仅能够使用其中一种权限,该标记位m在线程创建后仅可修改一次,即修改为该线程所需的权限,一旦修改完毕,后续修改该标记位的请求将被操作系统视为非法操作,从而使得一个线程仅对某个内存区域具有写(w)权限和执行(x)权限中的一种权限。当一个线程访问内存的时候,操作系统增加对该标记位的检验,以确定该线程对某个内存区域的权限。
105.参照图4,示出了本发明的一种内存管理方法的步骤流程图,该方法可以应用于电子设备,所述电子设备中包括目标线程、操作系统以及中央处理器,以对内存权限进行配
置。具体可以包括如下步骤:
106.步骤101:目标线程触发操作系统或中央处理器启动tlb的填写,其中,目标线程为中央处理器上当前运行的线程,目标线程包括同一应用程序进程中的动态代码生成线程和动态代码执行线程中的至少一种。
107.针对现有的软硬件平台,本发明实施例所提供的设计可应用于如下两种平台:
108.1、中央处理器支持软件(即操作系统)管理mmu(内存管理单元)。
109.其中,本发明实施例可以应用在特定处理器架构中,所述处理器架构可以包括mmu支持独立配置写(w)权限和执行(x)权限的处理器架构,如大部分mips(microprocessor without interlocked piped stages,无内部互锁流水级的微处理器)、alpha等架构。所述从处理器架构还可以包括不支持独立配置执行(x)权限的处理器架构,如不支持xi(execute inhibit,即不可执行)配置的处理器架构。
110.mmu是一种负责处理内存访问请求的计算机硬件,它的主要功能包括逻辑地址(或者说虚拟地址)到物理地址的转换(即虚拟内存管理)。当需要访问内存中的一个数据时,可以通过这个数据的逻辑地址查找页表,一旦在页表中找到(即命中hit),就通过找到的物理地址寻址到内存中的数据。如果页表中没有找到(即未命中miss),表示页表中没有建立这个数据的逻辑地址到物理地址的映射,进而可通过缺页异常,建立这个映射关系的页表项。
111.为了加快访问内存的速度,减少重复的页表查找,引入了tlb来缓存最近使用过的页表项,tlb实质上就是页表的一部分。
112.本发明实施例中,在中央处理器支持软件管理mmu的场景下,由操作系统负责进行tlb的填写,即软件填写tlb。
113.2、中央处理器不支持软件管理mmu。
114.本发明实施例中,在中央处理器不支持软件管理mmu的场景下,由中央处理器负责进行tlb的填写,即硬件填写tlb。
115.在本发明实施例中,可以对每个进程都维护相应的tlb,并对同一进程中的每个线程都维护相应的tlb表项。当应用程序进程中的目标线程访问内存时,中央处理器根据访存地址查找tlb,当找不到匹配的tlb表项时,触发中央处理器或者操作系统填写目标线程对应的tlb项。具体的,可以在中央处理器支持软件管理mmu的情况下触发操作系统填写目标线程对应的tlb项,在中央处理器不支持软件管理mmu的情况下,触发中央处理器填写目标线程对应的tlb项。
116.另外,在本发明实施例中,可以将用于实现动态代码生成的功能模块和用于实现动态代码执行的功能模块分别创建为同一应用程序进程(例如浏览器进程)中的两个不同的线程,目标线程可以包括动态代码生成线程和/或动态代码执行线程,也即对于同一应用程序进程中动态代码生成线程和/或动态代码执行线程,可以在访问内存时,触发操作系统或中央处理器进行tlb的填写,从而生成该线程对应的一个tlb表项。
117.其中,动态代码生成线程例如可以是即时编译器线程,动态代码执行线程例如可以是解释器线程。
118.步骤102:操作系统或中央处理器确定目标线程所需的内存区域对应的页表项是否同时具有写权限和执行权限。
119.在本步骤中,操作系统或中央处理器需要从目标线程所在进程对应的页表中,确
定目标线程所需内存区域对应的页表项。
120.当目标线程具体为即时编译器线程/解释器线程时,目标线程所需的内存区域即为上文提及的cga。
121.步骤103:在该页表项同时具有写权限和执行权限的情况下,操作系统或中央处理器确定该页表项所指示的内存区域同时具有动态代码生成需求和动态代码执行需求。
122.若一个页表项(如cga对应的页表项)同时具有写权限和执行权限,则表示该页表项所指示的内存区域同时具有动态代码生成需求和动态代码执行需求,也即该内存区域至少需要在某些时刻能够向其中写入代码,而在另一些时刻能够执行其中的代码。如cga需要在即时编译时能够向其中写入代码,并且在解释执行时能够执行其中的代码。
123.步骤104:操作系统或中央处理器根据目标线程的线程描述符中的预设标记位,对该页表项配置预设标记位所指示的操作权限,并将配置操作权限后的页表项作为目标线程对应的tlb表项写入tlb中,以使目标线程仅能以该tlb表项中配置的操作权限访问该tlb表项所指示的内存区域,其中,预设标记位用于指定对应线程对所需内存区域仅具有写权限和执行权限中的一种操作权限,动态代码生成线程的预设标记位与动态代码执行线程的预设标记位被配置为不同标记。
124.对于当前运行的目标线程,操作系统或中央处理器可以根据目标线程的线程描述符中的预设标记位的标记,以确定目标线程对于同时具有写权限和执行权限页表项所指示的物理内存中的数据具有什么样的操作权限。
125.当目标线程为动态代码生成线程时,预设标记位的标记可以设置为指示写权限的标记。
126.当目标线程为动态代码执行线程时,预设标记位的标记可以设置为指示执行权限的标记。
127.操作系统或中央处理器可以对目标线程对应的页表项,配置目标线程的预设标记位所指示的操作权限,并将配置结果填入tlb中。此后,目标线程在当前处理器上只能够以预设标记位所指示的操作权限访问该tlb表项所指示的物理内存(或者说物理地址)。
128.在该预设标记位的标记指示写权限的情况下,可使目标线程对该tlb表项所指示的内存仅具有写权限,也即目标线程仅能够向该tlb表项所指示的内存中写入数据。
129.在该预设标记位的标记指示执行权限的情况下,可使目标线程对该tlb表项所指示的内存仅具有执行权限,也即目标线程仅能够对该tlb表项所指示的内存中的数据进行执行。
130.对于同一应用程序进程中的即时编译器线程和解释器线程,可以将即时编译器线程的预设标记位与解释器线程的预设标记位配置为不同标记,以使即时编译器线程和解释器线程对cga具有不同的权限。根据实际需要,可以将即时编译器线程的预设标记位配置为写权限,将解释器线程的预设标记位配置为执行权限,如此,可使即时编译器对cga仅具有写权限,解释器对cga仅具有执行权限,从而实现了cga的w xor x。
131.在本发明实施例中,当目标线程触发操作系统或中央处理器启动tlb填写时,操作系统或中央处理器首先可以确定目标线程所需内存区域对应的页表项是否同时具有写权限和执行权限,若是,则可以确定目标线程所需的内存区域同时具有动态代码生成需求和动态代码执行需求,进而可以对该页表项配置目标线程的线程描述符中的预设标记位所指
示的操作权限,并作为目标线程对应的一个tlb表项写入目标线程所在进程的tlb中,如此,可使目标线程在当前处理器上只能够以预设标记位所指示的权限访问该tlb表项所指示的内存。对于同一应用程序进程中的动态代码生成线程和动态代码执行线程,可以通过预设标记位的不同标记,对同一内存配置不同的操作权限,可使动态代码生成线程对动态代码生成区域对应内存仅具有写权限,使动态代码执行线程对动态代码生成区域对应内存仅具有执行权限,从而提高了动态代码所在内存区域的安全性。
132.图5示出了本发明的另一种内存管理方法的步骤流程图,参照图5,还可以包括以下步骤:
133.步骤201:在操作系统内核的线程描述符中定义预设标记位,并声明预设标记位用于指示对应线程对同时具有写权限和执行权限的页表项仅具有写权限和执行权限中的一种。
134.在本发明实施例中,可以在操作系统内核中的线程描述符中引入一个预设标记位m,表明该线程遇到同时需要写权限和执行权限的内存页时,仅能够使用一种权限,即写权限和执行权限二者取其一,该预设标记位m配置为在线程创建后的整个生命周期内仅可修改一次,即修改为该线程所需的权限,一旦修改完毕,后续修改该预设标记位m的请求则会被操作系统内核视为非法操作,将导致操作系统进行特别处理,例如退出线程。示例性地,本步骤可以通过中央处理器执行,或者由电子设备中的其他部件执行。
135.步骤202:应用程序进程动态代码生成线程;应用程序进程创建动态代码执行线程。
136.对于一个需要动态代码生成以及执行动态生成的代码的应用程序进程,例如基于javascript动态语言的浏览器程序进程,该应用程序进程可以在需要生成动态代码时创建动态代码生成线程,而在需要执行动态生成的代码时创建动态代码执行线程。
137.在一些实施例中,应用程序进程可以为用于实现动态代码生成的即时编译器创建即时编译器线程;应用程序进程可以为用于执行动态生成的代码的解释器创建解释器线程。
138.步骤203:应用程序进程对动态代码生成线程和动态代码执行线程进行同步操作。
139.在本发明实施例中,为防止多个线程对同一内存区间进行操作而引发错误,应用程序进程可以通过调用相关的标准线程接口等方式,对动态代码生成线程和动态代码执行线程进行同步操作,以使动态代码生成线程和动态代码执行线程对同一内存区间(即cga)进行的操作,不会造成该内存区间中的数据发生错误。
140.步骤204:动态代码生成线程通过系统调用,将动态代码生成线程的预设标记位配置为指示仅能够使用写权限的第一标记。
141.在一些实施例中,为避免线程被操控而修改操作权限,该系统调用可以被配置为在一个线程的生命周期中只允许被线程调用一次,以使线程在生命周期内只允许配置一次预设标记位。
142.预设标记位m仅支持在线程创建后修改一次,因此,动态代码生成线程在刚刚创建后,还未执行任何代码之前,就可以通过系统调用将动态代码生成线程的预设标记位m置为第一标记w,其中,第一标记w表示写权限。
143.如此,当该动态代码生成线程遇到同时需要写权限和执行权限的内存页时,仅能
够使用写权限来访问该内存页。
144.步骤205:动态代码执行线程通过系统调用,将动态代码执行线程的预设标记位配置为指示仅能够使用执行权限的第二标记。
145.预设标记位m仅支持在线程创建后修改一次,因此,动态代码执行线程在刚刚创建后,还未执行任何代码之前,就可以通过系统调用将动态代码执行线程的预设标记位m置为第二标记x,其中,第二标记x表示执行权限。
146.如此,当该动态代码执行线程遇到同时需要写权限和执行权限的内存页时,仅能够使用执行权限来访问该内存页。
147.步骤206:目标线程触发操作系统或中央处理器启动tlb的填写。
148.具体地,目标线程发出内存访问请求,触发操作系统或处理器处理该请求;操作系统或中央处理器响应于该请求产生tlb未命中时,启动tlb的填写。
149.在动态代码生成线程/动态代码执行线程对预设标记位配置完毕后,动态代码生成线程/动态代码执行线程可以请求访问内存,对于支持操作系统管理mmu的情况,可以由操作系统接管该内存访问请求,对于不支持操作系统管理mmu的情况,可以由中央处理器接管该内存访问请求。
150.操作系统或中央处理器会根据所要访问的内存区域的虚拟地址,查找当前的tlb,当tlb中没有该虚拟地址对应tlb表项时,会发生tlb未命中(即tlb miss),从而会触发操作系统或中央处理器启动动态代码生成线程/动态代码执行线程所在的应用程序进程对应的tlb的填写。
151.步骤207:操作系统或中央处理器确定目标线程所需的内存区域对应的页表项是否同时具有写权限和执行权限。
152.步骤208:在该页表项同时具有写权限和执行权限的情况下,操作系统或中央处理器确定该页表项所指示的内存区域同时具有动态代码生成需求和动态代码执行需求。
153.步骤207-208可参照上述步骤102-103,在此不再赘述。
154.步骤209:操作系统或中央处理器根据目标线程的线程描述符中的预设标记位,对该页表项配置预设标记位所指示的操作权限,并将配置操作权限后的页表项作为目标线程对应的tlb表项写入tlb中,以使目标线程仅能以该tlb表项中配置的操作权限访问该tlb表项所指示的内存区域。
155.在中央处理器启动tlb的填写的情况下,在步骤207实现之前,该方法还可以包括以下步骤:
156.s1:在中央处理器的微码中配置预设寄存器,并配置预设寄存器的第一预设字段用于指示在tlb填写时,是否对同时具有写权限和执行权限的页表项调整写入tlb的操作权限,以及配置预设寄存器的第二预设字段用于指示在填写tlb时,当第一预设字段使能时,根据当前运行线程的预设标记位所指示的操作权限,对同时具有写权限和执行权限的页表项进行操作权限的配置。
157.在本发明实施例中,对于中央处理器进行tlb填写的场景,可以事先在中央处理器的微码中定义一个预设寄存器,其中,通过预设寄存器的第一预设字段me表示在tlb填写时,对于同时具有写权限和执行权限的页表项,是否修改该页表项写入tlb的操作权限,是则me使能;通过预设寄存器的第二预设字段mc表示当第一预设字段me使能时,填写tlb时可
将该页表项的操作权限修改为当前运行线程的预设标记位所指示的操作权限。
158.第一预设字段me和第二预设字段mc被配置为只能由特权态(如内核态)指令进行访问与修改,不能由用户态指令访问和修改。
159.示例性地,本步骤可以通过中央处理器执行,或者由电子设备中的其他部件执行。中央处理器可以通过读取该预设寄存器的值,确定是否需要限制对某个同时具有写权限和执行权限的页表项的操作权限,并获知需要对其保留什么操作权限。
160.在完成步骤s1之后的过程中,还可以进行以下步骤:
161.s2:在动态代码生成线程与动态代码执行线程之间进行线程上下文切换时,操作系统根据切换后的线程的预设标记位,将预设寄存器的第一预设字段配置为使能,将第二预设字段配置为预设标记位的值。
162.当切换为动态代码生成线程时,操作系统可以确定动态代码生成线程的预设标记位为指示写权限的第一标记,进而可以将预设寄存器的第一预设字段配置为使能,并将第二预设字段配置为第一标记。
163.当切换为动态代码执行线程时,操作系统可以确定动态代码执行线程的预设标记位为指示执行权限的第二标记,进而可以将预设寄存器的第一预设字段配置为非使能,并将第二预设字段配置为第二标记。
164.相应地,在步骤209中,中央处理器可以通过以下步骤配置操作权限,包括:
165.中央处理器读取预设寄存器;
166.当预设寄存器的第一预设字段使能时,中央处理器对该页表项配置所述第二预设字段的值所指示的操作权限。
167.其中,中央处理器在填写tlb时,当me使能时,直接依据预设寄存器中mc的值,对同时具有写与执行权限的页表项选择写与执行权限之一填入tlb,而不需要操作系统干预。
168.步骤210:目标线程请求对所需的内存区域进行操作。
169.目标线程为即时编译器线程时,可以根据cga的虚拟地址,请求对cga进行写操作。
170.目标线程为解释器线程时,可以根据cga的虚拟地址,请求对cga进行执行操作。
171.步骤211:操作系统或中央处理器响应于操作请求,从tlb中查找虚拟地址对应的tlb表项。
172.操作系统或中央处理器响应于该操作请求,可以从目标线程所在进程对应的tlb中查找该虚拟地址对应的tlb表项。
173.步骤212:若该tlb表项所配置的操作权限与该操作请求所指示的操作相匹配,则中央处理器对内存区域执行操作请求所指示的操作。
174.在查找到的情况下(即tlb命中),操作系统或中央处理器检查该tlb表项所配置的操作权限与该操作请求所指示的操作是否相匹配。该操作请求为写请求,所指示的操作对应为写操作时,检查该tlb表项所配置的操作权限是否为写权限,若是,则中央处理器对该tlb表项所指示的cga进行写操作,从而向cga中写入动态代码。该操作请求为执行请求,所指示的操作对应为执行操作时,检查该tlb表项所配置的操作权限是否为执行权限,若是,则中央处理器对该tlb表项所指示的cga进行执行操作,从而对cga中写入的动态代码进行执行。
175.若该tlb表项所配置的操作权限与该操作请求所指示的操作不匹配,则无法执行
所请求的操作。
176.此外,在本发明实施例中,当进行缺页处理时,需要同时依据线程的预设标记位以及发生缺页的页表项的权限配置,对线程的非法访存请求进行判断和处理。
177.具体地,缺页处理可以包括以下步骤:
178.当一个线程的内存访问请求触发缺页异常时,若触发缺页的内存区域同时具有写权限和执行权限,且触发缺页的操作与线程的预设标记位的标记所指示的操作权限不匹配,则操作系统或处理器确定触发缺页的操作为非允许的异常操作;
179.操作系统或处理器执行非允许的异常操作所对应的预设异常处理操作。
180.在本发明实施例中,在缺页处理中(page fault handling),需要增加对当前线程的预设标记位配置的检查。
181.具体地,以目标线程引起缺页为例,当目标线程请求对cga进行操作时,若在tlb中未命中,页表中也未命中,则产生缺页异常,此时,可以检查导致缺页的行为(如写操作导致的缺页)与当前目标线程的预设标记位配置(如预设标记位指定执行权限)是否一致,若不一致,则判定引起该缺页异常的是非法操作,需要特别处理。
182.对于由上述非法操作引起的缺页异常,可以执行预设异常处理操作,包括退出目标线程等操作。
183.在本发明实施例中,对于支持软件管理的mmu,且mmu支持独立配置写/执行权限的处理器,本发明提供的方案可剥离即时编译器线程的执行权限,以及剥离解释器线程的写权限,从而实现动态代码生成区域的w xor x。
184.而对于不支持配置执行权限的处理器,如某些mips处理器并不支持xi(execute inhibit,即不可执行),虽然无法剥离即时编译器线程的执行权限,但是仍可以剥离解释器线程的写权限,从而实现对动态代码生成区域的写保护,即无法通过解释器向动态代码生成区域写入异常代码。
185.此外,对于不支持软件管理mmu的情况,虽然不能在操作系统中通过软件实现权限分离,仍然可以使用修改处理器的微码等手段,按照同样的思路在tlb的写入阶段实现写(w)权限与执行(x)权限的剥离。
186.参照图6,示出了本发明中实现w xor x的方案d,本发明提供的方案d中使用单进程+多线线程的设计,即在单个进程的多个线程间实现写(w)权限与执行(x)权限的分离。
187.对比方案d和相关技术中的方案o、方案a和方案b,可以发现如下的特征:
188.相比方案o和方案a的单个线程,以及方案b的多个进程,方案d将单个进程中的单个线程分离成两个独立的线程,保证二者分别仅仅需要写或者执行权限中的一个;
189.方案o、方案a和方案b中cga的tlb表项与cga的页表项的内容都是一样的,而方案d中同时具有写和执行权限的页表项内容,在即时编译器线程中经预设标记位=w有且仅有w权限进入tlb,而在解释器线程中经预设标记位=x有且仅有x权限进入tlb,这样的分离操作,保证了即时编译器线程无法获得对cga的执行权限,解释器线程无法获得对cga的写权限。
190.本发明提供的方案d的核心在于:
191.将同时需要执行权限和写权限的单个线程,分离为两个分别只需要执行权限和写权限的线程;
192.通过修改os内核代码或者修改os内核代码+修改硬件的方式,将原来的把同时具有写和执行权限的页表项直接写入tlb的操作,改为根据需求仅将同时具有写和执行权限的页表项的写权限或者执行权限写入tlb(二选一)。
193.相关技术中,b方案的核心则是:
194.将同时需要执行和写权限的单个线程,分离为两个分别只需要执行和写权限的进程,通过共享内存实现写与执行权限的分离。
195.由于是两个进程,因此两个进程有各自不同的页表项,分别表示两种不同的权限,因此,本发明提供的方案d是在tlb层面实现权限的分离,方案b则是在页表项的层面实现权限的分离。
196.在本发明提供的方案d中,即时编译器在事实上对动态代码生成区域仅拥有写权限,即时编译器线程无需通过mprotect等系统调用切换动态代码生成区域的权限,减小了即时编译器的整体攻击面,提高了动态代码生成区域的安全性,并且减少了每次动态生成代码所需的系统调用的开销,从而避免了相关技术中的方案a的缺点。
197.另外,在本发明提供的方案d中,解释器和即时编译器均以线程形式运行,解释器线程与即时编译器线程位于同一个进程的地址空间中,不需要额外调用共享内存的api(application programming interface,应用程序编程接口),就可以充分利用同一地址空间自带的内存共享优势,从而避免了相关技术中的方案b的缺点。
198.一般认为单个进程中的所有的内存地址,对该进程包含的所有线程在同一时刻都具有一样的权限,例如线程a和b,对地址m的访问权限都由相应的页表项指定,且结果对线程a和b都是一样的。
199.但是,在本发明中,计算机硬件和操作系统可以提供比上述更强的功能,使得计算机安全领域中的w xor x设计可以在单个进程(的地址空间)内对不同的线程实现,即只需要一个简单tlb表项权限的调整,就能保证一个进程中的所有同时包含w和x权限的地址,在不同线程间只能选择其中一种权限。
200.在本发明实施例中,当目标线程触发操作系统或中央处理器启动tlb填写时,操作系统或中央处理器首先可以确定目标线程所需内存区域对应的页表项是否同时具有写权限和执行权限,若是,则可以确定目标线程所需的内存区域同时具有动态代码生成需求和动态代码执行需求,进而可以对该页表项配置目标线程的线程描述符中的预设标记位所指示的操作权限,并作为目标线程对应的一个tlb表项写入目标线程所在进程的tlb中,如此,可使目标线程在当前处理器上只能够以预设标记位所指示的权限访问该tlb表项所指示的内存。对于同一应用程序进程中的动态代码生成线程和动态代码执行线程,可以通过预设标记位的不同标记,对同一内存配置不同的操作权限,可使动态代码生成线程对动态代码生成区域对应内存仅具有写权限,使动态代码执行线程对动态代码生成区域对应内存仅具有执行权限,从而提高了动态代码所在内存区域的安全性。
201.需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。
202.参照图7,示出了本发明的一种内存管理装置的结构框图,所述装置30包括:
203.第一确定模块301,用于在目标线程触发操作系统或中央处理器启动tlb的填写的情况下,确定所述目标线程所需的内存区域对应的页表项是否同时具有写权限和执行权限;其中,所述目标线程为所述中央处理器上当前运行的线程;
204.第二确定模块302,用于在所述页表项同时具有所述写权限和所述执行权限的情况下,确定所述页表项所指示的所述内存区域同时具有动态代码生成需求和动态代码执行需求;
205.第一配置模块303,用于根据所述目标线程的线程描述符中的预设标记位,对所述页表项配置所述预设标记位所指示的操作权限,并将配置操作权限后的所述页表项作为所述目标线程对应的tlb表项写入所述tlb中,以使所述目标线程仅能以所述tlb表项中配置的操作权限访问所述tlb表项所指示的内存区域;
206.其中,所述预设标记位用于指定对应线程对所需内存区域仅具有所述写权限和所述执行权限中的一种操作权限,所述目标线程包括同一应用程序进程中的动态代码生成线程和动态代码执行线程中的至少一种,所述动态代码生成线程的预设标记位与所述动态代码执行线程的预设标记位被配置为不同标记。
207.可选地,所述装置30还包括:
208.第三确定模块,用于当一个线程的内存访问请求触发缺页异常时,若触发缺页的内存区域同时具有所述写权限和所述执行权限,且触发缺页的操作与所述线程的所述预设标记位的标记所指示的操作权限不匹配,则确定触发缺页的所述操作为非允许的异常操作;
209.执行模块,用于执行所述非允许的异常操作所对应的预设异常处理操作。
210.可选地,所述装置30还包括:
211.定义模块,用于在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,在所述操作系统内核的线程描述符中定义所述预设标记位,并声明所述预设标记位用于指示对应线程对同时具有写权限和执行权限的页表项仅具有所述写权限和所述执行权限中的一种。
212.可选地,所述装置30还包括:
213.第二配置模块,用于在所述中央处理器启动tlb的填写的情况下,在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,在所述中央处理器的微码中配置预设寄存器,并配置所述预设寄存器的第一预设字段用于指示在tlb填写时,是否对同时具有写权限和执行权限的页表项调整写入tlb的操作权限,以及配置所述预设寄存器的第二预设字段用于指示在填写tlb时,当所述第一预设字段使能时,根据当前运行线程的预设标记位所指示的操作权限,对同时具有写权限和执行权限的页表项进行操作权限的配置。
214.可选地,所述装置30还包括:
215.第三配置模块,用于在所述动态代码生成线程与所述动态代码执行线程之间进行线程上下文切换时,根据切换后的线程的预设标记位,将所述预设寄存器的所述第一预设字段配置为使能,将所述第二预设字段配置为所述预设标记位的值。
216.可选地,在所述第一配置模块303,具体用于:
217.所述中央处理器启动tlb的填写的情况下,读取所述预设寄存器;
218.当所述预设寄存器的所述第一预设字段使能时,对所述页表项配置所述第二预设字段的值所指示的操作权限。
219.可选地,所述装置30还包括:
220.第一创建模块,用于在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,创建所述动态代码生成线程;
221.第四配置模块,用于通过系统调用,将所述动态代码生成线程的预设标记位配置为指示仅能够使用写权限的第一标记。
222.可选地,所述装置30还包括:
223.第二创建模块,用于在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,创建所述动态代码执行线程;
224.第五配置模块,用于通过系统调用,将所述动态代码执行线程的预设标记位配置为指示仅能够使用执行权限的第二标记。
225.可选地,所述系统调用被配置为在一个线程的生命周期中只允许被所述线程调用一次,以使所述线程在所述生命周期内只允许配置一次所述预设标记位。
226.可选地,所述装置30还包括:
227.触发模块,用于通过所述目标线程发出内存访问请求,触发所述操作系统或所述中央处理器处理所述请求;
228.启动模块,用于响应于所述请求产生tlb未命中时,启动tlb的填写。
229.可选地,所述动态代码生成线程包括即时编译器线程,所述动态代码执行线程包括解释器线程。
230.本发明实施例提供的装置,当目标线程触发操作系统或中央处理器启动tlb填写时,首先可以确定目标线程所需内存区域对应的页表项是否同时具有写权限和执行权限,若是,则可以确定目标线程所需的内存区域同时具有动态代码生成需求和动态代码执行需求,进而可以对该页表项配置目标线程的线程描述符中的预设标记位所指示的操作权限,并作为目标线程对应的一个tlb表项写入目标线程所在进程的tlb中,如此,可使目标线程在当前处理器上只能够以预设标记位所指示的权限访问该tlb表项所指示的内存。对于同一应用程序进程中的动态代码生成线程和动态代码执行线程,可以通过预设标记位的不同标记,对同一内存配置不同的操作权限,可使动态代码生成线程对动态代码生成区域对应内存仅具有写权限,使动态代码执行线程对动态代码生成区域对应内存仅具有执行权限,从而提高了动态代码所在内存区域的安全性。
231.图8是根据一示例性实施例示出的一种用于配置内存权限的电子设备400的结构框图。例如,电子设备400可以是移动电话,计算机,数字广播终端,消息收发设备,游戏控制台,平板设备,医疗设备,健身设备,个人数字助理等。
232.参照图8,电子设备400可以包括以下一个或多个组件:处理组件402,存储器404,电源组件406,多媒体组件408,音频组件410,输入/输出(i/o)的接口412,传感器组件414,以及通信组件416。
233.处理组件402通常控制电子设备400的整体操作,诸如与显示,电话呼叫,数据通信,相机操作和记录操作相关联的操作。处理元件402可以包括一个或多个处理器420来执行指令,以完成上述的方法的全部或部分步骤。此外,处理组件402可以包括一个或多个模
块,便于处理组件402和其他组件之间的交互。例如,处理部件402可以包括多媒体模块,以方便多媒体组件408和处理组件402之间的交互。
234.存储器404被配置为存储各种类型的数据以支持在设备400的操作。这些数据的示例包括用于在电子设备400上操作的任何应用程序或方法的指令,联系人数据,电话簿数据,消息,图片,视频等。存储器404可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(sram),电可擦除可编程只读存储器(eeprom),可擦除可编程只读存储器(eprom),可编程只读存储器(prom),只读存储器(rom),磁存储器,快闪存储器,磁盘或光盘。
235.电源组件406为电子设备400的各种组件提供电力。电源组件406可以包括电源管理系统,一个或多个电源,及其他与为电子设备400生成、管理和分配电力相关联的组件。
236.多媒体组件408包括在所述电子设备400和用户之间的提供一个输出接口的屏幕。在一些实施例中,屏幕可以包括液晶显示器(lcd)和触摸面板(tp)。如果屏幕包括触摸面板,屏幕可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。所述触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与所述触摸或滑动操作相关的持续时间和压力。在一些实施例中,多媒体组件408包括一个前置摄像头和/或后置摄像头。当电子设备400处于操作模式,如拍摄模式或视频模式时,前置摄像头和/或后置摄像头可以接收外部的多媒体数据。每个前置摄像头和后置摄像头可以是一个固定的光学透镜系统或具有焦距和光学变焦能力。
237.音频组件410被配置为输出和/或输入音频信号。例如,音频组件410包括一个麦克风(mic),当电子设备400处于操作模式,如呼叫模式、记录模式和语音识别模式时,麦克风被配置为接收外部音频信号。所接收的音频信号可以被进一步存储在存储器404或经由通信组件416发送。在一些实施例中,音频组件410还包括一个扬声器,用于输出音频信号。
238.i/o接口412为处理组件402和外围接口模块之间提供接口,上述外围接口模块可以是键盘,点击轮,按钮等。这些按钮可包括但不限于:主页按钮、音量按钮、启动按钮和锁定按钮。
239.传感器组件414包括一个或多个传感器,用于为电子设备400提供各个方面的状态评估。例如,传感器组件414可以检测到设备400的打开/关闭状态,组件的相对定位,例如所述组件为电子设备400的显示器和小键盘,传感器组件414还可以检测电子设备400或电子设备400一个组件的位置改变,用户与电子设备400接触的存在或不存在,电子设备400方位或加速/减速和电子设备400的温度变化。传感器组件414可以包括接近传感器,被配置用来在没有任何的物理接触时检测附近物体的存在。传感器组件414还可以包括光传感器,如cmos或ccd图像传感器,用于在成像应用中使用。在一些实施例中,该传感器组件414还可以包括加速度传感器,陀螺仪传感器,磁传感器,压力传感器或温度传感器。
240.通信组件416被配置为便于电子设备400和其他设备之间有线或无线方式的通信。电子设备400可以接入基于通信标准的无线网络,如wifi,2g或3g,或它们的组合。在一个示例性实施例中,通信组件416经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,所述通信组件416还包括近场通信(nfc)模块,以促进短程通信。例如,在nfc模块可基于射频识别(rfid)技术,红外数据协会(irda)技术,超宽带(uwb)技术,蓝牙(bt)技术和其他技术来实现。
241.在示例性实施例中,电子设备400可以被一个或多个应用专用集成电路(asic)、数字信号处理器(dsp)、数字信号处理设备(dspd)、可编程逻辑器件(pld)、现场可编程门阵列(fpga)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述方法。
242.在示例性实施例中,还提供了一种包括指令的非临时性计算机可读存储介质,例如包括指令的存储器404,上述指令可由电子设备400的处理器420执行以完成上述方法。例如,所述非临时性计算机可读存储介质可以是rom、随机存取存储器(ram)、cd-rom、磁带、软盘和光数据存储设备等。
243.一种可读存储介质,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行一种内存管理方法,所述方法包括:
244.目标线程触发操作系统或中央处理器启动tlb的填写,其中,所述目标线程为所述中央处理器上当前运行的线程;
245.所述操作系统或所述中央处理器确定所述目标线程所需的内存区域对应的页表项是否同时具有写权限和执行权限;
246.在所述页表项同时具有所述写权限和所述执行权限的情况下,所述操作系统或所述中央处理器确定所述页表项所指示的所述内存区域同时具有动态代码生成需求和动态代码执行需求;
247.所述操作系统或所述中央处理器根据所述目标线程的线程描述符中的预设标记位,对所述页表项配置所述预设标记位所指示的操作权限,并将配置操作权限后的所述页表项作为所述目标线程对应的tlb表项写入所述tlb中,以使所述目标线程仅能以所述tlb表项中配置的操作权限访问所述tlb表项所指示的内存区域;
248.其中,所述预设标记位用于指定对应线程对所需内存区域仅具有所述写权限和所述执行权限中的一种操作权限,所述目标线程包括同一应用程序进程中的动态代码生成线程和动态代码执行线程中的至少一种,所述动态代码生成线程的预设标记位与所述动态代码执行线程的预设标记位被配置为不同标记。
249.本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
250.本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
251.本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
252.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备
以预测方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
253.这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
254.尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
255.最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
256.以上对本发明所提供的一种内存管理方法、装置、一种电子设备以及一种存储介质,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
技术特征:
1.一种内存管理方法,其特征在于,所述方法包括:目标线程触发操作系统或中央处理器启动tlb的填写,其中,所述目标线程为所述中央处理器上当前运行的线程;所述操作系统或所述中央处理器确定所述目标线程所需的内存区域对应的页表项是否同时具有写权限和执行权限;在所述页表项同时具有所述写权限和所述执行权限的情况下,所述操作系统或所述中央处理器确定所述页表项所指示的所述内存区域同时具有动态代码生成需求和动态代码执行需求;所述操作系统或所述中央处理器根据所述目标线程的线程描述符中的预设标记位,对所述页表项配置所述预设标记位所指示的操作权限,并将配置操作权限后的所述页表项作为所述目标线程对应的tlb表项写入所述tlb中,以使所述目标线程仅能以所述tlb表项中配置的操作权限访问所述tlb表项所指示的内存区域;其中,所述预设标记位用于指定对应线程对所需内存区域仅具有所述写权限和所述执行权限中的一种操作权限,所述目标线程包括同一应用程序进程中的动态代码生成线程和动态代码执行线程中的至少一种,所述动态代码生成线程的预设标记位与所述动态代码执行线程的预设标记位被配置为不同标记。2.根据权利要求1所述的方法,其特征在于,所述方法还包括:当一个线程的内存访问请求触发缺页异常时,若触发缺页的内存区域同时具有所述写权限和所述执行权限,且触发缺页的操作与所述线程的所述预设标记位的标记所指示的操作权限不匹配,则所述操作系统或所述中央处理器确定触发缺页的所述操作为非允许的异常操作;所述操作系统或所述中央处理器执行所述非允许的异常操作所对应的预设异常处理操作。3.根据权利要求1所述的方法,其特征在于,在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,还包括:在所述操作系统内核的线程描述符中定义所述预设标记位,并声明所述预设标记位用于指示对应线程对同时具有写权限和执行权限的页表项仅具有所述写权限和所述执行权限中的一种。4.根据权利要求1所述的方法,其特征在于,在所述中央处理器启动tlb的填写的情况下,在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,还包括:在所述中央处理器的微码中配置预设寄存器,并配置所述预设寄存器的第一预设字段用于指示在tlb填写时,是否对同时具有写权限和执行权限的页表项调整写入tlb的操作权限,以及配置所述预设寄存器的第二预设字段用于指示在填写tlb时,当所述第一预设字段使能时,根据当前运行线程的预设标记位所指示的操作权限,对同时具有写权限和执行权限的页表项进行操作权限的配置。5.根据权利要求4所述的方法,其特征在于,所述方法还包括:在所述动态代码生成线程与所述动态代码执行线程之间进行线程上下文切换时,所述操作系统根据切换后的线程的预设标记位,将所述预设寄存器的所述第一预设字段配置为使能,将所述第二预设字段配置为所述预设标记位的值。
6.根据权利要求5所述的方法,其特征在于,在所述中央处理器启动tlb的填写的情况下,所述操作系统或所述中央处理器根据所述目标线程的线程描述符中的预设标记位,对所述页表项配置所述预设标记位所指示的操作权限,包括:所述中央处理器读取所述预设寄存器;当所述预设寄存器的所述第一预设字段使能时,所述中央处理器对所述页表项配置所述第二预设字段的值所指示的操作权限。7.根据权利要求1所述的方法,其特征在于,在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,还包括:所述应用程序进程创建所述动态代码生成线程;所述动态代码生成线程通过系统调用,将所述动态代码生成线程的预设标记位配置为指示仅能够使用写权限的第一标记。8.根据权利要求1所述的方法,其特征在于,在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,还包括:所述应用程序进程创建所述动态代码执行线程;所述动态代码执行线程通过系统调用,将所述动态代码执行线程的预设标记位配置为指示仅能够使用执行权限的第二标记。9.根据权利要求7-8任一项所述的方法,其特征在于,所述系统调用被配置为在一个线程的生命周期中只允许被所述线程调用一次,以使所述线程在所述生命周期内只允许配置一次所述预设标记位。10.根据权利要求1-8任一项所述的方法,其特征在于,所述目标线程触发操作系统或中央处理器启动tlb的填写,包括:所述目标线程发出内存访问请求,触发所述操作系统或所述中央处理器处理所述请求;所述操作系统或所述中央处理器响应于所述请求产生tlb未命中时,启动tlb的填写。11.根据权利要求1-8任一项所述的方法,其特征在于,所述动态代码生成线程包括即时编译器线程,所述动态代码执行线程包括解释器线程。12.一种内存管理装置,其特征在于,所述装置包括:第一确定模块,用于在目标线程触发操作系统或中央处理器启动tlb的填写的情况下,确定所述目标线程所需的内存区域对应的页表项是否同时具有写权限和执行权限;其中,所述目标线程为所述中央处理器上当前运行的线程;第二确定模块,用于在所述页表项同时具有所述写权限和所述执行权限的情况下,确定所述页表项所指示的所述内存区域同时具有动态代码生成需求和动态代码执行需求;第一配置模块,用于根据所述目标线程的线程描述符中的预设标记位,对所述页表项配置所述预设标记位所指示的操作权限,并将配置操作权限后的所述页表项作为所述目标线程对应的tlb表项写入所述tlb中,以使所述目标线程仅能以所述tlb表项中配置的操作权限访问所述tlb表项所指示的内存区域;其中,所述预设标记位用于指定对应线程对所需内存区域仅具有所述写权限和所述执行权限中的一种操作权限,所述目标线程包括同一应用程序进程中的动态代码生成线程和动态代码执行线程中的至少一种,所述动态代码生成线程的预设标记位与所述动态代码执
行线程的预设标记位被配置为不同标记。13.根据权利要求12所述的装置,其特征在于,所述装置还包括:第三确定模块,用于当一个线程的内存访问请求触发缺页异常时,若触发缺页的内存区域同时具有所述写权限和所述执行权限,且触发缺页的操作与所述线程的所述预设标记位的标记所指示的操作权限不匹配,则确定触发缺页的所述操作为非允许的异常操作;执行模块,用于执行所述非允许的异常操作所对应的预设异常处理操作。14.根据权利要求12所述的装置,其特征在于,所述装置还包括:定义模块,用于在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,在所述操作系统内核的线程描述符中定义所述预设标记位,并声明所述预设标记位用于指示对应线程对同时具有写权限和执行权限的页表项仅具有所述写权限和所述执行权限中的一种。15.根据权利要求12所述的装置,其特征在于,所述装置还包括:第二配置模块,用于在所述中央处理器启动tlb的填写的情况下,在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,在所述中央处理器的微码中配置预设寄存器,并配置所述预设寄存器的第一预设字段用于指示在tlb填写时,是否对同时具有写权限和执行权限的页表项调整写入tlb的操作权限,以及配置所述预设寄存器的第二预设字段用于指示在填写tlb时,当所述第一预设字段使能时,根据当前运行线程的预设标记位所指示的操作权限,对同时具有写权限和执行权限的页表项进行操作权限的配置。16.根据权利要求15所述的装置,其特征在于,所述装置还包括:第三配置模块,用于在所述动态代码生成线程与所述动态代码执行线程之间进行线程上下文切换时,根据切换后的线程的预设标记位,将所述预设寄存器的所述第一预设字段配置为使能,将所述第二预设字段配置为所述预设标记位的值。17.根据权利要求16所述的装置,其特征在于,在所述第一配置模块,具体用于:所述中央处理器启动tlb的填写的情况下,读取所述预设寄存器;当所述预设寄存器的所述第一预设字段使能时,对所述页表项配置所述第二预设字段的值所指示的操作权限。18.根据权利要求12所述的装置,其特征在于,所述装置还包括:第一创建模块,用于在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,创建所述动态代码生成线程;第四配置模块,用于通过系统调用,将所述动态代码生成线程的预设标记位配置为指示仅能够使用写权限的第一标记。19.根据权利要求12所述的装置,其特征在于,所述装置还包括:第二创建模块,用于在所述目标线程触发操作系统或中央处理器启动tlb的填写之前,创建所述动态代码执行线程;第五配置模块,用于通过系统调用,将所述动态代码执行线程的预设标记位配置为指示仅能够使用执行权限的第二标记。20.根据权利要求18-19任一项所述的装置,其特征在于,所述系统调用被配置为在一个线程的生命周期中只允许被所述线程调用一次,以使所述线程在所述生命周期内只允许配置一次所述预设标记位。
21.根据权利要求12-19任一项所述的装置,其特征在于,所述装置还包括:触发模块,用于通过所述目标线程发出内存访问请求,触发所述操作系统或所述中央处理器处理所述请求;启动模块,用于响应于所述请求产生tlb未命中时,启动tlb的填写。22.根据权利要求12-19任一项所述的装置,其特征在于,所述动态代码生成线程包括即时编译器线程,所述动态代码执行线程包括解释器线程。23.一种电子设备,其特征在于,包括有存储器、以及一个或者一个以上的程序,其中一个或者一个以上程序存储于存储器中,且经配置以由一个或者一个以上的处理器执行所述一个或者一个以上的程序,所述程序包含用于进行以下操作的指令:目标线程触发操作系统或中央处理器启动tlb的填写,其中,所述目标线程为所述中央处理器上当前运行的线程;所述操作系统或所述中央处理器确定所述目标线程所需的内存区域对应的页表项是否同时具有写权限和执行权限;在所述页表项同时具有所述写权限和所述执行权限的情况下,所述操作系统或所述中央处理器确定所述页表项所指示的所述内存区域同时具有动态代码生成需求和动态代码执行需求;所述操作系统或所述中央处理器根据所述目标线程的线程描述符中的预设标记位,对所述页表项配置所述预设标记位所指示的操作权限,并将配置操作权限后的所述页表项作为所述目标线程对应的tlb表项写入所述tlb中,以使所述目标线程仅能以所述tlb表项中配置的操作权限访问所述tlb表项所指示的内存区域;其中,所述预设标记位用于指定对应线程对所需内存区域仅具有所述写权限和所述执行权限中的一种操作权限,所述目标线程包括同一应用程序进程中的动态代码生成线程和动态代码执行线程中的至少一种,所述动态代码生成线程的预设标记位与所述动态代码执行线程的预设标记位被配置为不同标记。24.一种可读存储介质,其特征在于,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行如权利要求1-11中任一项所述的内存管理方法。
技术总结
本发明实施例提供了一种内存管理方法、装置、设备及存储介质,涉及计算机技术领域。在本发明中,当目标线程触发OS/CPU启动TLB填写时,OS/CPU首先确定目标线程所需内存区域对应的页表项是否同时具有写和执行权限,若是,则确定该内存区域同时具有动态代码生成和执行需求,进而对该页表项配置目标线程的线程描述符中预设标记位指示的权限,并作为TLB表项写入TLB,如此,可使目标线程在当前处理器上只能够以预设标记位指示的权限访问该TLB表项指示的内存。对于同一应用程序进程中的动态代码生成线程和动态代码执行线程,可以通过预设标记位的不同标记,对同一内存配置不同的操作权限,提高了动态代码所在内存区域的安全性。提高了动态代码所在内存区域的安全性。提高了动态代码所在内存区域的安全性。
技术研发人员:黄沛
受保护的技术使用者:龙芯中科技术股份有限公司
技术研发日:2023.05.26
技术公布日:2023/9/20
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
航空商城 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/