CN113672237B - 防内存越界的程序编译方法及装置 - Google Patents
防内存越界的程序编译方法及装置 Download PDFInfo
- Publication number
- CN113672237B CN113672237B CN202111033647.0A CN202111033647A CN113672237B CN 113672237 B CN113672237 B CN 113672237B CN 202111033647 A CN202111033647 A CN 202111033647A CN 113672237 B CN113672237 B CN 113672237B
- Authority
- CN
- China
- Prior art keywords
- address
- segment
- memory
- program
- space
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 110
- 230000008569 process Effects 0.000 claims abstract description 63
- 230000007246 mechanism Effects 0.000 claims description 15
- 238000004364 calculation method Methods 0.000 claims description 14
- 238000012545 processing Methods 0.000 claims description 8
- 238000010586 diagram Methods 0.000 description 8
- 230000006870 function Effects 0.000 description 8
- 238000005516 engineering process Methods 0.000 description 6
- 230000004048 modification Effects 0.000 description 6
- 238000012986 modification Methods 0.000 description 6
- WYROLENTHWJFLR-ACLDMZEESA-N queuine Chemical compound C1=2C(=O)NC(N)=NC=2NC=C1CN[C@H]1C=C[C@H](O)[C@@H]1O WYROLENTHWJFLR-ACLDMZEESA-N 0.000 description 5
- 230000003068 static effect Effects 0.000 description 4
- 230000006399 behavior Effects 0.000 description 3
- 230000006872 improvement Effects 0.000 description 3
- 230000008859 change Effects 0.000 description 2
- 238000004590 computer program Methods 0.000 description 2
- 239000012634 fragment Substances 0.000 description 2
- 238000005457 optimization Methods 0.000 description 2
- 230000002265 prevention Effects 0.000 description 2
- 230000004044 response Effects 0.000 description 2
- 230000001960 triggered effect Effects 0.000 description 2
- OKTJSMMVPCPJKN-UHFFFAOYSA-N Carbon Chemical compound [C] OKTJSMMVPCPJKN-UHFFFAOYSA-N 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 229910021389 graphene Inorganic materials 0.000 description 1
- 230000001939 inductive effect Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 230000009897 systematic effect Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/33—Intelligent editors
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/441—Register allocation; Assignment of physical memory space to logical memory space
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Storage Device Security (AREA)
Abstract
本说明书一个或多个实施例提供一种防内存越界的程序编译方法及装置,所述方法包括:在将源程序编译为目标程序的过程中,针对源程序中的内存访问代码生成地址检查机器码,目标程序对应的内存分配空间处于一段连续的虚拟地址段内,虚拟地址段的段基址包含位于高位的段号和位于低位的若干零值逻辑位,虚拟地址段的段长不小于若干零值逻辑位所能够表示的最大地址空间;地址检查机器码用于:将内存访问代码所需访问的目标内存空间对应的线性地址的高位数据与段基址中包含的段号进行比较,线性地址为目标内存空间相对于段基址的段偏移量与段基址之和,且高位数据与段号的位数相同;在比较结果相同的情况下,允许根据线性地址访问内存中的目标内存空间。
Description
技术领域
本说明书一个或多个实施例涉及计算机技术领域,尤其涉及一种防内存越界的程序编译方法及装置。
背景技术
程序在内存中预先分配的虚拟地址空间中运行,为了防止程序在访问内存的过程中访问到虚拟地址空间之外的地址空间从而出现内存越界的问题,通常会在访问内存之前对所需访问的地址进行越界检查,并在确保访存地址未发生越界的情况下访问内存。
发明内容
有鉴于此,本说明书一个或多个实施例提供一种防内存越界的程序编译方法及装置。
为实现上述目的,本说明书一个或多个实施例提供技术方案如下:
根据本说明书一个或多个实施例的第一方面,提出了一种防内存越界的程序编译方法,包括:
在将源程序编译为目标程序的过程中,针对所述源程序中的内存访问代码生成地址检查机器码,所述目标程序对应的内存分配空间处于一段连续的虚拟地址段内,所述虚拟地址段的段基址包含位于高位的段号和位于低位的若干零值逻辑位,所述虚拟地址段的段长不小于所述若干零值逻辑位所能够表示的最大地址空间;所述地址检查机器码用于:
针对所述内存访问代码所需访问的目标内存空间,将所述目标内存空间对应的线性地址的高位数据与所述段基址中包含的段号进行比较,所述线性地址为所述目标内存空间相对于所述段基址的段偏移量与所述段基址之和,且所述高位数据与所述段号的位数相同;
在比较结果为相同的情况下,允许根据所述线性地址访问内存中的所述目标内存空间。
根据本说明书一个或多个实施例的第二方面,提出了一种防内存越界的程序编译装置,包括:
地址检查机器码编译单元,用于在将源程序编译为目标程序的过程中,针对所述源程序中的内存访问代码生成地址检查机器码,所述目标程序对应的内存分配空间处于一段连续的虚拟地址段内,所述虚拟地址段的段基址包含位于高位的段号和位于低位的若干零值逻辑位,所述虚拟地址段的段长不小于所述若干零值逻辑位所能够表示的最大地址空间;所述地址检查机器码用于:
针对所述内存访问代码所需访问的目标内存空间,将所述目标内存空间对应的线性地址的高位数据与所述段基址中包含的段号进行比较,所述线性地址为所述目标内存空间相对于所述段基址的段偏移量与所述段基址之和,且所述高位数据与所述段号的位数相同;
在比较结果为相同的情况下,允许根据所述线性地址访问内存中的所述目标内存空间。
根据本说明书一个或多个实施例的第三方面,提出了一种电子设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器通过运行所述可执行指令以实现如第一方面中任一项所述的方法。
根据本说明书一个或多个实施例的第四方面,提出了一种计算机可读存储介质,其上存储有计算机指令,该指令被处理器执行时实现如第一方面中任一项所述方法的步骤。
附图说明
图1是一示例性实施例提供的一种防内存越界的程序编译方法的应用场景图。
图2是一示例性实施例提供的一种防内存越界的程序编译方法的流程图。
图3是一示例性实施例提供的一种设备的结构示意图。
图4是一示例性实施例提供的一种防内存越界的程序编译装置的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。
需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
内存越界是软件***主要错误之一,它是指内存访问时所指向的地址超出了预先分配给该程序对应的合法地址范围。从访问类型上来分类,内存越界包括读越界和写越界,其中,读越界即程序读取了不属于自己合法地址范围内的数据,如果所读的内存地址是无效的,可能导致程序崩溃;如果所读内存地址是有效的,在读的时候不会马上出现问题,但由于读到的数据是随机的,因此可能会造成不可预料的后果。写越界与读越界类似,是指向自身程序对应的合法地址范围之外的内存空间写入数据的行为,可能导致程序崩溃,或者当该内存空间属于其他程序对应的合法地址范围时,相当于越权了修改其他程序的信息,从而诱发***性的运行故障或安全性风险。在一的内存越界的示例中,程序首先定义一个数组,比如申请了一个可容纳16个元素的数组,那么使用a[16]或a[20]就都是越界访问,同样a[-10]或a[-16]也是越界访问,而只有使用[0, 15]的数组下标才属于正常访问这个数组对应的合法地址范围的行为,其中,在面向人类的程序语言的视角下,a[x]代表数组中的第x个元素,而在面向计算机的视角下,a[x]会被看作是数组中第x个元素所在的逻辑地址。
由于内存越界出现的时机是随机的,表现出来的现象是随机的,而且造成的后果往往也是不可预料且非常严重的,这使得开发人员难以获取这些越界错误的本质来源,从而给内存越界错误的定位和修复带来极大的困难。在相关技术中,通常是采用提前预防的方式来解决内存越界问题。例如,可以在程序A执行任一内存访问指令之前,首先对该内存访问指令所需访问的访存地址进行越界检查,查看该访存地址是否满足处于程序A的合法地址范围内,如果该访存地址处于程序A的合法地址范围内,那么就按照该访存地址访问内存,如果该访存地址处于程序A的合法地址范围之外,那么就停止按照该内存访问指令访问内存,避免发生越界访问导致的程序崩溃或安全性风险。
具体而言,程序A在操作***或内存分配程序预先分配的虚拟地址空间中运行,以该虚拟地址空间仅包括一个连续的虚拟地址段为例来说明相关技术中的越界检查以及确定访存地址的过程:假设虚拟地址段的段基址为Q,该值被存储在地址为m的内存空间中,而虚拟地址段的段长为L,该值被存储在地址为n的内存空间中,那么程序A的合法地址范围便被限制在了[Q,Q+L]之内。对于程序A所发出的任一内存访问指令都需要进行越界检查,设该指令所指示访问的形式地址为X,当该内存访问指令的访存类型为直接访存时,那么该指令最终所需访问的访存地址(也称有效地址)就是X本身,此时就必须首先确定程序A的合法地址范围然后再判断X是否落在该合法地址范围内,如前所述,确定程序A的合法地址范围至少需要虚拟地址段的段基址Q和段长L,因此,在执行越界检查的过程中,CPU首先需要在内存中读取地址m中的段基址Q以及地址n中的段长L,然后判断X是否满足Q≤X≤Q+L,如果满足则认为该内存访问指令不会发生内存越界错误,可以按照X直接访问内存;当内存访问指令的访存类型为基址加变址访存时,那么该指令的有效地址将是X+Q,由于形式地址X在该基址加变址的访存类型下即为程序A所需访问的逻辑地址,该值反映的是以程序角度所看待的相对于程序首地址的偏移量,那么在程序A的首地址与虚拟地址段的段基址对齐的情况下,越界检查逻辑可以无需首先计算出有效地址X+Q,而是可以通过比较段长L(实质上就是允许访问的最大内存空间相对于段基址Q的偏移量)和逻辑地址X的大小关系来首先判断该内存访问指令是否会发生内存越界错误,然后在判断该内存访问指令不会发生内存越界错误的情况下(在X≤L的情况下)计算出有效地址X+Q,最后根据有效地址X+Q访问内存,显然,判断段长L和逻辑地址X时就必然涉及到CPU读取内存中的地址n以获取段长L,计算出有效地址X+Q就必然涉及到CPU读取内存中的地址m以获取段基址Q。
由上述讨论可知,在相关技术中,无论内存访问指令的访存类型是直接访存还是基址加变址访存,无论在越界检查逻辑中是否进行有关地址检查和地址生成的执行顺序的优化,针对一个内存访问指令所实现的一个完整的越界检查和确定有效地址的过程中,必然涉及到至少两次访问内存的过程,在程序的合法地址范围包括多个不连续的虚拟地址段时,则需要更多次地访问内存以获取各虚拟地址段的段基址和段长,从而依次判断访存地址是否处于由多个虚拟地址段共同构成的合法地址范围内,同时越界检查中也涉及到数值大小关系的比较逻辑,而无论是内存访问过程或是数值大小比较过程均会较大的降低执行效率,影响内存访问指令的执行性能。另外,虽然可以将段长和段基址预存储在两个不同的寄存器中,这样在需要获取虚拟地址段的段长和段基址的情况下,就能够避免访问内存而直接读取相应的寄存器,但这种改进无法改变在相关技术中需要通过查询段长和段基址两个因素以完成越界检查和确定有效地址的必要前提,并且也无法消除相关技术中必然涉及到的数值大小比较过程。
为此,本说明书提出了一种防内存越界的程序编译方法,应用于编译器或解释器,可使在编译内存访问代码时生成地址检查机器码,所述地址检查机器码用于对内存访问代码所需访问的线性地址进行越界检查并在通过越界检查的情况下允许访问所述线性地址,该过程中无需查询段长和段基址两个因素,也不涉及数值大小比较过程,而仅是涉及的数值是否相等的比较,在具体实现上只需要利用异或运算,其执行效率远高于数值大小比较在具体实现上所需利用的算术运算,并且,本说明书所涉及的方案只需在特定的内存分配原则下,利用虚拟地址段的段号这一个因素便同时能够完成越界检查和确定有效地址的任务,因此极大地提高了通过越界检查的方式来预防内存访问代码发生内存越界错误的实施效率。
本说明书所涉及的防内存越界的程序编译方法应用于编译器或解释器进行编译的过程中,本说明书实施例所涉及的内存访问指令是指在被执行后能够生成并访问特定访存地址的计算机语言,其形式可以包括高级语言编写的指令、汇编指令、伪指令和机器码等;本说明书实施例所涉及的内存访问代码是指功能上与内存访问指令相同、形式上不包括机器码的具有用户可读性的解释性语言,是必须要通过编译生成机器码后才能够被处理器执行以最终实现内存访问功能的源代码,例如可以包括使用字节码、C++、Python、Java所编写的各类程序语言;而本说明书实施例所涉及的机器码则是指面向处理器的能够被处理器直接执行的不具备用户可读性的机器语言。
在本说明书实施例中,内存在线性地址空间中被划分为若干个内部地址连续的地址段,每个地址段相互之间不重叠,且每个地址段的段基址包含位于高位的段号和位于低位的若干零值逻辑位。图1是一示例性实施例提供的一种防内存越界的程序编译方法的应用场景图,以图1为例,图示中的内存地址需要用6位16进制数(相当于24位二进制数)表示,因此该内存为24位内存,假设一个物理地址所对应的内存空间的大小为1字节(8bit),那么图示内存的内存大小为1B*2^24=16MB,如图所示,该内存被划分为若干个连续的地址段,其中,虚拟地址空间00:0000H~00:FFFFH对应的地址段用于加载包括***程序和操作***在内的内核态程序;虚拟地址空间01:0000H~01:FFFFH对应的地址段用于加载用户态程序应用程序1;虚拟地址空间02:0000H~02:FFFFH对应的地址段用于加载用户态程序应用程序2;虚拟地址空间03:0000H~03:FFFFH对应的地址段用于加载用户态程序应用程序3,以此类推。可见,在图1所示的内存分配场景中,内存被平均分配为若干个段长相同的地址段,每个地址段的首地址(即段基址)中的高2位(对应于8位二进制数)代表段号,低4位(对应于16位二进制数)代表零值逻辑位,零值逻辑位中每位二进制数的值均为0,每个地址段的段长均等于4位16进制数所能表示的最大地址空间即16^4=65536,由于内存中的每个线性地址均被分配至相应的地址段,使得在图1所示的内存分配场景下内存不存在外部碎片。需要指出的是,虽然图1所示的应用场景中,不同地址段的段长均被设置为相同,但根据实际场景的需要,也可以将地址段的段长设定为其他大小(此时不同地址段的段号位数将可能出现差异),但无论地址段的段长为多少,仍需要保证各个地址段的段基址中除段号以外的逻辑位均为零值逻辑位。
在图1所示的应用场景中,***程序或应用程序在内存中所占的虚拟地址空间均不超过其所在地址段的段长,以应用程序2为例,应用程序2的程序首地址为02:0000H,与虚拟地址空间02:0000H~02:FFFFH对应的虚拟地址段的段基址对齐,其被分配的虚拟地址空间不超过虚拟地址段的段长,在应用程序2对应的地址段中,应用程序2维护有包含处理器指令(机器码)的代码段以及包含应用数据的数据段,当应用程序2被加载至对应的地址段并被执行时,CPU会按照地址顺序从低至高地读取其代码段中的机器码并执行相应的处理操作,例如算术运算、指令跳转、存取数据等处理器操作,类似的,当***程序或其他应用程序被加载至相应地址段并需要被执行时,CPU也会读取相应代码段中的机器码并予以处理。
下面结合图1对本说明书的防内存越界的程序编译方法进行详细说明。请参见图2,图2是一示例性实施例提供的一种防内存越界的程序编译方法的流程图。如图2所示,该方法应用于编译器或解释器,该方法可以包括以下步骤:
步骤202,在将源程序编译为目标程序的过程中,针对所述源程序中的内存访问代码生成地址检查机器码,所述目标程序对应的内存分配空间处于一段连续的虚拟地址段内,所述虚拟地址段的段基址包含位于高位的段号和位于低位的若干零值逻辑位,所述虚拟地址段的段长不小于所述若干零值逻辑位所能够表示的最大地址空间。
所述地址检查机器码用于:
步骤204,针对所述内存访问代码所需访问的目标内存空间,将所述目标内存空间对应的线性地址的高位数据与所述段基址中包含的段号进行比较,所述线性地址为所述目标内存空间相对于所述段基址的段偏移量与所述段基址之和,且所述高位数据与所述段号的位数相同。
步骤206,在比较结果为相同的情况下,允许根据所述线性地址访问内存中的所述目标内存空间。
其中,上述的步骤202发生于地址检查机器码的编译阶段,而步骤204与步骤206则发生于地址检查机器码的执行阶段。
本说明书实施例所涉及的源程序也称源代码,是指按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制机器码,这种过程叫做编译,通过编译器或解释器完成。本说明书实施例所涉及的目标程序又称目的程序,是指源程序经编译后生成的可直接被计算机运行的机器码集合,即目标程序是通过解释器或编译器中的语言处理程序(汇编程序,编译程序,解释程序),由源程序处理(汇编,编译,解释)而成的程序,目标程序由机器码构成的,能够被计算机识别并直接运行,在计算机文件上以.obj作扩展名,目标程序在完成与库函数连接后,便可以直接被加载至内存中运行。
源程序中一般都会包含大量的内存访问代码,这些内存访问代码在编译过程中也会转化为相应的机器码,从而作为构成目标程序的一部分。传统的越界检查任务通常是由操作***或特定的越界检查程序所完成,即在内存访问代码编译至机器码的过程中只是如实的按照内存访问代码的访存类型以及携带的形式地址,生成用于“根据形式地址和访存类型确定有效地址,并根据有效地址访问内存”的机器码,而并不会产生额外的用于实现越界检查任务的机器码,越界检查的任务是由处理器在读取并执行具有内存访问功能的机器码时调用操作***或特定的越界检查程序所实现。虽然越界检查程序的底层实现也是基于机器码,但由于每次越界检查机制都至少涉及一次程序调用的过程,因此必然对启用有越界检查机制的目标程序的执行效率造成了负面影响。
而在本说明书实施例中,在将源程序编译为目标程序的过程中,除了会生成用于“根据形式地址和访存类型确定有效地址,并根据有效地址访问内存”的机器码,还会针对所述源程序中的内存访问代码生成地址检查机器码,而该地址检查机器码用于完成越界检查任务。因此在目标程序被执行的过程中,处理器只需顺序执行机器码,而无需在每次执行访存机器码时调用操作***或特定的越界检查程序执行一次越界检查逻辑,相当于取消了程序调用的过程,有效地提高了启用有越界检查机制的目标程序的执行效率。
除了对执行越界检查任务的架构进行轻量化处理(取消程序调用过程)之外,本说明书实施例对于越界检查的逻辑本身也进行了优化改进。如前所述,本说明书实施例中生成的地址检查机器码在被处理器执行时,用于针对所述内存访问代码所需访问的目标内存空间,将所述目标内存空间对应的线性地址的高位数据与所述段基址中包含的段号进行比较,所述线性地址为所述目标内存空间相对于所述段基址的段偏移量与所述段基址之和,且所述高位数据与所述段号的位数相同,并在比较结果为相同的情况下,允许根据所述线性地址访问内存中的所述目标内存空间。
为了实现上述越界检查逻辑的改进,首先需要对目标程序的内存分配策略有一定的要求,具体而言,需要使所述目标程序对应的内存分配空间处于一段连续的虚拟地址段内,并且所述虚拟地址段的段基址包含位于高位的段号和位于低位的若干零值逻辑位,所述虚拟地址段的段长不小于所述若干零值逻辑位所能够表示的最大地址空间。在编译器对所述目标程序编译完成且被触发执行的情况下,可以使操作***将所述目标程序加载至所述内存中的所述虚拟地址段内,并使所述处理器执行所述目标程序中的若干机器码。例如,对于区块链***中的区块链节点而言,所述源程序或所述目标程序可以为部署于区块链***中的智能合约。其中,当区块链节点上部署的是基于源程序的智能合约时,该源程序可以是用字节码编写的智能合约,需要在虚拟机环境下执行,而当区块链节点上部署的是基于目标程序的智能合约时,该目标程序则是通过编译得到的由若干机器码构成的AOT(Aheadof Time,提前编译)合约,从而可以在被加载到内存中后由处理器直接执行。
在所述内存访问代码的访存类型为直接访存的情况下,则内存访问代码所携带的形式地址X就可以看作为内存访问代码所需访存的线性地址(也即有效地址),该线性地址为所述目标内存空间相对于所述段基址的段偏移量与所述段基址之和,由于内存访问代码中直接显含有该线性地址X,因此无需在执行过程中通过算术运算的方式得到线性地址,此时生成的地址检查机器码将针对线性地址X进行越界检查,具体而言,如图1所示,假设地址X值为02:1234H,假设目标程序即为图1中的应用程序2,其所被分配的内存分配空间处于图中所述地址范围处于02:0000H~02:FFFFH的虚拟地址段内,该虚拟地址段的段基址Q为02:0000H,该值被存储在目标程序数据段的第二预设存储空间中,该第二预设存储空间的地址为m,是编译时就确定的固定值,段基址Q中的高2位为段号,低4位为零值逻辑位,关于段号和零值逻辑位的位数由处理器预先获知,因此,在执行地址检查机器码的过程中,CPU首先需要在内存中读取地址m中的段基址Q,然后将段基址Q中的高2位中的段号02H与线性地址02:1234H中的高2位取出的高位数据02H进行比较,在比较相同的情况下认为根据线性地址X访存不会发生内存越界错误,允许根据线性地址X直接访问内存,进而执行后续用于“访问线性地址X对应的目标内存空间”的机器码。
当内存访问代码的访存类型为基址加变址访存时,那么该内存访问代码所携带的形式地址X并非最终所需访问的有效地址,而是作为面向目标程序的逻辑地址X,如前所述真正的有效地址将是X+Q,因此在编译阶段除了会生成地址检查机器码还会生成地址计算机器码以计算得到有效地址(线性地址),如图1所示,假设逻辑地址X为1234H,那么CPU可以先执行编译生成的地址计算机器码,通过CPU读取出内存中地址m所预先存储的段基址Q,接着通过算术运算得到有效地址X+Q为1234H+02:0000H=02:1234H,这里使用的逻辑地址X是作为立即数写在地址计算机器码对应的操作数中,因此无需通过访问内存读取,并且得到的有效地址也就是内存访问代码实际所需访问的目标内存空间在线性地址空间中的线性地址,然后,CPU继续执行地址检查机器码,执行过程中无需再次从内存中读取地址m中的段基址Q,因为在执行地址计算机器码时已经读取过段基址Q,因此段基址此时仍然存储在CPU内部寄存器中,CPU可以直接对内部寄存器中的段基址Q进行后续操作,提取出段基址Q高2位的段号02H与计算得到的线性地址的高位数据02H,并比较二者是否相同,例如可以通过进行异或运算实现比较过程,在异或运算结果为00H的情况下认为比较结果为相同,允许根据线性地址X直接访问内存,进而执行后续用于“访问线性地址X对应的目标内存空间”的机器码,在异或运算结果为00H以外的值的情况下认为比较结果为不同,则触发越界报警机制,中止程序运行并返回错误信息以指示发生内存越界错误的指令位置。
当内存访问代码的访存类型为基址加变址访存时,除了可以采用上述的先计算出线性地址再对线性地址的高位数据进行越界检查的实施例外,还可以采用先对线性地址的高位数据进行越界检查再计算出线性地址的实施例,但这种情况下需要保证目标程序的首地址与虚拟地址段的段基址对齐。由于本说明书实施例所涉及的越界检查逻辑在于判断线性地址的高位数据是否与段基址中的段号相同,而上述判断逻辑等价于在进行基址加变址的算术运算时,作为变址的逻辑地址是否将导致作为基址的段基址中段号所在数位的进位,在段基址中除段号以外的逻辑位均为零值逻辑位的情况下,该判断逻辑又等价于判断逻辑地址的位数是否小于段基址中零值逻辑位的位数。所以,可以在内存访问代码暂未计算出线性地址的情况下,就基于逻辑地址本身的性质完成对线性地址的高位数据与所述段基址中包含的段号进行比较。具体而言,越界检查逻辑可以无需首先计算出有效地址X+Q,而是可以通过比较逻辑地址X的位数来判断后续计算得到的线性地址是否可能会发生内存越界错误,这是因为,对于基址加变址的访存类型,其中的基址也就是基地址是固定的,其值为目标程序的内存分配空间所对应的虚拟地址段的段基址Q,那么是否发生越界就完全取决于这里的变址也就是逻辑地址X,仍以图1为例,由于虚拟地址段的段基址Q是由高2位的段号02H和低4位的零值逻辑位0000H组成,段长为4位16进制所能表示的最大地址空间65536,而在目标程序的首地址与虚拟地址段的段基址对齐的情况下,逻辑地址X反映的是最终所需访问的目标内存空间相对于段基址Q的段偏移量,显然为了保证不发生内存越界现象,逻辑地址X在数值上不能超过FFFFH,这意味着,在逻辑地址X的16进制位数为4位或以下时,都可以保证最终所确定的有效地址X+Q处于虚拟地址段对应的虚拟地址空间02:0000H~02:FFFFH之内,在本例中逻辑地址X不能超过4位16进制位,而一般情况下逻辑地址所不能超过的位数同样是通过段基址所确定,例如CPU预设有内存的总线位数(在本例中为24个二进制位),CPU在执行地址检查机器码时,首先会访问目标程序数据段中的第二预设存储空间以读取到段基址Q,然后进一步分析其中段号的二进制位数为p,则可以确定逻辑地址X不能超过的二进制位数为24-p,或者直接将段基址Q中零值逻辑位的二进制位数作为逻辑地址不能超过的二进制位数。在完成上述对逻辑地址X的位数进行检查以确保不会产生内存越界错误后,才会进一步执行编译生成的地址计算机器码,读取寄存器中已经存储(因为在执行内存检查机器码时已经将段基址Q从内存中读取到内部寄存器)的段基址Q,然后计算得到线性地址X+Q为02:1234H,同时允许根据该线性地址X+Q访问内存,进而执行后续用于“访问线性地址X+Q对应的目标内存空间”的机器码。
之所以能够通过比较段基址中处于高位的段号与线性地址中处于高位的高位数据是否相同,来判断线性地址是否发生越界,是因为本说明书实施例中的虚拟地址段对应的段基址被设置为包含位于高位的段号和位于低位的若干零值逻辑位,并且所述虚拟地址段的段长不小于所述若干零值逻辑位所能够表示的最大地址空间,而目标地址的内存分配空间处于上述虚拟地址段内。以图1为例,目标程序所处的虚拟地址段的段基址为02:0000H,包含高2位的段号02H以及低4位的零值逻辑位0000H,虚拟地址段的段长不小于4位16进制位所能表示的最大地址空间65536,这意味着虚拟地址空间02:0000H~02:FFFFH均包含在该虚拟地址段内,若要使最终所需要的访问的目标内存空间的线性地址不发生内存越界错误,则需要保证线性地址必须落在为目标程序所分配的虚拟地址段内,由于虚拟地址段的段长不小于所述若干零值逻辑位所能够表示的最大地址空间,因此虚拟地址空间02:0000H~02:FFFFH必然处于虚拟地址段内,换句话说,02:0000H~02:FFFFH必然属于目标程序的合法地址范围,只需要保证线性地址处于02:0000H~02:FFFFH范围内就可以保证不发生内存越界错误,显然对于线性地址而言,无论低4位的段偏移量的数值为多少,只要高2位的高位数据为02H,都可以保证线性地址处于虚拟地址空间02:0000H~02:FFFFH之内,也即可以保证线性地址不会发生内存越界错误,而02H又恰巧为虚拟地址段的段基址中位于高2位的段号,因此,在本说明书实施例所涉及的内存分配策略下,将目标程序对应的内存分配空间设置为一段连续的虚拟地址段,并保证虚拟地址段具有如下性质:①段基址包含位于高位的段号和位于低位的若干零值逻辑位,②段长不小于所述若干零值逻辑位所能够表示的最大地址空间,就可以使段基址同时蕴含有段基址和段长的信息。通过采用本实施例所涉及的越界检查逻辑,能够在处理器执行包含该越界检查逻辑的地址检查机器码时,利用虚拟地址段的段号这一个因素便同时能够完成越界检查和确定有效地址的任务,减少了访问内存的次数或占用寄存器的数目,同时,也避免了数值大小比较的过程,转而以比较数值是否相等的过程进行替代,在具体的实施效率上优于数值大小比较的过程,综上,本说明书实施例所述的防内存越界方案,极大地提高了通过越界检查的方式来预防内存访问代码发生内存越界错误的实施效率。
在一实施例中,所述虚拟地址段的段长可以为所述若干零值逻辑位所能够表示的最大地址空间。如前所述,为了避免内存越界,需要保证线性地址所对应的目标内存空间处于虚拟地址段之内,在本说明书实施例中,这一点是通过保证虚拟地址段的段长不小于所述若干零值逻辑位所能够表示的最大地址空间来实现的,但是当虚拟地址段的段长大于所述零值逻辑位所能够表示的最大地址空间的情况下,目标程序可能会被分配到零值逻辑位所能表示的最大地址空间之外但仍属于虚拟地址段中的剩余内存空间,这意味着目标程序在正常执行过程中完全可能申请到上述剩余内存空间之中,然而在本说明书实施例中,地址检查机器码所涉及的越界检查逻辑却只会承认零值逻辑位所能表示的最大地址空间内部的地址访问是未越界的,换句话说,对于上述剩余内存空间的正常访问,在应用本说明书实施例所涉及的防内存越界方案后将被认为是越界访问,从而影响目标程序的正常运行。
具体而言,由于本说明书实施例中地址检查机器码所涉及的越界检查逻辑,只认可高位数据与段号相同的线性地址,认为这样的线性地址不会发生内存越界错误,这相当于认为目标程序所能够访问的合法线性地址空间的空间大小实际上是由线性地址中高位数据之外的低位数据的位数所决定,而低位数据的位数被规定为与虚拟地址段的段基址中零值逻辑位的位数相同(因为高位数据的位数和段号相同,而用于表示内存线性地址的总位数又是预先决定的),因此合法线性地址空间的空间大小在数值上与零值逻辑位所能够表示的最大地址空间的空间大小相等,等于2^x(x为二进制的零值逻辑位的位数),而对于一个段长大于上述计算得到的最大地址空间的虚拟地址段,在采用本说明书实施例所涉及的防内存越界方案后,会使得该虚拟地址段的一部分内存空间无法被访问到,例如虚拟地址段对应的线性地址空间为01:00H~02:FF,因此该虚拟地址段的段基址为01:00H,目标段号为01H,段长为512,超过了8位二进制零值逻辑位所能够表示的最大地址空间2^8=256,那么按照本说明书实施例所涉及的越界检查逻辑,所能够认可的合法线性地址空间仅为01:00H~01:FF,而不包括02:00H~02:FF,因此这将导致被分配在虚拟地址段中的目标程序无法访问到该虚拟地址段的全部地址空间。所以,可以将所述虚拟地址段的段长设置为所述若干零值逻辑位所能够表示的最大地址空间,这样一来,目标程序将可以完全访问到目标程序所被分配的内存分配空间,从而避免第一用户程序在执行过程中由于越界检查的“误判”而导致无法完整访问到自身的代码段或数据段并最终导致运行出错的问题,同时还能够提高内存的利用率。另外,在应用上述实施例的基础上,还可以如图1所示那样将内存以紧密排列的方式划分为线性地址空间上连续的多个地址段,从而进一步提高内存的利用率。
在本说明书实施例中,提供了一种防内存越界的程序编译方法,在将源程序编译为目标程序的过程中,针对所述源程序中的内存访问代码生成地址检查机器码,由于本说明书实施例采用了一种特殊的内存分配策略,即目标程序对应的内存分配空间处于一段连续的虚拟地址段内,所述虚拟地址段的段基址包含位于高位的段号和位于低位的若干零值逻辑位,所述虚拟地址段的段长不小于所述若干零值逻辑位所能够表示的最大地址空间,因此可以使地址检查机器码在完成越界检查任务时,只需要利用虚拟地址段的段基址一个因素就可以完成,这意味着越界检查以及确定线性地址的过程中,可以将访问内存的次数降至一次,或者只需要占用一个寄存器来存放虚拟地址段的段号或段基址,因此极大地提高了通过越界检查的方式来预防内存访问代码发生内存越界错误的实施效率。
可选的,还包括:针对所述内存访问代码生成地址计算机器码,所述地址计算机器码用于将所述内存访问代码中携带的段偏移量与所述段基址相加得到的所述线性地址写入第一预设存储空间,以使所述地址检查机器码在执行时从第一预设存储空间处获取所述目标内存空间对应的所述线性地址。
如前所述,对于不同访存类型的内存访问代码可能会有不同的编译结果,在本说明书实施例中,在内存访问代码的访存类型为基址加变址访存的情况下,编译器还会针对该内存访问代码生成地址计算机器码,具体是基于内存访问代码中携带的逻辑地址(段偏移量)以及预存储有段基址的第二预设存储空间,生成调用ALU(arithmetic and logicunit,算术逻辑单元)的地址计算机器码,该地址计算机器码的地址码为第一预设存储空间,操作数为作为立即数的内存访问代码中的逻辑地址以及作为地址的第二预设存储空间。因此,在所述地址计算机器码被执行时,就会将所述内存访问代码中携带的段偏移量与所述段基址相加得到的所述线性地址写入第一预设存储空间,以使得所述地址检查机器码在执行时从第一预设存储空间处获取所述目标内存空间对应的所述线性地址。在本说明书实施例中,生成的地址计算机器码的执行顺序是设置在地址检查机器码之前(先计算线性地址后越界检查),实际上,在通过判断逻辑地址的位数的方式实现的越界检查逻辑中,也可以将地址计算机器码的执行顺序设置在地址检查机器码之后(先越界检查后计算线性地址)。
可选的,还包括:针对所述内存访问代码生成越界报警机器码,所述越界报警机器码用于在所述线性地址的高位数据与所述段基址中包含的段号比较结果为不同的情况下触发越界报警机制。
如前所述,地址检查机器码的执行逻辑仅能保证在所述线性地址的高位数据与所述段基址中包含的段号比较结果为相同的情况下,允许根据所述线性地址访问内存,然而,在高位数据与段号比较结果为不同的情况下,则没有逻辑定义,因此在本说明书实施例中通过额外生成越界报警机器码,从而在地址检查机器码被执行后线性地址未通过越界检查的情况下触发越界报警机制,例如,所述越界报警机制至少包括停止运行所述目标程序和/或输出错误信息以指示发生内存越界的指令位置,其中,输出错误信息用于表示程序运行过程中发生了内存越界错误,并且该内存越界错误具体发生的机器码对应的内存访问指令的位置,从而方便开发人员及时获取错误原因并定位错误,方便后续的调试以及对该内存越界错误的解决。
可选的,还包括:针对所述内存访问代码生成地址访问机器码,所述地址访问机器码用于在地址检查机器码的执行结果允许根据所述线性地址访问内存中的所述目标内存空间的情况下,根据所述线性地址访问内存中的所述目标内存空间。其中,在所述内存采用页式存储管理的情况下,所述处理器根据所述线性地址转化得到的物理地址访问所述内存中的所述目标内存空间;在所述内存未采用页式存储管理的情况下,所述处理器将所述线性地址作为物理地址访问所述内存中的所述目标内存空间。由于内存在采用页式存储管理的情况下,线性地址并非直接作为目标内存空间的物理地址,而是包含有页号和页偏移量,且需要进一步查找页表以确定最终的物理地址,因此处理器需要首先将线性地址转化为物理地址,然后基于转化得到的物理地址访问所述内存中的所述目标内存空间;而内存在未采用页式存储管理的情况下,则线性地址相当于目的内存空间的物理地址,因此处理器可以将所述线性地址作为物理地址直接访问所述内存中的所述目标内存空间。通过采用页式存储管理,可以将内存中每个地址段又分别划分为大量的页块,然后根据每个页块的首地址和权限控制信息构建页表,从而方便对内存进行的读写权限进行管理(例如限制用户态程序修改自己代码段的数据),同时也有利于应用虚拟内存技术以实现页粒度的内外存置换。
可选的,所述将源程序编译为目标程序包括:在对所述源程序进行解释执行的过程中,将所述源程序编译为所述目标程序;或者,将所述源程序AOT编译为所述目标程序。
在本说明书实施例中,将所述源程序编译为所述目标程序,可能是发生在解释执行的过程中,本说明书实施例所涉及的解释执行指的是在边编译边执行,例如,在编译器或解释器对所述源程序中的任一代码完成编译以生成所述任一代码对应的机器码后,就将其加载至虚拟地址段中使处理器执行所述任一机器码;或者,将所述源程序编译为所述目标程序,也可能是发生在编译执行的过程中,本说明书实施例所涉及的编译执行指的是编译完成后执行,例如,在所述目标程序被AOT编译完成且被触发执行的情况下,操作***将所述目标程序加载至所述内存中的所述虚拟地址段内,并使所述处理器执行所述目标程序中的若干机器码。本说明书涉及的防内存越界的程序编译方法可以应用在解释执行的编译过程中,也可以应用在编译执行的过程中,本说明书对此不做任何限制。
可选的,所述段号或者所述段基址预先存储在第二预设存储空间,以使所述地址检查机器码在执行时从第二预设存储空间处获取所述段基址中包含的所述段号。
如前所述,地址检查机器码在执行过程中需要获取目标程序所被分配的虚拟地址段的段号,因此,可以在目标程序被加载至虚拟地址段中执行之前,首先在第二预设存储空间中预先写入虚拟地址段的段基址或段基址中包含的段号,以使地址检查机器码在执行时能够从第二预设存储空间处获取所述段基址中包含的所述段号,例如第二预设存储空间中预存储有虚拟地址段的段基址时,则地址检查机器码需要从第二预设存储空间中读取出段基址,并按照预先设定的段号的位数从段基址的高位数据上提取出所述虚拟地址段的段号(在第二预设存储空间中直接存储有段号的情况下,可以直接从第二预设存储空间中读取出所述段号),从而帮助完成线性地址的高位数据与虚拟地址段的段号的比较,以完成越界检查的逻辑。
可选的,在上述说明书实施例的基础上,第二预设存储空间仅参与生成所述地址检查机器码的编译过程。在本说明书实施例中,由于第二预设存储空间中存储有虚拟地址段的段号或段基址,而其中的段号是用于在执行地址检查机器码时判断线性地址是否发生越界的必要信息,因此在目标程序加载至内存中的虚拟地址段中并准备开始执行之前,都需要首先在第二预设存储空间中预先存储虚拟地址段的段基址或段号才能保证后续地址检查机器码在执行过程中可以正确有效地实现其检查线性地址是否越界的功能。然而,在源程序向目标程序进行编译的过程中,源程序中不仅会包含有内存访问代码需要进行编译,还会包含其他的功能代码也需要编译为机器码,而编译得到的机器码可能会涉及申请使用寄存器和内存中的内存空间,这其中就包括第二预设存储空间,而在其他编译后生成的机器码中会使用(例如修改)第二预设存储空间的情况下,就无法保证目标程序在执行过程中越界检查机制的有效性,因为在其他机器码的操作篡改了第二预设存储空间中存储的值之后,后续执行的地址检查机器码将读取到错误的段号或段基址,从而无法真正实现越界检查的功能。因此,在本说明书实施例中,通过对编译器或解释器进行设置,使第二预设存储空间仅参与生成所述地址检查机器码的编译过程,即只有在生成地址检查机器码时,可以在地址检查机器码中定义使用第二预设存储空间的操作逻辑,而在生成其他机器码时则禁用第二预设存储空间,或将针对第二预设存储空间的操作逻辑限定为只读,从而避免上述可能出现的因第二预设存储空间被篡改而导致的越界检查机制失效的问题。
可选的,第二预设存储空间的修改权限由操作***所有。在本说明书实施例中,为了使地址检查机器码在执行过程中能够正确有效地实现越界检查逻辑,需要防止目标程序或其他用户态程序对第二预设存储空间中的段号或段基址进行修改而导致越界检查的功能紊乱,无法起到正常防内存越界的效果,例如可以设置对第二预设存储空间进行相关调用的指令为特权指令,因此只有在CPU处于内核态模式或相应于特权指令的情况下才可以对第二预设存储空间中的段号或段基址进行修改,例如操作***需要将CPU的控制权下放给作为用户态程序的目标程序时,则首先应发出特权指令使CPU将第二预设存储空间中的段号修改为所需要的下放的用户态程序所在虚拟地址段的段基址或段号,然后再将处理器模式调整为用户态模式(或者先修改处理器模式,再发出特权指令修改第二预设存储空间),最后进行特权指令跳转至目标程序的程序入口,使CPU开始读取目标程序的代码段中的指令,当然也可以将第二存储空间的修改权限开放给编译过程中生成的地址检查机器码,从而使得目标程序在运行过程中自动修改第二预设存储空间为自身所处虚拟地址段的段号或段基址,而操作***则无需作为程序初始化(修改第二预设存储空间为正确的段号或段基址)的承担者,从而简化目标程序运行的初始化流程。通过本说明书实施例,可以避免目标程序在执行过程中私自修改第二预设存储空间中的段号,从而增强了地址检查机器码在执行过程中的有效性,使之能够有效防止目标程序访问到自己无权访问的地址,增加了***的安全性。
可选的,第二预设存储空间包括下述任一:寄存器、所述虚拟地址段中预定义的内存空间或所述虚拟地址段外预定义的内存空间。其中,当第二预设存储空间为所述虚拟地址段中预定义的内存空间时,例如第二预设存储空间可以为目标程序的首地址对应的内存空间,或者如图1所示可以是数据段中具有固定逻辑地址的内存空间,可以将第二预设存储空间的权限管理模式设置为只读模式,从而避免目标程序在执行过程中修改;当第二预设存储空间为所述虚拟地址段外预定义的内存空间时,由于目标程序在编译完成后所有的访存行为都会收到越界检查的保护,即在目标程序的执行过程中,只有本说明实施例所涉及生成的地址检查机器码会访问该第二预设存储空间,这意味着这种访问必然是可信任的,因此无需担心目标程序在执行过程中访问或修改第二预设存储空间,此时可以将第二预设存储空间的权限管理模式设置为读写模式;当第二预设存储空间为寄存器时,该寄存器可以包括所述处理器中的内部寄存器、作为外设的外部寄存器或所述内存中定义的虚拟寄存器。在本说明书实施例中,寄存器可内置于处理器中,与处理器内部的其他通用寄存器具有相同地位,因此CPU默认知晓该寄存器的物理地址,并在相关指令中需要调用该寄存器时按照其对应的物理地址进行访问,在第二预设存储空间为内部寄存器的情况下,由于无需通过访问内存以获取虚拟地址段的段号,因此可以进一步加快越界检查的执行效率。当然,寄存器也可以为外部寄存器,此时CPU需要通过I/O接口对寄存器进行调用,因此在使用作为外设的外部寄存器时,需要先向操作***或CPU声明外部寄存器对应的I/O端口地址。同理,寄存器也可以为内存中定义的虚拟寄存器,这相当于在内存中分配一个CPU专用的内存空间,因此也需要向操作***或CPU声明该虚拟寄存器在内存中的物理地址。
可选的,所述目标程序的首地址与所述虚拟地址段的段基址对齐。在本说明书实施例中,由于目标程序的首地址与目标程序所在的虚拟地址段的段基址对齐,因此目标程序中生成的任意逻辑地址(段偏移量)不仅代表着目标程序的首地址与该虚拟空间之间的相对位置关系(虚拟空间在应用程序内部的偏移量),也实际上能够代表所需访问的目标内存空间距离虚拟地址段的段基址的相对位置关系(内存中实际目标内存空间在虚拟地址段中的段偏移量),且在该虚拟地址段的段基址被设置为低4位均为0(在数值上与目标程序首地址的逻辑地址相同)的情况下,由于段偏移量的实质就是距离段基址之间的距离,因此可以确保目标程序的首地址的逻辑地址与虚拟地址段的段基址中的零值逻辑位在数值上保持统一,均为相同位数的零值逻辑位,这样才能使在CPU在执行目标程序中的内存访问指令时,根据指令中携带的逻辑地址确定的目标内存空间能够正确反映第一用户态程序所实际需要访问的内存空间,因为只有在目标程序的首地址的逻辑地址与虚拟地址段的段基址中的零值逻辑位在数值上保持统一的基础上,目标程序在程序视角下所需访问的目标内存空间的逻辑地址才能够与实际所需访问的目标内存空间在虚拟地址段内的线性地址的低位数据在数值上保持一致,从而保证目标程序在执行过程中不会发生访问的错位,使访问到目标地址空间正是目标程序所需要访问的内存空间。
可选的,目标程序的内存分配空间对应的虚拟地址段可以采用如下策略来设置:首先估算出该目标程序可能需要占用的虚拟地址空间,然后基于估算得到的虚拟地址空间在空闲内存中划分新的地址段,以使新划分的地址段的段长匹配于估算得到的虚拟地址空间,具体而言,是使得新划分的地址段的段长不小于估算得到的虚拟地址空间,但同时需要保证新划分的地址段同样满足其段基址包含位于高位的段号和位于低位的若干零值逻辑位,以及段长为所述若干零值逻辑位所能够表示的最大地址空间,因此,最终新划分的地址段的段长只有几个离散的值可取到,且数值上均满足2的N次幂,N为正整数,为了最大限度地减少内部碎片,可以设估算得到的虚拟地址空间的空间大小为R,确定满足如下公式的N:
在确定N后,将2N作为目标程序的内存分配空间对应的虚拟地址段的段长,然后在内存中搜索一段处于空闲状态、首地址中处于低N位的低位数据均为0且段长为2N的连续地址空间作为目标程序对应的虚拟地址段,使得在该内存分配策略下所确定的虚拟地址段的段基址中处于低N位的低位数据作为零值逻辑位,而处于高位的高位数据(除零值逻辑位之外的逻辑位)则作为该虚拟地址段的段号,目标程序在需要被执行时被加载至基于该策略划分的虚拟地址段内,在该策略下所设置的虚拟地址段的段号和零值逻辑位的位数将可能与之前划分好的地址段有一定的差别,不过这并不影响本说明书所涉及的防内存越界方案的应用,地址检查机器码在执行时用于根据虚拟地址段的段基址中包含的段号和线性地址中与段号具有相同位数的高位数据的比较结果,判断线性地址是否可能发生内存越界错误。在本说明书实施例中,由于目标程序可以被分配至能够动态调节段长的虚拟地址段,因此可以尽可能的减少内存中的内部碎片,提高内存的利用率。
可选的,还包括:在内存分配程序接收到来自所述目标程序的动态内存请求的情况下,所述内存分配程序将所述虚拟地址段中处于空闲状态且满足所述内存请求包含的请求空间大小的虚地址空间分配给所述目标程序,并向操作***请求为所述虚地址空间分配物理内存。在源程序编译为目标程序后,目标程序需要被加载在内存中才能运行,在本说明书实施例中,目标程序的内存分配空间被限定在一个连续的虚拟地址段中,因此目标程序在需要被执行时,会***作***加载至内存中其所对应的虚拟地址段内,目标程序在被加载到虚拟地址段中后,一般都不会占用虚拟地址段内的全部内存空间,例如,在目标程序刚刚加载至虚拟地址段中时,目标程序仅占有编译时所定义的静态内存,任何一个指定类型的变量都会在编译过程中申请相对应的静态内存空间。然而,在目标程序的执行过程中,可能会产生一些新的内存占用需求,例如对于一个未定义大小的数组,其在编译时所申请的静态内存是不确定的,因此随着目标程序的允许可能需要动态地为其申请更多的动态内存。在本说明书实施例中,当目标程序需要申请额外的动态内存时,首先需要向发生内存分配程序发出动态内存请求,这里的内存分配程序可以是操作***,也可以是内存中已经加载并运行的专门用于管理目标程序内存分配的程序,在内存分配程序接受到内存分配请求后,由于该内存分配程序预先获知目标程序被分配的虚拟地址段,并且能够获知目标程序当前占用的内存空间以及虚拟地址段中处于空闲状态的内存空间,因此内存分配程序可以相应于内存分配请求,将所述虚拟地址段中处于空闲状态且满足所述内存请求包含的请求空间大小的虚地址空间(动态内存)分配给所述目标程序,并向操作***请求为所述虚地址空间分配物理内存,于是目标程序便可以获取并使用为其分配的动态内存,同时内存分配程序也会更新当前目标程序当前占用的内存空间、虚拟地址段内处于空闲状态的内存空间。
可选的,通过页表的保护机制将目标程序中代码段中的代码和数据段中的只读数据的修改权限设置为只读模式,用于防止目标程序在执行过程中修改代码或只读数据。在本说明书实施例中,可以启用页式存储管理中对内存的保护机制,例如将目标程序中的代码段中的代码和数据段中只读数据部分对应的页面的权限管理模式设置为只读模式,由此可防止目标程序通过修改代码或只读数据来使编译产生的地址检查机器码失效,从而增加***的安全性。
图3是一示例性实施例提供的一种设备的结构示意图。请参考图3,在硬件层面,该设备包括处理器302、内部总线304、网络接口306、内存308以及非易失性存储器310,当然还可能包括其他业务所需要的硬件。本说明书一个或多个实施例可以基于软件方式来实现,比如由处理器302从非易失性存储器310中读取对应的计算机程序到内存308中然后运行。当然,除了软件实现方式之外,本说明书一个或多个实施例并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
图4是一示例性实施例提供的一种防内存越界的程序编译装置的框图。请参考图4,该装置可以应用于如图3所示的设备中,例如,该装置包括软/硬编译器或软/硬解释器,以实现本说明书的技术方案。其中,所述装置包括:
地址检查机器码编译单元401,用于在将源程序编译为目标程序的过程中,针对所述源程序中的内存访问代码生成地址检查机器码,所述目标程序对应的内存分配空间处于一段连续的虚拟地址段内,所述虚拟地址段的段基址包含位于高位的段号和位于低位的若干零值逻辑位,所述虚拟地址段的段长不小于所述若干零值逻辑位所能够表示的最大地址空间;所述地址检查机器码用于:
针对所述内存访问代码所需访问的目标内存空间,将所述目标内存空间对应的线性地址的高位数据与所述段基址中包含的段号进行比较,所述线性地址为所述目标内存空间相对于所述段基址的段偏移量与所述段基址之和,且所述高位数据与所述段号的位数相同;
在比较结果为相同的情况下,允许根据所述线性地址访问内存中的所述目标内存空间。
可选的,还包括:
地址计算机器码编译单元402,用于针对所述内存访问代码生成地址计算机器码,所述地址计算机器码用于将所述内存访问代码中携带的段偏移量与所述段基址相加得到的所述线性地址写入第一预设存储空间,以使所述地址检查机器码在执行时从第一预设存储空间处获取所述目标内存空间对应的所述线性地址。
可选的,还包括:
越界报警机器码编译单元403,用于针对所述内存访问代码生成越界报警机器码,所述越界报警机器码用于在所述线性地址的高位数据与所述段基址中包含的段号比较结果为不同的情况下触发越界报警机制。
可选的,所述越界报警机制至少包括停止运行所述目标程序和/或输出错误信息以指示发生内存越界的指令位置。
可选的,所述地址检查机器码编译单元401具体用于:
在对所述源程序进行解释执行的过程中,将所述源程序编译为所述目标程序;或者,
将所述源程序AOT编译为所述目标程序。
可选的,所述段号或者所述段基址预先存储在第二预设存储空间,以使所述地址检查机器码在执行时从第二预设存储空间处获取所述段基址中包含的所述段号。
可选的,第二预设存储空间包括下述任一:寄存器、所述虚拟地址段中预定义的内存空间或所述虚拟地址段外预定义的内存空间。
可选的,第二预设存储空间仅参与生成所述地址检查机器码的编译过程。
可选的,第二预设存储空间的修改权限由操作***所有。
可选的,所述目标程序的首地址与所述虚拟地址段的段基址对齐。
可选的,所述内存访问代码包括字节码。
可选的,所述源程序或所述目标程序为部署于区块链***中的智能合约。
上述实施例阐明的***、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
在一个典型的配置中,计算机包括一个或多个处理器 (CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器 (RAM) 和/或非易失性内存等形式,如只读存储器 (ROM) 或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存 (PRAM)、静态随机存取存储器 (SRAM)、动态随机存取存储器 (DRAM)、其他类型的随机存取存储器 (RAM)、只读存储器 (ROM)、电可擦除可编程只读存储器 (EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘 (DVD) 或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
在本说明书一个或多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。
Claims (14)
1.一种防内存越界的程序编译方法,包括:
在将源程序编译为目标程序的过程中,针对所述源程序中的内存访问代码生成地址检查机器码,所述目标程序对应的内存分配空间处于一段连续的虚拟地址段内,所述虚拟地址段的段基址包含位于高位的段号和位于低位的若干零值逻辑位,所述虚拟地址段的段长不小于所述若干零值逻辑位所能够表示的最大地址空间;所述地址检查机器码用于:
针对所述内存访问代码所需访问的目标内存空间,将所述目标内存空间对应的线性地址的高位数据与所述段基址中包含的段号进行比较,所述线性地址为所述目标内存空间相对于所述段基址的段偏移量与所述段基址之和,且所述高位数据与所述段号的位数相同;
在比较结果为相同的情况下,允许根据所述线性地址访问内存中的所述目标内存空间。
2.根据权利要求1所述的方法,还包括:
针对所述内存访问代码生成地址计算机器码,所述地址计算机器码用于将所述内存访问代码中携带的段偏移量与所述段基址相加得到的所述线性地址写入第一预设存储空间,以使所述地址检查机器码在执行时从第一预设存储空间处获取所述目标内存空间对应的所述线性地址。
3.根据权利要求1所述的方法,还包括:
针对所述内存访问代码生成越界报警机器码,所述越界报警机器码用于在所述线性地址的高位数据与所述段基址中包含的段号比较结果为不同的情况下触发越界报警机制。
4.根据权利要求3所述的方法,所述越界报警机制至少包括停止运行所述目标程序和/或输出错误信息以指示发生内存越界的指令位置。
5.根据权利要求1所述的方法,所述将源程序编译为目标程序包括:
在对所述源程序进行解释执行的过程中,将所述源程序编译为所述目标程序;或者,
将所述源程序AOT编译为所述目标程序。
6.根据权利要求1所述的方法,所述段号或者所述段基址预先存储在第二预设存储空间,以使所述地址检查机器码在执行时从第二预设存储空间处获取所述段基址中包含的所述段号。
7.根据权利要求6所述的方法,第二预设存储空间包括下述任一:寄存器、所述虚拟地址段中预定义的内存空间或所述虚拟地址段外预定义的内存空间。
8.根据权利要求6所述的方法,第二预设存储空间仅参与生成所述地址检查机器码的编译过程。
9.根据权利要求1所述的方法,所述目标程序的首地址与所述虚拟地址段的段基址对齐。
10.根据权利要求1所述的方法,所述内存访问代码包括字节码。
11.根据权利要求1所述的方法,所述源程序或所述目标程序为部署于区块链***中的智能合约。
12.一种防内存越界的程序编译装置,包括:
地址检查机器码编译单元,用于在将源程序编译为目标程序的过程中,针对所述源程序中的内存访问代码生成地址检查机器码,所述目标程序对应的内存分配空间处于一段连续的虚拟地址段内,所述虚拟地址段的段基址包含位于高位的段号和位于低位的若干零值逻辑位,所述虚拟地址段的段长不小于所述若干零值逻辑位所能够表示的最大地址空间;所述地址检查机器码用于:
针对所述内存访问代码所需访问的目标内存空间,将所述目标内存空间对应的线性地址的高位数据与所述段基址中包含的段号进行比较,所述线性地址为所述目标内存空间相对于所述段基址的段偏移量与所述段基址之和,且所述高位数据与所述段号的位数相同;
在比较结果为相同的情况下,允许根据所述线性地址访问内存中的所述目标内存空间。
13.一种电子设备,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器通过运行所述可执行指令以实现如权利要求1-11中任一项所述的方法。
14.一种计算机可读存储介质,其上存储有计算机指令,其特征在于,该指令被处理器执行时实现如权利要求1-11中任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111033647.0A CN113672237B (zh) | 2021-09-03 | 2021-09-03 | 防内存越界的程序编译方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111033647.0A CN113672237B (zh) | 2021-09-03 | 2021-09-03 | 防内存越界的程序编译方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113672237A CN113672237A (zh) | 2021-11-19 |
CN113672237B true CN113672237B (zh) | 2022-03-11 |
Family
ID=78548431
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111033647.0A Active CN113672237B (zh) | 2021-09-03 | 2021-09-03 | 防内存越界的程序编译方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113672237B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115422554B (zh) * | 2022-10-25 | 2023-03-24 | 支付宝(杭州)信息技术有限公司 | 请求处理方法、编译方法和可信计算*** |
CN117435440B (zh) * | 2023-12-20 | 2024-04-05 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及*** |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106682492A (zh) * | 2015-11-06 | 2017-05-17 | 大唐移动通信设备有限公司 | 一种内存越界的管理方法及装置 |
WO2019231194A1 (ko) * | 2018-05-28 | 2019-12-05 | 삼성전자 주식회사 | 메모리 오류를 검출하는 방법 및 시스템 |
CN111124921A (zh) * | 2019-12-25 | 2020-05-08 | 北京字节跳动网络技术有限公司 | 内存越界的检测方法、装置、设备和存储介质 |
CN111338794A (zh) * | 2020-02-18 | 2020-06-26 | 苏州洞察云信息技术有限公司 | 一种内存越界监控方法、装置及存储介质 |
CN112905998A (zh) * | 2021-02-26 | 2021-06-04 | 中国人民解放军国防科技大学 | 基于代码段随机切换的地址导向型攻击防护方法及装置 |
-
2021
- 2021-09-03 CN CN202111033647.0A patent/CN113672237B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106682492A (zh) * | 2015-11-06 | 2017-05-17 | 大唐移动通信设备有限公司 | 一种内存越界的管理方法及装置 |
WO2019231194A1 (ko) * | 2018-05-28 | 2019-12-05 | 삼성전자 주식회사 | 메모리 오류를 검출하는 방법 및 시스템 |
CN111124921A (zh) * | 2019-12-25 | 2020-05-08 | 北京字节跳动网络技术有限公司 | 内存越界的检测方法、装置、设备和存储介质 |
CN111338794A (zh) * | 2020-02-18 | 2020-06-26 | 苏州洞察云信息技术有限公司 | 一种内存越界监控方法、装置及存储介质 |
CN112905998A (zh) * | 2021-02-26 | 2021-06-04 | 中国人民解放军国防科技大学 | 基于代码段随机切换的地址导向型攻击防护方法及装置 |
Non-Patent Citations (3)
Title |
---|
Linux-内存越界;qq62;《https://blog.csdn.net/qq_42139383/article/details/109822884》;20201119;第1-4页 * |
Nucleus PLUS的动态内存管理机制研究;姬希娜;《单片机与嵌入式***应用》;20180430;第6-10页 * |
堆,栈等概念以及内存泄露,内存溢出,内存越界等问题;C++初学者555;《https://blog.csdn.net/qq_40140790/article/details/100159160》;20190901;第1-8页 * |
Also Published As
Publication number | Publication date |
---|---|
CN113672237A (zh) | 2021-11-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109359487B (zh) | 一种基于硬件隔离的可扩展安全影子存储及标签管理方法 | |
CN1147775C (zh) | 受保护的存储器***和方法 | |
CN108205502B (zh) | 轻量可信任务 | |
JP5914145B2 (ja) | メモリ保護回路、処理装置、およびメモリ保護方法 | |
CN113672237B (zh) | 防内存越界的程序编译方法及装置 | |
CN113468079B (zh) | 内存访问方法及装置 | |
WO2019180401A1 (en) | An apparatus and method for storing bounded pointers | |
CN113485716B (zh) | 防内存越界的程序编译方法及装置 | |
JP2021532468A (ja) | メモリ・システム内に記憶されているメモリ保護テーブルを使用するメモリ保護ユニット | |
WO2019237866A1 (zh) | 一种运行时访问控制方法及计算装置 | |
JP7291149B2 (ja) | メモリ・アクセスにおける保護タグ・チェックの制御 | |
KR20200131855A (ko) | 태그 보호된 메모리 시스템에 대한 랜덤 태그 설정 명령 | |
JP2021531583A (ja) | メモリ・システム内に記憶されている制御テーブルのための二分探索手順 | |
US20190370439A1 (en) | Secure system on chip for protecting software program from tampering, rehosting and piracy and method for operating the same | |
JP7269942B2 (ja) | 複数ガード・タグ設定命令 | |
US20170262382A1 (en) | Processing device, information processing apparatus, and control method of processing device | |
US9639477B2 (en) | Memory corruption prevention system | |
JP2023526811A (ja) | タグチェック装置及び方法 | |
JP2015158936A (ja) | データ処理装置 | |
CN114691532A (zh) | 内存访问方法、内存地址分配方法及装置 | |
JP7349437B2 (ja) | メモリ・アクセスにおける保護タグ・チェックの制御 | |
CN115994348A (zh) | 程序流水线的控制方法、处理装置和存储介质 | |
US20140281582A1 (en) | Protecting visible data during computerized process usage | |
US11055202B1 (en) | Compilation scheme for tagged global variables | |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |