CN115994348A - 程序流水线的控制方法、处理装置和存储介质 - Google Patents
程序流水线的控制方法、处理装置和存储介质 Download PDFInfo
- Publication number
- CN115994348A CN115994348A CN202211447401.2A CN202211447401A CN115994348A CN 115994348 A CN115994348 A CN 115994348A CN 202211447401 A CN202211447401 A CN 202211447401A CN 115994348 A CN115994348 A CN 115994348A
- Authority
- CN
- China
- Prior art keywords
- memory
- tag
- memory tag
- instruction
- mark
- 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
Landscapes
- Storage Device Security (AREA)
Abstract
一种程序流水线的控制方法、处理装置和存储介质。该方法包括:接收第一指令;获取第一指令对应的第一内存标记信息,其中,第一内存标记信息包括第一内存标记,第一内存标记对应于存储第一指令的第一存储位置;获取目标地址对应的第二内存标记信息,其中,第二内存标记信息包括第二内存标记,第二内存标记对应于第一指令的目标地址在内存空间中的第二存储位置,第二存储位置存储有程序流水线中的返回地址或跳转目标指令;基于第一内存标记信息和第二内存标记信息,确定第一内存标记和第二内存标记是否匹配;响应于第一内存标记和第二内存标记匹配,允许第一指令继续执行,否则,进入异常处理。该程序流水线的控制方法改善了系统的安全性。
Description
技术领域
本公开的实施例涉及一种程序流水线的控制方法、处理装置和存储介质。
背景技术
内存安全是计算机主机安全的关键方向,而控制流完整性保护又是维护内存安全、阻断黑客攻击的重要手段。近年来各个硬件处理器厂商均推出自己的硬件扩展和软件配套方案,对控制流完整性保护提供了不同程度的支持,这些方案包括Intel的CET(Control-flow Enforcement Technology)、ARM的PACBTI(Pointer AuthenticationCode&Branch Target Identification)扩展等。但是,在这些商业化的系统方案中,需要综合考虑性能、兼容性和安全性等因素,对安全特性做出取舍,从而在各自系统架构的设计空间中选取最优点。因此,各个厂商的安全方案中虽然各有自己的优势,但也在一定程度上暴露出了这些方案的劣势。
Intel CET具有以下缺点:(1)标记类型有限,仅仅支持一种落地点标记,无法区分多种落地点标记,这可能意味着ROP(面向返回编程,return-oriented programming)等一类代码重用攻击仍然有可重用的代码段;(2)影子栈(Shadow Stack)需要开辟专用的内存空间,如果内存粒度大会造成空间浪费;(3)影子栈需要保持与原有栈同步更新与访问,会导致效率降低,比如原有的返回地址入栈操作、出栈操作,均由一个访存请求变成了两个访存请求,而且这两个地址请求在内存中分布较远。
ARM PACBTI扩展具有以下缺点:(1)ARM PAC借助了指针空位来存储验证码的技术,但该技术不适合指针没有空位的架构,比如32位架构;(2)ARM BTI中的落地点标记类型仅区分两类(函数调用与间接分支),无法满足更多落地点的区分需求,比如,ARM BTI无法区分不同函数的落地点。
随着新架构(如RISC-V)和新应用(如AIoT)的出现,软硬件系统的设计空间空前增加,因此有利于设计出比传统方案更安全且高效的方案。
发明内容
本公开的至少一个实施例提供了一种程序流水线的控制方法,该方法包括:接收第一指令;获取所述第一指令对应的第一内存标记信息,其中,所述第一内存标记信息包括第一内存标记,所述第一内存标记对应于存储所述第一指令的第一存储地址在内存空间中的第一存储位置;获取所述目标地址对应的第二内存标记信息,其中,所述第二内存标记信息包括第二内存标记,所述第二内存标记对应于所述第一指令目标地址在所述内存空间中的第二存储位置,所述第二存储位置存储有所述程序流水线中的返回地址或跳转目标指令;基于所述第一内存标记信息和所述第二内存标记信息,确定所述第一内存标记和所述第二内存标记是否匹配;响应于所述第一内存标记和所述第二内存标记匹配,允许所述第一指令继续执行,或者,响应于所述第一内存标记和所述第二内存标记不匹配,进入异常处理。
本公开的至少一个实施例提供了一种处理装置,该处理装置包括:接收单元,配置为接收第一指令;第一获取单元,配置为获取所述第一指令对应的第一内存标记信息,其中,所述第一内存标记信息包括第一内存标记,所述第一内存标记对应于存储所述第一指令的第一存储地址在内存空间中的第一存储位置;第二获取单元,配置为获取所述目标地址对应的第二内存标记信息,其中,所述第二内存标记信息包括第二内存标记,所述第二内存标记对应于所述第一指令的目标地址在所述内存空间中的第二存储位置,所述第二存储位置存储有所述程序流水线中的返回地址或跳转目标指令;确定单元,基于所述第一内存标记信息和所述第二内存标记信息,确定所述第一内存标记和所述第二内存标记是否匹配;操作单元,响应于所述第一内存标记和所述第二内存标记匹配,允许所述第一指令继续执行,或者,响应于所述第一内存标记和所述第二内存标记不匹配,进入异常处理。
本公开的至少一个实施例提供了一种处理装置,该处理装置包括:处理单元和存储器,在所述存储器上存储有一个或多个计算机程序模块;其中,所述一个或多个计算机程序模块被配置为由所述处理单元执行时实现上述实施例所述的控制方法。
本公开的至少一个实施例提供了一种非瞬时可读存储介质,其中,所述非瞬时可读存储介质上存储有计算机指令,其中,所述计算机指令被处理器执行时实现上述实施例所述的控制方法。
本发明实施例的基于内存标记的程序流水线的控制方案相对于纯软件方案的效率更高,安全性更好。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对实施例的附图作简单地介绍,显而易见地,下面描述中的附图仅仅涉及本公开的一些实施例,而非对本公开的限制。
图1A示出了根据本公开一实施例的计算机系统中内存空间的示意图;
图1B示出了根据本公开另一实施例的计算机系统中内存空间的示意图;
图2A示出使用本公开实施例的内存标记对内存空间的访问进行保护的流程图;
图2B示出了使用本公开实施例的内存标记实施程序流水线控制的示意图;
图3A示出了使用本公开实施例的一个示例的内存标记实施程序流水线控制的示意图;
图3B示出了使用本公开实施例的一个示例的内存标记实施程序流水线控制的示意图;
图4示出了使用本公开实施例的另一个示例的内存标记实施程序流水线控制的示意图。
图5A示出了使用本公开实施例的另一个示例的内存标记实施程序流水线控制的示意图;
图5B示出了根据本公开至少一实施例的包括内存标记的内存地址的示例;
图6示出了使用本公开实施例的另一个示例的内存标记实施程序流水线控制的示意图;
图7展示了一种示例性的实现内存标记对应内存粒度的配置方案;
图8示出了根据本公开至少一实施例的处理装置的示意图;
图9为本公开至少一个实施例提供的一种电子装置的示意框图。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例的附图,对本公开实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本公开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
除非另作定义,此处使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。同样,“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
为了应对计算机面临的内存安全问题,本公开的多个实施例提供了一种标记内存方案,该方案通过标记内存及其提供的细粒度内存保护,例如通过软硬件协同处理以保护对于计算机内存的访问,以较低的成本实现对计算机系统的保护,以缓解或避免内存安全违例带来的威胁。
图1A示出了根据本公开一实施例的计算机系统中内存空间的示意图。本公开的至少一实施例提供的标记内存方案中,如图1A所示,计算机系统的内存空间10包括安全内存空间100和非安全内存空间200,例如将计算机系统的内存空间10划分为安全内存空间100和非安全内存空间200。安全内存空间100和非安全内存空间200都可以作为传统程序的运行空间,用于存储数据或指令以及传统的运行状态信息等。安全内存空间100和非安全内存空间200在内存空间10中的占比可以是固定的或动态的,在二者间的占比为动态的情形,可以由操作系统根据运行的进程来增加或回收安全内存空间100。
图1B示出了根据本公开另一实施例的计算机系统中内存空间的示意图。例如,在另一个实施例中,内存空间10仅包括安全内存空间100(即全部的程序运行空间都被赋予标记),又例如可以在安全内存空间100之外单独开辟一个标记空间,用于仅仅存储标记本身以及标记的相关管理数据(标记元数据)而不是作为程序的运行空间。
在安全内存空间100中,将对应的内存空间按照预定大小划分为多份内存子空间101_1…101_n等,并且对每份内存子空间101进行标记,赋予内存标记(label),因此安全内存空间100在本公开中也称为“标记内存空间”或“标记内存”,即被赋予了内存标记的内存空间。因此,安全内存空间100中存储的数据或指令被相应地赋予了内存标记。
如图1A和图1B所示,在安全内存空间100中,对于内存子空间101_1赋予标记La1,对于内存子空间101_2赋予标记La2,……,对于内存子空间101_n赋予标记Lan。由此,内存子空间101_1、101_2等与对应的内存标记La1、La2等具有映射关系,也即,指向内存子空间101_1内的一个或多个内存地址与对应的内存标记La1具有该映射关系,指向内存子空间101_2内的一个或多个内存地址与对应的内存标记La2具有该映射关系……。内存子空间101_1、101_2等的物理地址可以连续的,也可以是彼此分散的。
如下面所述的,内存标记La1、La2等的值例如可以基于随机数得到,或者可以基于预设规则得到。例如,彼此相邻的内存子空间的标记的值彼此不同,或者在预定空间大小范围内(例如连续相邻的4个、8个、16个等内存子空间构成的地址段内)各个内存子空间的内存标记的值彼此不同,又或者,例如安全内存空间内的全部内存子空间的标记的值彼此都不同(虽然这需要内存标记本身可能的值的数量很大)。在非安全内存空间200中,则与常规的内存空间相同,不按份划分也不进行标记。
安全内存空间100的最小粒度(即一份内存子空间101的预定大小,又可以称为“内存粒度”(MG,Memory Granularity))可以是固定的,或者根据需要设置,例如可以根据处理器的硬件规格决定,例如,内存空间的最小粒度可以设置一个字,也可以设置为2个字、4个字、8个字等。
在本公开的至少一个实施例中,标记内存和内存标记之间采用的是物理地址或者虚拟地址映射的方式。如果使用物理地址映射,则系统在运行使用基于虚拟地址的程序时需要在执行时把虚拟地址通过处理器的存储管理单元(MMU)翻译过后得到物理地址,然后由系统使用物理地址完成对内存标记的读写。
如上所述,安全内存空间的内存粒度可以固定,或者可以根据需要设置;该内存粒度的设置例如保存在系统中的预定存储位置或预定寄存器中,以供处理器在运行的过程中根据需要调用。内存标记本身所占据存储空间的大小(即标记宽度(Label Width))也可以是固定的,或者可以根据需要设置;该标记大小例如保存在预定存储位置(例如单独开辟的标记存储空间)或预定寄存器中,以供处理器在运行的过程中根据需要调用。
例如,在本公开的至少一个实施例中,设置了安全寄存器(SEC寄存器),该安全寄存器设置为一种控制与状态寄存器(CSR)寄存器。该寄存器用于保存系统中的标记内存粒度(MG)和标记宽度(LS)。该寄存器还可以用于存储当前标记所对应的安全策略,以根据取值控制标记的变更或者改变指令的行为,比如在发生异常时的处理方式等。
在本公开的实施例中,例如,可以通过指令对安全内存空间中的每一份内存空间进行标记,并且也可以对需要保护的内存地址、指针等(在本公开的实施例中为了简便起见也统称“目标地址”)进行标记,即对内存地址、指针等也赋予标记。这种内存标记也可以称为“安全标记”。
这样,在本公开的实施例中,在计算机系统中(例如处理器)通过识别内存内容对应的内存标记的取值,可以将内存的不同区域区分为具有不同安全配置的内存空间。每一个安全内存空间的内存子空间可以是连续的,也可以是不连续的。例如,当设置某程序在安全内存空间中运行时,则可以在启动该程序的进程时,由系统创建其安全内存子空间,为其中对应于内存粒度的安全内存子空间赋予其特定的内存标记,由此对其中存储的数据和指令赋予了内存标记。而当另一个程序运行时,系统可以创建具有不同安全标记的内存子空间,则两个程序可以保证相互隔离,只能在自己所属的隔离环境中执行而互不侵犯。又例如,在一项程序的编译过程中确定并记录了程序代码中的访存指令与该访存指令操作的对象数据之间的关系,因此在创建安全内存空间时可以对该访存指令的存储位置和该对象数据的存储位置赋予相同的内存标记或相同类型的内存标记(例如用于同一用户的内存标记)等,即对该访存指令所在的安全内存子空间和该对象数据所在的安全内存子空间赋予相同的内存标记或相同类型的内存标记等。进一步地,如果在编译过程中对不同程序指令的分类、分组并标记不同的安全标记,则这些不同类、不同组的指令也可以使用标记匹配规则保证相互隔离。
在本公开不同的实施例中,内存标记可以以不同的方式存储,例如,可以在内存中单独划分出用于存储内存标记的空间(该空间可以独立于前述安全内存空间和非安全内存空间被寻址和访问)、在系统中单独设置用于存储内存标记的存储装置等。
在计算机程序执行的过程中,以流水线的方式进行,程序流水线中,在一段程序中包括顺序结构、IF选择结构(如果…那么)、WHILE重复结构(当满足条件…则重复)、UNTIL循环结构(重复…直到条件满足)、CASE多分支结构等,并且还会因为子程序调用或函数(或子函数)调用而跳转,并且在子程序或函数执行完成之后回到原来的程序。
图2A示出了使用本公开至少一实施例的内存标记实施程序流水线控制的流程图。如图2A所示,该程序流水线的控制方法包括如下的步骤210~步骤260:
步骤210:接收第一指令。
步骤220:获取第一指令对应的第一内存标记信息。
第一内存标记信息包括第一内存标记,第一内存标记对应于存储第一指令的第一存储地址在内存空间中的第一存储位置。
步骤230:获取目标地址对应的第二内存标记信息。
第二内存标记信息包括第二内存标记,第二内存标记对应于第一指令的目标地址在内存空间中的第二存储位置。
第一指令的目标地址对应的第二存储位置存储有程序流水线中的返回地址(目标跳转地址)或跳转目标指令(图中也简称“目标指令”)。例如,通过该目标地址来设置程序计数器值(PC),从而实现程序流水线的跳转,通过重新设置后的程序计数器值来进行取值,以执行目标指令。
步骤240:基于第一内存标记信息和第二内存标记信息,确定第一内存标记和第二内存标记是否匹配;
步骤250:响应于第一内存标记和第二内存标记匹配,允许第一指令继续执行,或者,
步骤260:响应于第一内存标记和第二内存标记不匹配,进入异常处理。
该异常处理的程序或过程例如包括根据预定的安全策略选择忽略错误恢复执行、记录异常行为并恢复执行或停止访存指令执行等操作。
例如,在停止访存指令执行之后,例如进行报警等,本公开的实施例对此不作限制。通过图2A所示的实施例的内存标记匹配的流程来实施程序流水线的控制,由此提高了计算机系统的安全性。
图2B示出了使用本公开至少一实施例的内存标记实施程序流水线控制的示意图。如图2B所示,第一指令具有目标地址、操作码等。第一指令自身在内存空间中的存储地址(第一存储地址)位于安全内存子空间(第一存储位置)311中,对应于该安全内存子空间311提供有内存标记信息L11(第一内存标记信息)。内存标记信息L11包括对应于该安全内存子空间311的内存标记(第一内存标记),由此可以获取该第一内存标记。
第一指令201可以是内存加载/存储指令,从第一指令201的目标地址可以获取需要加载或者存储的内存地址,例如该目标地址是返回地址在栈中的存储地址,由此对应于目标地址,对于在内存空间中的安全内存子空间(第二存储位置)321,提供有内存标记信息L21(第二内存标记信息)。内存标记信息L21包括对应于该安全内存子空间321的内存标记(第二内存标记),由此可以获取该第二内存标记。例如,该安全内存子空间321可以对应于栈帧,因此其中存储有对应于入栈的(程序调用对应的)返回地址。
第一指令201也可以是跳转指令,从第一指令201的目标地址可以获取跳转目标指令,例如该目标地址是跳转目标指令的存储地址,由此对应于目标地址,对于在内存空间中的安全内存子空间(第二存储位置)321,提供有内存标记信息L21(第二内存标记信息)。内存标记信息L21包括对应于该安全内存子空间321的内存标记(第二内存标记),由此可以获取该第二内存标记。例如,该安全内存子空间321可以对应于目标函数(或代码分支)所在的代码段,因此其中存储有函数入口(或分支入口)的相关指令,这些相关指令为跳转目标指令。
基于第一内存标记信息和第二内存标记信息,确定第一内存标记和第二内存标记是否匹配。如果二者匹配,允许第一指令继续执行,否则进入异常处理,例如停止第一指令执行。
并且,如图2B所示,对于与安全内存子空间311相邻的其他安全内存子空间提供有内存标记信息L10、L12、L13等,并且这些安全内存子空间可以用于存储程序(或进程)在运行过程中将使用的指令。对于与安全内存子空间321相邻的其他安全内存子空间提供有内存标记信息L20、L22、L23等,并且这些安全内存子空间用于存储程序(或进程)在运行过程中将使用的指令。
在某一示例中,例如,内存标记信息L10、L12、L13等对应的安全内存子空间与内存标记信息L20、L22、L23等对应的安全内存子空间可能彼此相邻,也可以相距较远,且两个安全子空间的标记取值可以相同或者不同,例如,内存标记信息L12和L22是同一个标记。
例如,从第一内存标记信息L11中提取第一内存标记,从第二内存标记信息L21中提取第二内存标记;由此,比较第一内存标记和第二内存标记,以确定第一内存标记和第二内存标记是否匹配。
如图2B所示,从第一内存标记信息中提取第一内存标记以及从第二内存标记信息中提取第二内存标记,可以包括:获取第一内存标记或第二内存标记对应的标记宽度信息;根据标记宽度信息,从第一内存标记信息中提取部分数据位以得到第一内存标记,以及从第二内存标记信息中提取部分数据位以得到第二内存标记。
例如,可以通过标记检查模块获取第一内存标记对应的标记宽度信息或第二内存标记对应的标记宽度信息,然后由该标记宽度信息从第一内存标记信息中提取部分数据位以得到第一内存标记,由该标记宽度信息从第二内存标记信息中提取部分数据位以得到第二内存标记。之后,判断获取的第一内存标记和获取的第二内存标记是否匹配。例如,标记元数据(metadata)包括标记宽度信息,即标记检查模块可以从标记元数据可以获取所需要的标记宽度信息等。标记元数据还可以包括内存粒度信息等。标记检查模块可以不仅选择标记宽度/内存粒度,还可以需要根据标记检查规则检查标记之间的匹配与否等。
在不同的示例中,用于比较的第一内存标记和第二内存标记二者的宽度可以是不同,也可以是相同的。
在至少一个示例中,如果用于比较的第一内存标记和第二内存标记二者的宽度被定义为不同宽度,则系统可以灵活的定义特定的匹配规则来确定两个宽度不同的标记是否匹配。比如,将较长标记与较短标记具有模式包含关系定义为匹配,从而实现同一个较长标记可以与多个不同取值的较短标记匹配等。
在至少一个实例中,如果用于比较的第一内存标记和第二内存标记二者的宽度被定义为必须相等,则可以仅获取第一内存标记和第二内存标记之一的标记宽度信息,并且将其作为第一内存标记和第二内存标记的标记宽度信息;相反,如果第一内存标记和第二内存标记二者的宽度不相等,那么所获取的第一内存标记和所获取的第二内存标记之一将出现错误,由此也将导致后续的比较结果为不匹配。或者,在至少一个示例中,同时获取第一内存标记和第二内存标记的标记宽度信息,并将获得的两个标记宽度信息进行比较,如果二者不相等,则后续不再判断第一内存标记和第二内存标记是否匹配,直接终止第一指令的处理,而进入异常处理,反之则继续进行上面描述的后续处理。
前述“部分数据位”例如为内存标记信息中预定的基址开始的预定数据位(偏移),该基址例如为最高位或最低位,或中间某一位,并且选择中间某一位时,则需要进一步预定偏移的方向。
在本公开的至少一示例,上述第一指令可以为前向跳转指令,则该跳转指令的目标地址指向的存储位置中存储有跳转目标指令;或者,第一指令为程序调用代码的序言部分包括的将目标地址写回内存的存储指令,或者为程序调用代码的结尾部分包括的将目标地址加载到寄存器的加载指令,即目标地址为栈帧的相应地址,而目标地址指向的存储位置中存储有程序调用代码的返回地址。
例如,前向跳转指令包括分支指令或跳转指令;并且在该情形下,程序流水线也包括指令预取过程,例如处理器执行过程中的分支预测过程。下面以分支指令为例进行说明,跳转指令的情形类似。
图3A示出了执行分支指令的过程中检查内存标记的过程的示意图。如图3A所示,在对当前指令取指之后,获取当前指令对应的内存标记(即第一内存标记);在对当前指令译码之后,判断当前指令是否为分支指令。
在当前指令为分支指令的情况下(即第一指令),获取该分支指令指向的目标地址,获取该目标地址的内存标记(即第二内存标记);进行内存标记检查,确定第一内存标记和第二内存标记是否匹配。在二者匹配的情况下,实际执行分支指令,获取目标地址指向的跳转目标指令,由此对分支指向的跳转目标指令进行取指,以作指令跳转,实现程序流水线控制,或者在指令预取的情况下,进行对应的跳转目标指令进行预取;否则,进入异常处理。
在当前指令不为分支指令的情况下,则进入与该当前指令对应的处理流程,例如正常执行当前指令。
上述内存标记检查过程可以在对第一指令在译码且进入发射队列之后进行,例如可以在该第一指令的目标地址对应的寄存器可用(即第一指令满足发射条件)之前进行,或者可以在在该第一指令的目标地址对应的寄存器可用(即第一指令满足发射条件)之后但在指令发射之前进行。
例如,在RISC-V指令集中,跳转指令主要包括JAL和JALR。
例如,JAL的指令格式为JAL rd,offset,其中,x[rd]=pc+4;pc+=sext(offset)。该指令把下一条指令的地址(PC+4)存入rd寄存器中作为返回地址,然后把PC(程序计数器)设置为当前值加上符号位扩展的偏移量得到跳转地址,即跳转以执行该位置存储的指令。这里,sext是sign-extend(符号扩展)的缩写,表示将立即数扩展到32位。
JALR的指令格式为JALR rd,offset(rs1),其中,t=pc+4;pc=(x[rs1]+sext(offset))&~1;x[rd]=t。该指令将PC设置为rs1寄存器中的值加上符号位扩展的偏移量,把计算出地址的最低有效位设为0得到跳转地址,即跳转以执行该位置存储的指令,并将原PC+4的值写入rd寄存器作为返回地址。如果不需要目的寄存器,则可以将rd设置为x0。
例如,在RISC-V指令集中,分支指令主要包括BEQ、BNE、BLT、BLTU、BGE和BGEU,其中:
·BEQ(相等时分支)的指令格式为BEQ rs1,rs2,offset,其中,如果(rs1=rs2),那么pc+=sext(offset);
·BNE(不相等时分支)的指令格式为BNE rs1,rs2,offset,其中,如果(rs1≠rs2),那么pc+=sext(offset);
·BLT(小于时分支)的指令格式为BLT rs1,rs2,offset,其中,如果(rs1<rs2),那么pc+=sext(offset);
·BLTU(无符号小于时分支)的指令格式为BLTU rs1,rs2,offset,其中,如果(rs1<rs2),那么pc+=sext(offset);
·BGE(大于等于时分支)的指令格式为BGE rs1,rs2,offset,其中,
如果(rs1≥rs2),那么pc+=sext(offset);
·BGEU(大于等于时分支)的指令格式为BGEU rs1,rs2,offset,其中,如果(rs1≥rs2),那么pc+=sext(offset)。
在函数或子程序的调用的过程中,会涉及到将寄存器中存到栈上(入栈)等操作,以及将栈上数据读入到寄存器中(出栈)等操作。这些操作通常是固定的,在函数开头执行的操作被称为序言部分(Prologue),在函数返回前执行的操作被称为结尾部分(Epilogue)。例如,程序调用代码中的序言部分和结尾部分通常是编译器(compiler)在生成目标代码时自行增加的。例如,在如下的涉及X86指令集的汇编代码中的调用函数functionX的代码中,序言部分包括下面的前三行,而结尾部分包括下面的后三行:
push ebp//将寄存器ebp入栈
mov ebp,esp//将当前栈顶指针赋予寄存器ebp
sub esp,local_size//对栈顶指针赋值
…
mov esp,ebp//将栈顶指针修改为寄存器ebp的值
pop ebp//将寄存器ebp出栈
ret//返回
上述代码中,pop/push涉及内存读写操作,call指令返回地址入栈,ret指令有对于返回地址出栈的操作。例如,对于这种成对的针对地址的内存-寄存器读写操作,通常在对指令译码之后产生的微指令中包括存储(store)指令和加载(load)指令来实现入栈和出栈。对于栈上的不同数据,比如返回地址等,以及操作这些数据的相应的不同指令,均可以用本公开的至少一实施例提供的标记方案保护起来,防止非法指令的篡改。比如,当函数主体中如果有栈溢出的漏洞,导致函数体中的指令要覆盖序言部分所存储在栈上的返回地址时,因函数体中的指令标记和返回地址在栈上的标记不匹配,就会在非法篡改时发生异常;或者在另一个实施例中,可以允许函数体中指令的非法篡改,但是在函数尾部加载返回地址时发现标记不一致而发生异常。
图3B示出了程序返回过程中执行存储指令或加载指令的过程中检查内存标记的过程的示意图,可以用于保护存储在栈上的返回地址等不同类型的信息。
比如,在程序调用或者返回过程中,在对当前指令取指之后,获取当前指令对应的内存标记(即第一内存标记);在对当前指令译码之后,判断当前指令是否为针对函数栈帧的存储指令或加载指令。
在当前指令为存储指令或加载指令的情况下(即第一指令),获取该存储指令或加载指令指向的目标地址(比如,用于存储返回地址的栈地址),获取该目标地址的内存标记(即第二内存标记);进行内存标记检查,确定第一内存标记和第二内存标记是否匹配。在二者匹配的情况下,实际执行存储指令或加载指令,对栈(内存)进行访问;否则,进入异常处理。
在当前指令不为存储指令或加载指令的情况下,则进入与该当前指令对应的处理流程,例如正常执行当前指令。
图4示出了使用本公开实施例的一个示例的内存标记实施程序流水线控制的示意图。
又例如,在至少一个示例中,获取第一内存标记或第二内存标记对应的标记宽度信息,包括:获取第一内存标记信息或第二内存标记信息对应的标记存储位置;根据标记存储位置获取标记元数据(包含标记宽度信息)。
如图4所示,在图2B所示示例的基础上,获取第一内存标记信息对应的标记存储位置和第二内存标记信息对应的标记存储位置,由对应的标记存储位置可以对应获取所存储的标记元数据,由此获得标记宽度信息。
同样地,基于在正常情况下用于比较的第一内存标记和第二内存标记二者的宽度应该相等的假设,可以基于第一内存标记信息对应的标记存储位置或第二内存标记信息对应的标记存储位置,由选择的标记存储位置可以对应获取所存储的标记元数据(包含宽度信息)。如图4所示,选择第一内存标记信息L11对应的标记存储位置(即L11.Addr)来获得所存储的标记宽度信息。如图4所示,标记存储位置和对应的标记元数据可以二维表格的形式存储,类似于页表。
或者,在至少一个示例中,基于第一内存标记信息对应的标记存储位置和第二内存标记信息对应的标记存储位置,分别获取两个标记存储位置所存储的标记元数据,例如标记宽度信息,并将获得的两个标记宽度信息进行比较,如果系统要求标记宽度必须匹配,但二者不相等,则后续不再判断第一内存标记和第二内存标记是否匹配,而是直接终止访存指令的处理,进入异常处理,反之则继续进行上面描述的后续处理。
在至少一个示例中,标记存储位置可以位于内存空间中被选择专用于存储内存标记信息的存储页、存储段,或者位于独立于内存空间的存储装置。例如,该独立于内存空间的存储装置例如为专用的RISC-V PMP、ARM MPU等物理内存隔离区域实现隔离。
在至少一个实例中,标记存储位置可以独立于普通内存空间之外。例如专门的DRAM设备、SRAM设备等,或者DRAM的特定物理分区、缓存的特定分区等等。在这种实现中专用的设备可以通过专用的硬件设计保证隔离,而不需要使用或者定义存储页、存储段来保护。
在至少一个实例中,标记取值的传输路径可以共享现有的数据通路,也可以使用专用的数据通路实现访问,譬如使用现有的总线传输标记,或者使用独立的总线信号专用于传输标记等。
图5A示出了使用本公开实施例的一个示例的内存标记实施程序流水线控制的示意图。
又例如,在至少一个示例中,获取第一内存标记或第二内存标记对应的标记元数据,例如标记宽度信息,包括:从访存指令的第一存储地址或目标地址本身中的冗余位获取标记元数据,例如标记宽度信息。
如图5A所示,在图2B所示示例的基础上,目标地址本身高位部分包括对应的内存标记元数据,例如,该内存标记元数据包括内存标记宽度信息(而低位部分则包括目标地址的有效地址部分),由此从目标地址本身就可以提取目标标记的宽度信息。
对于内存地址等赋予的内存标记可以与该内存地址本身整合为一体,例如通过复用系统设定的内存地址中的富余位来保存每个内存地址、指针等对应的内存标记或内存标记宽度。例如,在64位处理器架构中,系统位宽为64位(bit),然而系统中的虚拟地址通常不会使用全部64位;例如,RISC-V指令集中虚拟地址目前通常使用sv32、sv39和sv48三种分页模式,因此在64位的系统中,上述三种分页模式下,虚拟地址的低32位、低39位和低48位记载了全部有效地址(页表号+页内偏移)。因此,系统的虚拟地址中在高位存在无用位(例如,这些无用位通常为0),而低位则已经记载了全部有效地址信息。因此,可以利用64位架构中虚拟地址中高位余量来记载该地址对应的内存标记或内存标记宽度。在至少一个示例中,在使用这种地址空余量来存储标记相关信息时,对于所用地址空余位的访问设置访问控制权限,以避免普通程序的读写导致标记信息的泄露或者被篡改。
图5B示出了根据本公开至少一实施例的包括内存标记的内存地址的示例;如图5B所示,一项内存地址包括高位部分以及低位部分,例如,对于64位地址而言,如果对应于sv48分页模式,可以选择高位部分为最高的16位(即[63:48]),而其余的低位部分则为最低的48位(即[47:0])。例如,高位部分的全部或部分用于记录内存标记或内存标记元数据,例如选择最高的16位中的8位作为内存标记位,例如选择[63:56]作为内存标记位用于记录对应的内存标记或内存标记元数据;低位部分则用于记录有效地址,该有效地址部分共有48位,对应于理论上最多248字节大小的内存空间。
图6示出了使用本公开实施例的一个示例的内存标记实施程序流水线控制的示意图。
又例如,在至少一个示例中,获取第一内存标记或第二内存标记对应的标记元数据,例如标记宽度信息,包括:从内存空间中与第一存储地址或目标地址相邻的存储地址获取标记元数据,例如标记宽度信息。
如图6所示,在图2B所示示例的基础上,在内存空间中,目标地址与目标地址对应的内存标记的内存标记元数据,例如,该内存标记元数据包括标记宽度信息,这些内存标记元数据的存储地址彼此相邻(例如,二者之间的地址偏移量可以提前设置为某一固定数值,由此便于寻址),例如二者分别落入相邻的双字或相邻的存储块(memory block)中等,例如,目标地址对应的存储位置(例如如图1A和图1B所示的安全内存子空间,第二存储位置)和目标地址对应的标记宽度信息所在的存储位置(例如如图1A和图1B所示的安全内存子空间)彼此相邻。
对应地,访存指令的存储地址与该访存指令的存储地址对应的内存标记的标记宽度信息的存储地址彼此相邻(例如,二者之间的地址偏移量可以提前设置为某一固定数值,由此便于寻址),例如二者分别落入相邻的双字或存储块中等,例如,访存指令的存储地址对应的存储位置(例如如图1A和图1B所示的安全内存子空间,第一存储位置)和该访存指令的存储地址对应的标记宽度信息所在的存储位置(例如如图1A和图1B所示的安全内存子空间)彼此相邻。存储块的大小例如可以为32个字或64个字等。
又例如,在至少一个示例中,获取第一内存标记或第二内存标记对应的标记元数据,例如标记宽度信息,包括:从第一寄存器中获取标记元数据(例如标记宽度信息),其中,标记元数据由系统设置于第一寄存器中。该第一寄存器可以是前述提及的安全寄存器(SEC寄存器)。
再例如,在上面描述的示例的基础上,例如,基于上述图2B、图4、图5A和图6所示的示例的基础上,在获取第一内存标记或第二内存标记对应的标记宽度信息的同时获取内存空间中的标记内存粒度(MG)信息。例如,标记宽度信息和标记内存粒度信息一体存储,由此在获取第一内存标记或第二内存标记对应的标记宽度信息的同时获取内存空间中的标记内存粒度信息。根据标记内存粒度信息,可以确定标记内存粒度的大小,由此当前确定例如两个目标地址或存储地址在同一个内存子空间内时,则在获取一个目标地址或存储地址对应的内存标记时,则也获得另一个目标地址或存储地址的内存标记。
在本公开的至少一个实施例中,第一内存标记信息还包括指示第一内存标记为针对指令的第一类型信息,第二内存标记信息还包括指示第二内存标记为针对数据的第二类型信息。例如,内存标记信息包括1位(类型指示位)来指示对应的内存标记是针对数据(跳转地址或返回地址)还是针对指令,例如,该类型指示位为0时表示数据,而为1时表示指令。又例如,内存标记信息可以多位表示多种类型,或针对不同的函数/程序设置不同的类型。
至少在本公开的上述实施例中,比较第一内存标记和第二内存标记,以确定第一内存标记和第二内存标记是否匹配,包括:确定第一内存标记和第二内存标记是否符合标记检查规则。例如,确定第一内存标记和第二内存标记是否符合标记检查规则,包括:确定第一内存标记和第二内存标记是否相同;或者确定第一内存标记和第二内存标记是否位于同一取值范围。
例如,在至少一个示例中,对应于第一内存标记和第二内存标记是否位于同一取值范围的情形,第一内存标记和第二内存标记各自的高n位根据当前系统的用户设置,这里n为正整数。例如,在系统中为每个用户或进程分配一个3位的数字标识(例如随机值),即n取3,该3位的数字标识作为内存标记的高3位,而内存标记除高3位之外的低位部分(例如5个或更多位)则例如是系统根据安全内存子空间分配的数值(例如随机值),因此,对于同一个用户分配的标记内存空间的内存标记的高3位都是相同,由此可以凭借该内存标记实现访问控制,提高计算机系统的安全性。
在本公开的实施例中,标记宽度和标记内存粒度均可由系统进行配置,例如在系统启动时配置,或者在系统运行的过程中动态配置。
在至少一个示例中,为了简化硬件实现,可以标记内存粒度和标记宽度在实现中合二为一。而硬件允许软件在标记的使用过程中,定义不同的内存粒度和标记宽度。例如,硬件实现的最小内存粒度是4bytes,最小标记宽度的最小宽度是2bits,则最基础的内存/标记比特比为32:2。而软件在编译和运行过程中,可以选择的内存粒度为4~12bytes等等,而对应的标记的宽度也可以选择(受最大的硬件标记宽度限制)为2~6bits。或者内存粒度和标记宽度可以保持默认取值。在默认取值的配置下,也可以首先决定标记内存粒度的大小,然后根据标记内存粒度的大小,确定对应的标记宽度。
图7示出了根据本公开至少一实施例的利用可变长度内存标记定义落地点标记/返回地址标记的示例的示意图。
在本公开的另一个实施例中,如图7的左侧表格所示,对于落地点function1_start其类型(代码类型)为“1”,对应于标记宽度为8位,对应的标记值为0x01;对于落地点function2_start其类型为“0”,对应于标记宽度为4位,对应的标记值为0x2;对于落地点bar_start其类型为“1”,对应于标记宽度为8位,对应的标记值为0x13;对于落地点foo_start其类型为“2”,对应于标记宽度为16位,对应的标记值为0x0119。这里,function1、function2、bar和foo等指代不同的函数,而_start指代这些函数的入口指令地址(落地点)。
在本公开的另一个实施例中,如图7的右侧表格所示,对于返回地址ret-addr-1其类型(标记类型)为“0”,对应于标记宽度为8位,对应的标记值为0x01;ret-addr-1其类型为“0”,对应于标记宽度为8位,对应的标记值为0x0A。
在本公开的实施例中,标记宽度通过代码类型或者标记类型确定之后,不同标记的取值范围便确定下来,然后根据不同标记的取值,达到对不同函数落地点(即不同跳转目标)和不同函数返回地址的区分。
在本公开的实施例中,在系统中对于内存标记可以通过一条或多条用于标记内存的指令进行操作的,例如,这些用于标记内存的指令包括用于生成标记、存储标记、读取标记、赋予标记、访存指令、修改标记等操作的指令,这些指令在不同的指令集(ISA)中可以根据相应的ISA的规范进行构建,这里不再赘述。
根据本公开的至少一个实施例提供了一种处理装置,图8示出了该处理装置的示意图。如图8所示,该处理装置800包括接收单元801、第一获取单元802、第二获取单元803、确定单元804和操作单元805。
接收单元801配置为接收第一指令;
第一获取单元802配置为获取第一指令对应的第一内存标记信息,其中,第一内存标记信息包括第一内存标记,第一内存标记对应于存储第一指令的第一存储地址在内存空间中的第一存储位置;
第二获取单元803配置为获取目标地址对应的第二内存标记信息,其中,第二内存标记信息包括第二内存标记,第二内存标记对应于第一指令的目标地址在内存空间中的第二存储位置,所述第二存储位置存储有所述程序流水线中的返回地址或跳转目标指令;
确定单元804基于第一内存标记信息和第二内存标记信息,确定第一内存标记和第二内存标记是否匹配;
操作单元805响应于第一内存标记和第二内存标记匹配,允许第一指令继续执行,或者,响应于第一内存标记和第二内存标记不匹配,进入异常处理。
例如,在至少一个示例中,在上述处理装置中,确定单元包括内存标记提取子单元和比较子单元。内存标记提取子单元配置为从第一内存标记信息中提取第一内存标记以及从第二内存标记信息中提取第二内存标记;比较子单元配置为比较第一内存标记和第二内存标记,以确定第一内存标记和第二内存标记是否匹配。
例如,在至少一个示例中,在上述处理装置中,内存标记提取子单元包括标记检查模块和提取模块。标记检查模块配置为获取第一内存标记或第二内存标记对应的标记宽度信息;提取模块配置为根据标记宽度信息,从第一内存标记信息中提取部分数据位以得到第一内存标记,以及从第二内存标记信息中提取部分数据位以得到第二内存标记。
例如,在至少一个示例中,标记检查模块进一步配置为,获取第一内存标记信息或第二内存标记信息对应的标记存储位置,根据标记存储位置获取标记宽度信息。例如,标记存储位置位于内存空间中被选择专用于存储内存标记信息的存储页、存储段,或者位于独立于内存空间的存储装置。
或者,标记检查模块进一步配置为,从第一指令的目标地址本身中的冗余位获取标记宽度信息。
或者,标记检查模块进一步配置为,从内存空间中与第一存储地址或目标地址相邻的存储地址获取标记宽度信息。
或者,标记检查模块进一步配置为,从第一寄存器中获取标记宽度信息,其中,标记宽度信息由系统设置于第一寄存器中。例如,该第一寄存器为前述安全寄存器(SEQ寄存器)。
在至少一个示例中,标记检查模块进一步配置为,在获取第一内存标记或第二内存标记对应的标记宽度信息的同时获取内存空间中的标记内存粒度信息。例如,标记宽度信息和标记内存粒度信息一体存储。例如,标记元数据包括标记宽度信息和标记内存粒度信息,通过标记元数据可以获得标记宽度信息和/或标记内存粒度信息。
在至少一个示例中,比较子单元进一步配置为确定第一内存标记和第二内存标记是否相同,或者确定第一内存标记和第二内存标记是否位于同一取值范围。
在本公开的至少一实施例中,标记格式定义的基本元素可以包括以下一种或多种特征的组合:a)标记宽度;b)被打标记的内存子空间是否为代码(指令);c)被打标记的内存子空间的特定标识。例如,标记的解析规则与标签的格式紧密绑定,一一对应。
在本公开的至少一实施例中,可以通过在进程的创建、程序的加载过程中对程序进行修改,以便对程序中的代码和数据打上用于实现程序流水线的控制的内存标记。例如,可以通过扩展编译器和工具链来实现。例如,通过程序的自动分析,可以完全避免对应用程序源代码的修改。
在本公开的至少一实施例中,用于程序流水线的控制的标记本身可以与普通数据共同存储在系统内存中,例如具体的实现方式可能是下面的一种或者多种方式的组合:a)用于标记的内存空间与用于普通数据或指令的内存空间之间具有固定占比或者动态占比;b)用于标记的内存空间与用于普通数据或指令的内存空间相邻存储或者分开存储;c)将内存标记和部分标记解析逻辑存储在源代码、二进制程序中;d)通过缓存机制、影子硬件等机制加速用于标记的内存空间的访问;e)通过并发设计加速用于标记的内存空间与用于普通数据或指令的内存空间的快速访问。
本公开至少一实施例的程序流水线的控制方法以及相应的处理装置具有如下的优势至少一项或多项:
(1)支持多个落地点标记的定义,从而可以区分多种类型的落地点,能够支持最大限度的区分所有不同的函数入口,以及不同的分支入口。
(2)标记宽度可以自定义,且宽度不受限于指针的空余位数,从而可以在系统需求较少的落地点数量时使用宽度较小的标记,而使用宽度较大的标记来区别更多的代码落地点。
(3)可以实现对栈内部存储的细粒度访问控制,以字节/字粒度对内存的标签进行解析,可以实现函数内部不同指令对该栈内空间设置不同的权限,从而达到对如返回地址等关键数据的保护,避免了在基于影子栈的一类方法中造成的内存浪费和性能损失。
本公开的一些实施例还提供了一种处理装置,该处理装置包括处理单元和存储器,存储器上存储有一个或多个计算机程序模块;该一个或多个计算机程序模块被配置为由所述处理单元执行时实现如本公开任一实施例所述的控制方法。
本公开的一些实施例还提供了一种非瞬时可读存储介质,其中,所述非瞬时可读存储介质上存储有计算机指令,其中,所述计算机指令被处理器执行时实现如本公开任一实施例所述的控制方法。
例如,该处理单元为中央处理器(CPU)、数字信号处理器(DSP)等。例如,该非瞬时可读存储介质实现为存储器,例如易失性存储器和/或非易失性存储器。上述实施例中存储器可以为易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓存等。非易失性存储器例如可以包括只读存储器(ROM)、硬盘、可擦除可编程只读存储器(EPROM)、便携式紧致盘只读存储器(CD-ROM)、USB存储器、闪存等。
该存储器中还可以存储各种应用程序(代码、指令)和各种数据以及应用程序使用和/或产生的各种数据等,在一些示例中,还可以存储有数据或指令对应的内存标记信息(以及内存标记)。
本公开的一些实施例还提供了一种电子装置,该电子装置包括上述计算机装置,该计算机装置包括上述处理装置或者可执行上述访存方法。
图9为本公开至少一个实施例提供的一种电子装置的示意框图。本公开实施例中的电子装置可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。
图9示出的电子装置1000仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。例如,如图9所示,在一些示例中,电子装置1000包括处理装置,该处理装置可以包括上述任一实施例的处理装置,其可以根据存储在只读存储器(ROM)1002中的程序或者从存储装置1008加载到随机访问存储器(RAM)1003中的程序而执行各种适当的动作和处理。在RAM 1003中,还存储有计算机系统操作所需的各种程序和数据。处理器1001、ROM1002以及RAM 1003通过总线1004被此相连。输入/输出(I/O)接口1005也连接至总线1004。
例如,以下部件可以连接至I/O接口1005:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置1006;包括诸如液晶显示器(LCD)、扬声器、振动器等的输出装置1007;包括例如磁带、硬盘等的存储装置1008;例如还可以包括诸如LAN卡、调制解调器等的网络接口卡的通信装置1009。通信装置1009可以允许电子装置1000与其他设备进行无线或有线通信以交换数据,经由诸如因特网的网络执行通信处理。驱动器1010也根据需要连接至I/O接口1005。可拆卸存储介质1011,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1010上,以便于从其上读出的计算机程序根据需要被安装入存储装置1008。
虽然图9示出了包括各种装置的电子装置1000,但是应理解的是,并不要求实施或包括所有示出的装置。可以替代地实施或包括更多或更少的装置。
例如,该电子装置1000还可以进一步包括外设接口(图中未示出)等。该外设接口可以为各种类型的接口,例如为USB接口、闪电(lighting)接口等。该通信装置1009可以通过无线通信来与网络和其他设备进行通信,该网络例如为因特网、内部网和/或诸如蜂窝电话网络之类的无线网络、无线局域网(LAN)和/或城域网(MAN)。无线通信可以使用多种通信标准、协议和技术中的任何一种,包括但不局限于全球移动通信系统(GSM)、增强型数据GSM环境(EDGE)、宽带码分多址(W-CDMA)、码分多址(CDMA)、时分多址(TDMA)、蓝牙、Wi-Fi(例如基于IEEE 802.11a、IEEE 802.11b、IEEE 802.11g和/或IEEE 802.11n标准)、基于因特网协议的语音传输(VoIP)、Wi-MAX,用于电子邮件、即时消息传递和/或短消息服务(SMS)的协议,或任何其他合适的通信协议。
例如,电子装置1000可以为手机、平板电脑、笔记本电脑、电子书、游戏机、电视机、数码相框、导航仪、家用电器、通信基站、工业控制器、服务器等任何设备,也可以为任意的数据处理装置及硬件的组合,本公开的实施例对此不作限制。
对于本公开,还有以下几点需要说明:
(1)本公开实施例附图只涉及到与本公开实施例涉及到的结构,其他结构可参考通常设计。
(2)在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合以得到新的实施例。
以上仅是本公开的示范性实施方式,而非用于限制本公开的保护范围,本公开的保护范围由所附的权利要求确定。
Claims (17)
1.一种程序流水线的控制方法,包括:
接收第一指令;
获取所述第一指令对应的第一内存标记信息,其中,所述第一内存标记信息包括第一内存标记,所述第一内存标记对应于存储所述第一指令的第一存储地址在内存空间中的第一存储位置;
获取所述目标地址对应的第二内存标记信息,其中,所述第二内存标记信息包括第二内存标记,所述第二内存标记对应于所述第一指令的目标地址在所述内存空间中的第二存储位置,所述第二存储位置存储有所述程序流水线中的返回地址或跳转目标指令;
基于所述第一内存标记信息和所述第二内存标记信息,确定所述第一内存标记和所述第二内存标记是否匹配;
响应于所述第一内存标记和所述第二内存标记匹配,允许所述第一指令继续执行,或者,响应于所述第一内存标记和所述第二内存标记不匹配,进入异常处理。
2.根据权利要求1所述的控制方法,其中,基于所述第一内存标记信息和所述第二内存标记信息,确定所述第一内存标记和所述第二内存标记是否匹配,包括:
从所述第一内存标记信息中提取所述第一内存标记以及从所述第二内存标记信息中提取所述第二内存标记;
比较所述第一内存标记和所述第二内存标记,以确定所述第一内存标记和所述第二内存标记是否匹配。
3.根据权利要求2所述的控制方法,其中,从所述第一内存标记信息中提取所述第一内存标记以及从所述第二内存标记信息中提取所述第二内存标记,包括:
获取所述第一内存标记或所述第二内存标记对应的标记宽度信息,
根据所述标记宽度信息,从所述第一内存标记信息中提取部分数据位以得到所述第一内存标记,以及从所述第二内存标记信息中提取部分数据位以得到所述第二内存标记。
4.根据权利要求3所述的控制方法,其中,获取所述第一内存标记或所述第二内存标记对应的标记宽度信息,包括:
获取所述第一内存标记信息或所述第二内存标记信息对应的标记存储位置;
根据所述标记存储位置获取所述标记宽度信息。
5.根据权利要求3所述的控制方法,其中,获取所述第一内存标记或所述第二内存标记对应的标记宽度信息,包括:
从所述目标地址本身中的冗余位获取所述标记宽度信息。
6.根据权利要求3所述的控制方法,其中,获取所述第一内存标记或所述第二内存标记对应的标记宽度信息,包括:
从所述内存空间中与所述第一存储地址或所述目标地址相邻的存储地址获取所述标记宽度信息。
7.根据权利要求3所述的控制方法,其中,获取所述第一内存标记或所述第二内存标记对应的标记宽度信息,包括:
从第一寄存器中获取所述标记宽度信息,其中,所述标记宽度信息由系统设置于所述第一寄存器中。
8.根据权利要求4-7任一所述的控制方法,其中,在获取所述第一内存标记或所述第二内存标记对应的标记宽度信息的同时获取所述内存空间中的标记内存粒度信息。
9.根据权利要求2-7任一所述的控制方法,其中,比较所述第一内存标记和所述第二内存标记,以确定所述第一内存标记和所述第二内存标记是否匹配,包括:
确定所述第一内存标记和所述第二内存标记是否符合标记检查规则。
10.根据权利要求1所述的控制方法,其中,所述第一指令为前向跳转指令,所述目标地址指向所述跳转目标指令,或者
所述第一指令为程序调用代码的序言部分包括的将所述目标地址写回内存的存储指令,或者为程序调用代码的结尾部分包括的将所述目标地址加载到寄存器的加载指令,所述目标地址指向所述程序调用代码的返回地址。
11.根据权利要求10所述的控制方法,其中,所述前向跳转指令包括分支指令或跳转指令。
12.根据权利要求11所述的控制方法,其中,对于所述前向跳转指令,所述程序流水线包括指令预取过程。
13.一种处理装置,包括:
接收单元,配置为接收第一指令;
第一获取单元,配置为获取所述第一指令对应的第一内存标记信息,其中,所述第一内存标记信息包括第一内存标记,所述第一内存标记对应于存储所述第一指令的第一存储地址在内存空间中的第一存储位置;
第二获取单元,配置为获取所述目标地址对应的第二内存标记信息,其中,所述第二内存标记信息包括第二内存标记,所述第二内存标记对应于所述第一指令的目标地址在所述内存空间中的第二存储位置,所述第二存储位置存储有所述程序流水线中的返回地址或跳转目标指令;
确定单元,基于所述第一内存标记信息和所述第二内存标记信息,确定所述第一内存标记和所述第二内存标记是否匹配;
操作单元,响应于所述第一内存标记和所述第二内存标记匹配,允许所述第一指令继续执行,或者,响应于所述第一内存标记和所述第二内存标记不匹配,进入异常处理。
14.根据权利要求13所述的处理装置,其中,所述确定单元包括:
内存标记提取子单元,配置为从所述第一内存标记信息中提取所述第一内存标记以及从所述第二内存标记信息中提取所述第二内存标记;
比较子单元,配置为比较所述第一内存标记和所述第二内存标记,以确定所述第一内存标记和所述第二内存标记是否匹配。
15.根据权利要求14所述的处理装置,其中,所述内存标记提取子单元包括:
标记检查模块,配置为获取所述第一内存标记或所述第二内存标记对应的标记宽度信息,
提取模块,配置为根据所述标记宽度信息,从所述第一内存标记信息中提取部分数据位以得到所述第一内存标记,以及从所述第二内存标记信息中提取部分数据位以得到所述第二内存标记。
16.一种处理装置,包括:
处理单元,
存储器,其上存储有一个或多个计算机程序模块;
其中,所述一个或多个计算机程序模块被配置为由所述处理单元执行时实现如权利要求1-12中任一所述的控制方法。
17.一种非瞬时可读存储介质,其中,所述非瞬时可读存储介质上存储有计算机指令,其中,所述计算机指令被处理器执行时实现如权利要求1-12中任一所述的控制方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211447401.2A CN115994348A (zh) | 2022-11-18 | 2022-11-18 | 程序流水线的控制方法、处理装置和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211447401.2A CN115994348A (zh) | 2022-11-18 | 2022-11-18 | 程序流水线的控制方法、处理装置和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115994348A true CN115994348A (zh) | 2023-04-21 |
Family
ID=85989526
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211447401.2A Pending CN115994348A (zh) | 2022-11-18 | 2022-11-18 | 程序流水线的控制方法、处理装置和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115994348A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117076330A (zh) * | 2023-10-12 | 2023-11-17 | 北京开源芯片研究院 | 一种访存验证方法、系统、电子设备及可读存储介质 |
-
2022
- 2022-11-18 CN CN202211447401.2A patent/CN115994348A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117076330A (zh) * | 2023-10-12 | 2023-11-17 | 北京开源芯片研究院 | 一种访存验证方法、系统、电子设备及可读存储介质 |
CN117076330B (zh) * | 2023-10-12 | 2024-02-02 | 北京开源芯片研究院 | 一种访存验证方法、系统、电子设备及可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3716081A1 (en) | Memory protection with hidden inline metadata | |
CN1258702C (zh) | 为不同的指令集结构所编写的固件之间进行通信的方法 | |
US10635823B2 (en) | Compiling techniques for hardening software programs against branching programming exploits | |
US20060064576A1 (en) | Boot systems and methods | |
JP2005032259A (ja) | 共有ライブラリーシステム及び前記システム構築方法 | |
US10795997B2 (en) | Hardened safe stack for return oriented programming attack mitigation | |
US20120246437A1 (en) | Method and apparatus for using unused bits in a memory pointer | |
CN113468079B (zh) | 内存访问方法及装置 | |
JP2021512400A (ja) | メモリ・アクセスにおける保護タグ・チェックの制御 | |
CN115994348A (zh) | 程序流水线的控制方法、处理装置和存储介质 | |
CN113485716B (zh) | 防内存越界的程序编译方法及装置 | |
CN115879107A (zh) | 计算机装置及其访存方法、处理装置和存储介质 | |
CN113835620B (zh) | 一种提高安全芯片应用执行效率的方法及系统 | |
CN113672237B (zh) | 防内存越界的程序编译方法及装置 | |
US11500982B2 (en) | Systems and methods for reliably injecting control flow integrity into binaries by tokenizing return addresses | |
US9639477B2 (en) | Memory corruption prevention system | |
WO2023016481A1 (zh) | 一种数据处理方法及相关装置 | |
CN115618336A (zh) | 缓存及其操作方法、计算机装置 | |
US9135144B2 (en) | Integrated circuits and methods for debugging | |
US20210182175A1 (en) | Compilation scheme for tagged global variables | |
US20090089768A1 (en) | Data management for dynamically compiled software | |
CN115964311A (zh) | 访存方法、处理装置和存储介质 | |
CN118057377A (zh) | 访存方法、处理装置和存储介质 | |
US20190042116A1 (en) | Techniques for preventing memory corruption | |
EP4155950A1 (en) | Apparatus, computer-readable medium, and method for reducing bounds checking overhead by instrumenting pointer arithmetic |
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 |