用于存储器访问保护的方法和系统的制作方法

文档序号:6546564阅读:150来源:国知局
用于存储器访问保护的方法和系统的制作方法
【专利摘要】本发明提供了用于存储器访问保护的方法和系统,具体地提供了一种用于空地址处理的方法。该方法包括在不在存储器访问码之前添加空校验码的情况下编译代码,与用于空地址的处理代码的第二地址相关联地存储存储器访问码的第一地址,响应于在编译代码的执行期间在第一地址处发生异常,基于存储信息来确定第二地址,以及执行第二地址处的处理代码。
【专利说明】用于存储器访问保护的方法和系统
[0001]通过引用结合
[0002]本公开要求2013年5月16日提交的美国临时申请号61/824,121、“Method forDelaying Null Check in Java VM”的优先权,其过引用结合被整体地通到本文中。

【技术领域】
[0003]本申请涉及存储器领域,具体地,涉及用于用于存储器访问保护的方法和系统。

【背景技术】
[0004]在此提供的背景描述是出于一般地呈现本公开的背景的目的。目前署名的发明人的工作在其在本【背景技术】章节以及另外在提交时可能不会有资格作为现有技术的本描述的各方面中被描述的程度上,既然未明示地也未隐含地被承认为针对本公开的现有技术。
[0005]—般地,诸如Dalvik等java虚拟机将频繁使用的Java字节码编译成本地代码(native code)以改善运行时性能。在本地代码中,在存储器访问之前执行空校验(nullcheck)。在示例中,在访问对象之前,本地代码包括空校验码以检查对对象的参考是否是空的。当参考不是空的时,使用该参考来访问对象。


【发明内容】

[0006]本公开的各方面提供了一种用于空地址处理的方法。该方法包括:在不在存储器访问码之前添加空校验码的情况下编译代码,与用于空地址的处理代码的第二地址相关联地存储存储器访问码的第一地址,响应于在已编译代码的执行期间在第一地址处发生异常而基于存储信息来确定第二地址,以及执行第二地址处的处理代码。
[0007]为了与用于空地址的处理代码的第二地址相关联地存储存储器访问码的第一地址,在一个实施方式中,该方法包括:与第二地址相关联地将第一地址存储在表格中。此外,该方法包括:在表中搜索所述第一地址;以及输出与第一地址相关联地存储的第二地址。本公开的各方面提供了一种存储用于促使处理器执行用于空地址处理的操作的程序指令的非瞬态计算机可读介质。该操作包括:在不在存储器访问码之前添加空校验码的情况下编译代码,与用于空地址的处理代码的第二地址相关联地存储存储器访问码的第一地址,响应于在编译代码的执行期间在第一地址处发生异常而基于存储信息来确定第二地址,以及执行第二地址的处理代码。
[0008]本公开的各方面提供了另一方法。该方法包括由Java虚拟机在不在存储器访问码之前添加空校验码的情况下编译代码,与用于空地址的处理代码的第二地址相关联地存储存储器访问码的第一地址,响应于在已编译代码的执行期间在第一地址处发生异常而退出Java虚拟机,以使得内核基于存储信息来确定第二地址,并用所确定地址返回Java虚拟机以执行第二地址处的处理代码。

【专利附图】

【附图说明】
[0009]将参考以下各图详细地描述作为示例而提出的本公开的各种实施方式,其中,相同的附图标记参考相同的元件,并且在所述附图中:
[0010]图1示出了根据本公开的实施方式的系统示例100的框图;
[0011]图2示出了概述根据本公开的实施方式的编译过程200的流程图;
[0012]图3示出了概述本公开的实施方式的用于空地址处理的过程300的流程图;
[0013]图4A-4C示出了根据本公开的实施方式的代码示例;以及
[0014]图5示出了根据本公开的实施方式的用于内核的伪代码示例500。

【具体实施方式】
[0015]图1示出了根据本公开的实施方式的系统示例100的框图。系统100包括诸如处理模块110、存储器模块120等硬件部件,以及诸如存储于存储器模块120中的各种代码指令的软件部件。硬件部件根据软件部件进行操作以执行各种任务。
[0016]系统100可以是任何适当系统,诸如台式计算机、膝上型计算机、平板计算机、智能电话等。系统100可以包括其他适当部件(未示出),诸如显示器、触摸屏、扩音器、通信部件等。在实施方式中,系统100包括单个集成电路(IC)芯片,其在单个IC芯片上集成了诸如处理模块110、存储器模块120等各种电路。在另一实施方式中,系统100包括多个IC芯片,诸如处理器芯片、存储器芯片等。
[0017]处理模块110包括一个或多个处理器,诸如中央处理单元(CPU) 111等,以执行各种代码指令以执行各种任务。代码指令可以是能够被CPUlll直接地执行的低级代码,诸如机器代码(本地代码),或者可以是能够被翻译成机器代码且然后执行的高级代码,诸如在Java语目中、在C语目中等。
[0018]能够使用任何适当架构来实现CPU111,诸如x86、ARM等。在示例中,当CPUlll具有x86架构时,CPUlll能够执行对于x86架构而言特定的x86指令集中的机器代码。在另一示例中,当CPUlll具有ARM架构,CPUl 11能够执行对于ARM架构而言特定的ARM指令集中的机器代码。
[0019]存储器模块120包括为各种存储需要提供存储空间的一个或多个存储介质。在示例中,存储器模块120存储将被处理模块110执行的代码指令并存储将被处理模块110处理的数据。在另一示例中,存储器模块120包括为系统存储分配的存储空间,并且包括为用户存储分配的存储空间。
[0020]存储介质包括但不限于硬盘驱动器、光盘、固态驱动器、只读存储器(ROM)、动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM)、闪速存储器等。
[0021]根据本公开的一方面,存储器模块120存储各种计算机程序,诸如系统程序、应用程序等。每个计算机程序包括将被执行的用于执行任务的代码指令。在图1示例中,在存储器模块120中分配存储空间130以存储用于内核的程序。该内核是使用户应用程序与系统100的硬件部件对接的用于系统100的操作系统的一部分。例如,内核管理来自诸如用户应用程序等的软件部件的输入/输出请求,并将其翻译成数据处理指令以用于硬件部件,该硬件部件诸如处理模块110、存储器模块120等。
[0022]此外,在图1示例中,在存储器模块120中分配存储空间140以存储适合于系统100的Java软件程序。Java软件程序被安装在系统100中以提供Java运行时环境(JRE),使得能够在系统100中执行Java字节码。在示例中,执行Java软件程序以启动系统100中的Java虚拟机以执行Java字节码。在示例中,系统100是安卓系统,并且存储空间140存储用于安卓系统的Dalvik软件程序。
[0023]在一个实施方式中,用Java语言来生成用户应用程序的源代码。源代码被编译而生成用于应用程序的Java字节码。Java字节码可由各种Java虚拟机执行。在图1示例中,分配存储空间150以存储用于用户应用程序的Java字节码。为了执行Java字节码,系统100启动Java虚拟机。Java虚拟机为Java字节码提供Java运行时环境。在执行Java字节码之后,在本示例中终止Java虚拟机。
[0024]根据本公开的一方面,Java虚拟机将解释和及时(JIT)编译用于Java字节码执行。在示例中,Java虚拟机检测Java字节码中的频繁执行轨迹,诸如路径、环路等,并以与不那么频繁执行的轨迹不同的方式来执行频繁执行轨迹。例如,Java虚拟机跟踪用于轨迹的执行的数目。当用于轨迹的执行数目小于阈值(例如,2)时,Java虚拟机通过解释来执行轨迹;并且当用于轨迹的执行数目等于或大于该阈值时,Java虚拟机使用JIT编译来将Java字节码的轨迹编译成本地代码的轨迹,并将本地代码的轨迹高速缓存在存储器模块120中。在图1示例中,存储空间155被分配为JIT高速缓存器以高速缓存已编译本地代码。然后,针对轨迹的进一步执行,Java虚拟机执行存储在存储空间155处的高速缓存本地代码。
[0025]一般地,在Java语言中,使用参考来访问存储器模块120中的对象和阵列成员。为了确保安全的存储器访问,在示例中,Java虚拟机能够在存储器访问码之前添加本地代码中的空校验码,诸如对象访问码、阵列成员访问码等。空校验码检查参考是否是空的,并且代码执行流程根据空校验而分叉。在示例中,当空校验为假(即参考并不是空的)时,Java虚拟机遵循代码序列以执行存储器访问码。当空校验为真(例如,参考是空的)时,Java虚拟机概念代码序列以执行处理空参考情况的空处理代码。
[0026]根据本公开的一方面,添加的空校验码采取额外的时钟循环来执行。另外,由于代码执行流程在空校验码处分叉,所以空校验码是用于指令调度的边界。因此,添加空校验码引起用于代码优化的代码范围减小。
[0027]根据本公开的方面,系统100中的Java虚拟机并不在存储器访问码(诸如对象访问码、阵列成员访问码等)之前在本地代码中添加空校验。替代地,Java虚拟机在空地址表中添加条目,诸如存储在存储器模块120中的表格160。该条目与空处理代码的地址相关联地存储存储器访问码的地址。在图1示例中,表160包括用于将存储器访问码的地址存储在本地代码中的第一字段(PC ADDRESS)和用于存储空处理代码的地址的第二字段(NULLHANDLING ADDRESS)。
[0028]在操作期间,当用于存储器访问码的参考不是空时,连续地执行本地代码。由于本地代码并不具有空校验码,则节省用于执行空校验码的时钟循环。另外,在由于空校验码而没有调度边界的情况下,可扩大用于代码优化的代码范围。然后,能够优化较大范围的本地代码以进一步改善Java虚拟机性能。
[0029]然而,当用于存储器访问码的参考是空或接近于空,则参考指向一般地被保护免于用户访问的系统空间,一般地,系统100退出应用程序,并且进入内核中的异常情况处理功能。根据本公开的一方面,系统100的内核确定空处理代码的地址。然后,系统100在空处理代码的地址处返回应用程序。在实施方式中,系统100的内核例如基于表160根据引起异常情况的存储器访问码的地址(例如,系统100的程序计数器(PC)中的地址),来确定空处理代码的地址。在示例中,内核在表160中搜索存储器访问码的地址。当内核在表160中找到在第一字段中具有存储器访问码的地址的条目时,内核获得存储在条目的第二字段中的空处理代码的地址。然后,系统100在所确定地址处返回应用程序以执行空处理代码。
[0030]图2示出了概述根据本公开的实施方式的用于编译的过程示例200的流程图。在图1示例中,采取Java语言的应用程序被翻译成Java字节码,并且该Java字节码被存储在存储器模块120中的存储空间150处。在实施方式中,为了执行Java字节码,系统100执行存储于存储空间140处的Java软件程序以开始Java虚拟机。Java虚拟机提供用于执行Java字节码的Java运行时环境。在示例中,Java虚拟机使用JIT编译来将Java字节码的频繁使用轨迹编译成本地代码,并且Java虚拟机执行已编译本地代码以改善性能。在示例中,Java虚拟机使用过程200来将存储器访问码从Java字节码编译成本地代码。该过程在S201处开始并前进至S210。
[0031]在210处,接收存储器访问码以用于编译。在示例中,存储器访问码在频繁使用Java字节码的轨迹中。
[0032]在S220处,存储器访问码在不添加空校验的情况下被编译成本地代码。在示例中,系统100中的Java虚拟机将存储器访问码从Java字节码编译成本地代码,而不在本地代码中的存储器访问码之前添加空校验码。
[0033]在S230处,与用于在存储器访问码处处理空的空处理代码相关联地存储本地代码中的存储器访问码的地址。在图1示例中,将本地代码中的已编译存储器访问码的地址存储在表160中的条目的第一字段中,并将用于在存储器访问码处的处理空参考的空处理代码的地址存储在条目的第二字段中。然后,过程前进至S240并终止。
[0034]应注意的是,能够反复地使用过程200来将Java字节码的频繁使用轨迹中的任何存储器访问码编译成本地代码。
[0035]图3示出了概述根据本公开的实施方式的用于运行时间的空地址处理的过程300的流程图。在图1示例中,系统100中的Java虚拟机在不添加空校验的情况下将频繁使用Java字节码编译成本地代码,并且然后执行本地代码。过程300被系统100用来处理空地址情况。该过程在S301处开始并前进至S310。
[0036]在S310处,系统在用户模式下执行本地代码。在图1的示例中,当系统100执行用于用户应用程序的代码、诸如存储在存储空间150处的应用程序时,系统100处于用户模式。此外,在图1示例中,应用程序中的Java字节码的频繁使用轨迹在没有存储在存储空间155处的空校验的情况下编译成本地代码,并且该本地代码在用户模式下被系统100执行。
[0037]在S320处,系统响应于针对存储器访问的空参考而退出用户模式。在图1示例中,由于本地代码在存储器访问码前面不包括空校验码,所以当用于存储器访问的参考为空或接近于空时,生成特定信号(例如,SIGSEGV)以向系统100信号通知分段违规,并且系统100退出用户模式,并响应于特定信号而进入地址异常模式。
[0038]在S330处,系统确定用于存储器访问码的空处理代码的地址。在图1的示例中,当系统100处于地址异常模式时,在实施方式中,内核针对本地代码中的存储器访问码的地址而搜索表160中的第一字段。当内核找到条目中的匹配时,内核提取该条目的第二字段中的空处理代码的地址。在示例中,表160被存储在为用户存储分配的存储空间,并且该内核使用诸如1ctlO之类的系统调用来访问表160。
[0039]在S340处,系统100返回到用户模式以处理空地址。在图1示例中,将程序计数器设置成空处理代码的地址,并且系统100返回至用户模式以执行空处理代码以处理空地址。然后该过程前进至S399并终止。
[0040]图4A示出了采取Java语言的应用程序代码410的一部分。应用程序代码410包括对象访问码415。
[0041]图4B示出了采取Java字节码的应用程序代码420的一部分。在实施方式中,应用程序代码410被编译成应用程序代码420。应用程序代码420包括对应于图4A中的对象访问码415的对象访问码425。在图1的示例中,应用程序代码420例如被存储在存储空间150 处。
[0042]图4C示出了采取本地代码的应用程序代码430的一部分。在示例中,Java虚拟机在运行时间将应用程序代码420的频繁使用轨迹编译成应用程序代码430。本地代码中的应用程序代码430包括对应于图4B中的对象访问码425的对象访问码435。应注意的是,应用程序代码430在对象访问码435之前不包括空校验码(例如,cbz指令)。使用图1中的示例,应用程序代码430被存储在例如为JIT高速缓存器分配的存储空间155处。在JIT高速缓存器中的地址(例如,0x46692012)处高速缓存对象访问码435。应注意的是应用程序代码430包括空处理代码445,其在JIT高速缓存器中的地址(例如,0x46692044)处开始以处理对象访问码435处的空地址。
[0043]根据本公开的一方面,与空处理代码445的地址相关联地存储对象访问码435的地址。在示例中,在编译时,对象访问码435的地址被存储在表160的条目中的第一字段中,并且空处理代码445的地址被存储在条目的第二字段中,如图1中所示。
[0044]图5示出了根据本公开的某些实施方式的Linux内核的伪代码示例500。在示例中,在系统100中使用Linux内核。Linux内核包括当存储器访问码触发异常情况时被调用的函数“_do_user_fault”。例如,响应于特定信号SIGSEGV而调用该函数。
[0045]根据伪代码500,该函数检查触发异常情况的存储器访问码的地址是否在诸如表160之类的空地址表中。当该地址在空地址表中时,程序计数器变成与存储器访问码的地址相关联地存储的空处理代码的地址。然后,该函数返回至用户模式。
[0046]虽然已结合作为示例而提出的本公开的特定实施方式描述了本公开的各方面,但可对示例进行替换、修改以及变更。相应的,如在本文中所阐述的实施方式意图是说明性而非限制性的。在不脱离下面阐述的权利要求的范围的情况下,存在可实现的变更。
【权利要求】
1.一种用于空地址处理的方法,包括: 在不在存储器访问码之前添加空校验码的情况下编译代码; 与用于空地址的处理代码的第二地址相关联地存储所述存储器访问码的第一地址;响应于在已编译的所述代码的执行期间在所述第一地址处发生异常,基于存储的信息来确定所述第二地址;以及 执行所述第二地址处的处理代码。
2.根据权利要求1所述的方法,其中,与用于空地址的所述处理代码的所述第二地址相关联地存储所述存储器访问码的所述第一地址还包括: 与所述第二地址相关联地将所述第一地址存储在表中。
3.根据权利要求2所述的方法,其中,响应于在已编译的所述代码的所述执行期间在所述第一地址处发生异常,基于存储的所述信息来确定所述第二地址还包括: 在所述表中搜索所述第一地址;以及 输出与所述第一地址相关联地存储的所述第二地址。
4.根据权利要求1所述的方法,其中,响应于在已编译的所述代码的所述执行期间在所述第一地址处发生异常,基于存储的所述信息来确定所述第二地址还包括: 由内核来确定与所述第一地址相关联的所述第二地址。
5.根据权利要求1所述的方法,其中,在不在所述存储器访问码之前添加空校验码的情况下编译所述代码还包括以下中的至少一个: 在不在阵列成员访问码之前添加所述空校验码的情况下编译所述代码;以及 在不在对象访问码之前添加所述空校验码的情况下编译所述代码。
6.根据权利要求1所述的方法,其中,在不在所述存储器访问码之前添加所述空校验码的情况下编译所述代码还包括: 由Java虚拟机在不在所述存储器访问码之前添加所述空校验码的情况下编译所述代码。
7.根据权利要求6所述的方法,其中,与用于所述空地址的所述处理代码的所述第二地址相关联地存储所述存储器访问码的所述第一地址还包括: 由所述Java虚拟机来与用于所述空地址的所述处理代码的所述第二地址相关联地存储所述存储器访问码的所述第一地址。
8.根据权利要求7所述的方法,其中,响应于在已编译的所述代码的所述执行期间在所述第一地址处发生异常,基于存储的所述信息来确定所述第二地址还包括: 由内核来确定与所述第一地址相关联的所述第二地址。
9.根据权利要求8所述的方法,其中,执行所述第二地址处的所述处理代码还包括: 返回到所述Java虚拟机以执行所述第二地址处的所述处理代码。
10.一种存储用于促使处理器执行用于空地址处理的操作的程序指令的非瞬态计算机可读介质,所述操作包括: 在不在存储器访问码之前添加空校验码的情况下编译代码; 与用于空地址的处理代码的第二地址相关联地存储所述存储器访问码的第一地址;响应于在已编译的所述代码的执行期间在所述第一地址处发生异常,基于存储的信息来确定所述第二地址;以及 执行所述第二地址处的所述处理代码。
11.根据权利要求10所述的非瞬态计算机可读介质,其中,与用于空地址的所述处理代码的所述第二地址相关联地存储所述存储器访问码的所述第一地址的所述操作还包括: 与所述第二地址相关联地将所述第一地址存储在表中。
12.根据权利要求11所述的非瞬态计算机可读介质,其中,响应于在已编译的所述代码的所述执行期间在所述第一地址处发生异常,基于存储的所述信息来确定所述第二地址的所述操作还包括: 在所述表中搜索所述第一地址;以及 输出与所述第一地址相关联地存储的所述第二地址。
13.根据权利要求10所述的非瞬态计算机可读介质,其中,响应于在已编译的所述代码的所述执行期间在所述第一地址处发生异常,基于存储的所述信息来确定所述第二地址的所述操作还包括: 由内核来确定与所述第一地址相关联的所述第二地址。
14.根据权利要求10所述的非瞬态计算机可读介质,其中,在不在所述存储器访问码之前添加所述空校验码的情况下编译所述代码的所述操作还包括以下中的至少一个: 在不在阵列成员访问码之前添加所述空校验码的情况下编译所述代码;以及 在不在对象访问码之前添加所述空校验码的情况下编译所述代码。
15.根据权利要求10所述的非瞬态计算机可读介质,其中,在不在所述存储器访问码之前添加所述空校验码的情况下编译所述代码的所述操作还包括: 由Java虚拟机在不在所述存储器访问码之前添加所述空校验码的情况下编译所述代码。
16.根据权利要求15所述的非瞬态计算机可读介质,其中,与用于所述空地址的所述处理代码的所述第二地址相关联地存储所述存储器访问码的所述第一地址的所述操作还包括: 由所述Java虚拟机来与用于所述空地址的所述处理代码的所述第二地址相关联地存储所述存储器访问码的所述第一地址。
17.根据权利要求16所述的非瞬态计算机可读介质,其中,响应于在已编译的所述代码的所述执行期间在所述第一地址处发生异常,基于存储的所述信息来确定所述第二地址的所述操作还包括: 由内核来确定与所述第一地址相关联的所述第二地址。
18.根据权利要求17所述的非瞬态计算机可读介质,其中,执行所述第二地址处的所述处理代码的所述操作还包括: 返回到所述Java虚拟机以执行所述第二地址处的所述处理代码。
19.一种用于空地址处理的方法,包括: 由Java虚拟机在不在存储器访问码之前添加空校验码的情况下编译代码; 与用于所述空地址的处理代码的第二地址相关联地存储所述存储器访问码的第一地址; 响应于在已编译的所述代码的执行期间在所述第一地址处发生异常,退出所述Java虚拟机以基于存储的信息来确定所述第二地址;以及 用确定的所述第二地址返回至Java虚拟机以执行所述第二地址处的所述处理代码。
20.根据权利要求19所述的方法,其中,与用于空地址的所述处理代码的所述第二地址相关联地存储所述存储器访问码的所述第一地址还包括: 与第二地址相关联地将所述第一地址存储在表中。
【文档编号】G06F9/455GK104166633SQ201410204214
【公开日】2014年11月26日 申请日期:2014年5月14日 优先权日:2013年5月16日
【发明者】黄海涛, 范晔 申请人:马维尔国际贸易有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1