一种基于缓存随机无效的处理器瞬态攻击防御方法与流程

文档序号:21034945发布日期:2020-06-09 20:22阅读:161来源:国知局
本发明涉及计算机
技术领域
:,具体来说涉及改善处理器安全性的机制和技术,更具体地说,涉及一种基于缓存随机无效的处理器瞬态攻击防御方法。
背景技术
::为了让处理器获得最佳性能,存储器的速度必须能够跟上处理器的速度。也就是说,当处理器在执行指令时,我们并不期望它因为等待指令或者操作数而暂停执行。因此,现代处理器的寄存器和主存之间引入了高速缓存(cache)。这样,计算机的存储器被组织成层次结构。最顶层(最靠近处理器的一层)是处理器内的寄存器,接下来是一级或者多级高速缓存,当使用多级缓存时,通常第一、第二、第三级高速缓存等依次被标记为l1、l2、l3等,再往下则是主存(通常也称主存储器或者内存),它通常由动态随机存取存储器(dram)构成,例如,参见图1,该图示出了现代处理器的一种常见的架构。沿着存储器层次结构自上到下,存储器成本也逐层下降,容量在变大,但存取时间在变长。全都使用最快的存储器的思路固然好,但是这样的成本也是最昂贵的,难以让大众能够消费,因此,通过使用更多较慢的存储器,以便达到存取时间和成本之间的均衡。并且,在存储器中恰当的组织程序和数据,使需要存取的数据通常在较快的存储器中,以避免处理器长时间等待数据,导致计算效率不高。除了高速缓存的设置,为了进一步提高计算效率,现代处理器还采用了投机执行(speculativeexecution)。通常,一条普通的计算指令1拍结束,一条访存指令如果缓存命中(hit),需要10到100拍;如果缓存未命中(miss,也称缺失),到主存里取,需要上万拍甚至更多。如果上一条指令被访存卡了十万拍,后面其他的指令只能等着上一条指令执行完再执行,则会严重影响计算效率。因此,现代处理器普遍使用投机执行的设计,其是一种用于提升程序性能的有效机制。简单地说,投机执行是指根据现有信息,利用空转时间投机执行一些指令,即,提前执行一些将来可能用得上,也可能用不上的指令。如果投机成功,则可以立即提交,提高计算效率,如果投机失败,指令执行完成后发现用不上,处理器会抛弃计算结果,并回退执行期间造成的副作用。但是,回退执行期间造成的副作用仅是针对处理器内的寄存器,而已经被投机的访存加载指令加载到缓存中的数据块是不会被处理的。2018年,熔断(meltdown)攻击和幽灵(spectre)攻击的披露,让投机执行实现机制中隐藏的巨大安全漏洞逐渐受到各领域开发者的广泛关注。熔断攻击由googleprojectzero团队提出。熔断攻击利用处理器中乱序执行时访存权限检查延迟以及异常现场恢复不彻底的漏洞,绕过操作系统中各种数据隔离机制,偷取内核等敏感区域的数据。幽灵攻击由瑞士格拉茨工业大学(grazuniversityoftechnology)moritzlipp等学者提出。幽灵攻击通过操控处理器分支预测器,使受攻击程序投机执行访存越界的指令,同时利用分支预测错误后现场恢复不彻底的漏洞,绕过各种边界检查机制,偷取进程空间内的各种私密数据。幽灵攻击的原理是:假设分支是用来对某个访存操作进行边界检查的,攻击者首先会控制程序进行不越界的访存,使检查在多数情况下都能通过,从而达到对分支预测器训练的目的。而后,攻击者会控制程序,进行一次越界的访存,该访存会通过投机的访存装载操作(load操作)访问敏感数据,并以此数据的值再访问攻击者布置好的数组,从而对缓存布局造成影响,由于分支预测器已被训练,所以处理器会投机执行这个操作。当处理器最终发现此处分支预测错误时,会对分支后续指令的影响进行消除,但是这种消除只会对流水线内部的各种部件进行,缓存布局没有回滚,所以后续攻击者可通过侧信道方法测量出缓存布局情况,并推测出敏感数据的值。熔断攻击、幽灵攻击以及类似的攻击方式,是利用处理器投机执行漏洞,并结合各种侧信道(sidechannel)探测方法发动的攻击,这类攻击方式可以称为侧信道攻击或者瞬态攻击(transientattack)。从以上漏洞的基本原理上看,熔断攻击和幽灵攻击都是处理器在投机执行失败时,对各种微架构(microarchitecture)部件恢复不彻底造成的,微架构,又称为微体系结构或者微处理器体系结构,微架构是在计算机工程中,将一种给定的指令集架构(instructionsetarchitecture)在处理器中执行的方法。一种给定的指令集可以在不同的微架构中执行。计算机架构是微架构和指令集设计的结合。而导致以上安全漏洞的根源源于处理器设计者普遍认为:微架构是程序不可见的。然而随着侧信道(sidechannel)等攻击方法的流行,各种微架构信息逐渐都可被攻击者探测、逆向,所以投机失败造成的信息泄漏才被发现。熔断攻击和幽灵攻击爆出后,处理器厂商和内核开发者都迅速发布了缓解措施,比如英特尔(intel)发布微码补丁,直接关闭了各种投机优化策略;linuxkernel社区在4.15版本上添加了内核页表隔离机制kpti(kernelpagetableisolation)。然而,从性能和安全性的角度来说,这些补丁都远达不到开发者的实际预期。针对这一现状,学术界提出了一系列更为有效的防御机制,下面对其中两类代表性技术进行简要介绍。第一类代表性技术是投机延迟技术,该技术最早由俄亥俄州立大学yinqianzhang团队提出。该技术通过修改处理器重排序缓冲器(re-orderbuffer,rob)及装载存储队列(load/storequeue,lsq)部件,判断投机的访存的装载指令之前是否有未解出的分支,或是其他可造成异常的指令,以决定当前是否将投机的访存的装载指令取到的结果前递给后续的指令,从而避免熔断攻击和幽灵攻击中投机执行结果对后续微架构的影响。类似的技术还有堪萨斯大学jacobfustos提出的幽灵守卫(spectreguard)。投机延迟机制对各种投机类型的侧信道攻击都有较好的防御效果。另外,相比于英特尔给出的直接关闭投机的方案,其性能损失更小。然而,由于对加载前递点的判断能力有限,要保证有效的安全,访存装载指令(load指令)还是会受到过于保守的推迟,从而对整个程序性能造成巨大影响,所以这种方法目前还是难以被开发者接受。在此基础上,为了避免流水线长期停顿,瑞典乌普萨拉大学的christossakalis等人提出了基于值预测的优化方法,该方法通过添加一个值预测器,该预测器类似于分支预测器,会根据记录的历史信息推测出应该装载出的值。但是,值预测需要在流水线内添加预测器,会增加核内面积,且开销依然较高。第二类代表性技术是投机隔离技术,该技术由伊利诺伊大学香槟分校mengjiayan团队提出。该技术的核心思想是在处理器核内设置一个投机缓冲区(speculativebuffer),用于保存该核心执行的投机的访存的装载指令取到的缓存行(cacheline)。投机成功就是确定某条执行过的指令以后能用上,而投机失败就是确定某条执行过的指令以后肯定用不上,所以,投机失败时需要进行寄存器状态的回滚。当投机失败时,投机缓冲区内的缓存行会随着投机的访存的装载指令一起被消除。当投机的访存装载指令提交(retire)时,就再次从内存中加载相应的缓存行,并和投机缓冲区中的缓存行进行比较,如果相同,证明投机缓冲区中的缓存行并没有违反缓存的一致性协议,可以生效,否则消除后续所有指令。这里的提交(retire)是指,在乱序处理器中,指令在译码后会进入重排序缓冲器,指令执行完后,不会立即结束,因为可能是投机执行的,rob是个循环队列,当指令到达rob头部时,就是看其是否应该提交(retire)的时候,对于投机的访存装载指令来说,如果前面的分支投机已确认正确,且前面按照程序序(programorder)执行的所有指令中没有任何指令发生异常,当投机的访存的装载指令到达rob头部时,该投机的访存的装载指令就可以提交。相比于投机延迟,投机隔离对处理器的修改更少,电路更为简单,且开销更小。但是由于要保证多核缓存的一致性,投机成功时还是需要付出较大的代价用于一致性检查。所以该方法依然没有被普遍接受。另外,由于在同步多线程smt(simultaneousmultiplethread)的情况下,同一核心内的线程会共享投机缓冲区,如果攻击者可以控制其中一个线程,就有可能发动并发(concurrent)攻击,探测到投机缓冲区中的内容。所以,其安全性相比于投机延迟更差。通过对以上漏洞进行分析,可以看出这是处理器本身存在的硬件上的漏洞,需要对处理器的缓存架构和缓存管理方式进行修改,才能更好地防御熔断攻击和幽灵攻击这类攻击。而这类攻击最主要的问题在于攻击者利用越界的投机执行造成缓存布局的改变,进而通过侧信道探测的方法获得秘密。因此,有必要对现有技术进行改进,让攻击者难以准确探测到利用越界的投机执行造成缓存布局的改变,以提升处理器的安全性。对于关于这攻击的更多的信息以及它们是如何开发使用缓存和投机执行的现代处理器的,可以参照例如下面的技术文献,其通过引用合并于此,犹如明确地阐述:[1]moritzlipp,michaelschwarz,danielgruss,thomasprescher,wernerhaas,andersfogh,jannhorn,stefanmangard,paulkocher,danielgenkin,yuvalyarom,andmikehamburg.2018.meltdown:readingkernelmemoryfromuserspace.inproceedingsofthe27thusenixconferenceonsecuritysymposium(sec'18).usenixassociation,berkeley,ca,usa,973-990.[2]kocher,paul,danielgenkin,danielgruss,wernerhaas,michaelhamburg,moritzlipp,stefanmangard,thomasprescher,michaelschwarzandyuvalyarom.“spectreattacks:exploitingspeculativeexecution.”2019ieeesymposiumonsecurityandprivacy(sp)(2018):1-19.[3]intelanalysisofspeculativeexecutionsidechannels.技术实现要素:因此,本发明的目的在于克服上述现有技术的缺陷,提供一种缓存管理方法、介质和数据处理装置。本发明的目的是通过以下技术方案实现的:根据本发明的第一方面,提供一种缓存管理方法,用于包含一级或者多级缓存的数据处理装置,每级缓存包括普通缓存和影子缓存,所述缓存管理方法包括:响应于访存请求,将包含投机的访存装载指令所需数据的数据块装载到普通缓存;在普通缓存的数据块被投机的访存装载指令装载进来的数据块踢出普通缓存时,将被踢出的数据块装入同级缓存的影子缓存,并且从所述普通缓存的所有缓存行中随机选择缓存行作为干扰缓存行,将干扰缓存行的数据块写到下一级存储介质后将干扰缓存行无效,其中,所述下一级存储介质是下一级缓存或者主存。根据本发明的一个实施例,所述缓存管理方法包括:在所述缓存中存储备选组号集合,所述备选组号集合包括随机选择缓存行时备选的缓存组的组号;在所述缓存中存储备选路号集合,所述备选路号集合包括随机选择缓存行时备选的缓存行的路号;响应于所述缓存的普通缓存的数据块被投机的访存装载指令装载进来的数据块踢出普通缓存的操作,按照以下方式从所述缓存的普通缓存的所有缓存行中随机选择缓存行作为干扰缓存行:从备选组号集合中随机选择一个组号以及从备选路号集合中随机选择一个路号,将位于该组号中该路号的缓存行作为随机选择的干扰缓存行。根据本发明的一个实施例,所述缓存管理方法还包括:响应于特定缓存组屏蔽请求,将所述特定缓存组屏蔽请求中指定的特定缓存组的组号从所述备选组号集合中移除。根据本发明的一个实施例,所述缓存管理方法包括:响应于访存请求,将包含非投机的访存装载指令所需数据的数据块装载到普通缓存,在普通缓存的数据块被非投机的访存装载指令装载进来的数据块踢出普通缓存时,将被踢出的数据块踢到下一级存储介质。根据本发明的一个实施例,普通缓存采用组相联映射来实现主存的数据块到缓存行的映射,影子缓存采用全相联映射来实现主存的数据块到缓存行的映射。根据本发明的一个实施例,所述缓存管理方法还包括:在所述缓存中存储每个缓存行对应的投机状态标记,其中,投机状态标记的第一状态值指示该缓存行的数据块是由投机的访存装载指令装载进来的,投机状态标记的第二状态值指示该缓存行的数据块由非投机的访存装载指令装载进来的,在所述缓存中存储每个缓存行对应的重排序索引标记,所述重排序索引标记用于指示将数据块装入该缓存行的投机的访存装载指令在重排序缓冲器中对应的重排序索引。根据本发明的一个实施例,所述缓存管理方法还包括:在投机的访存装载指令投机成功的情况下,根据该投机的访存装载指令在重排序缓冲器中对应的重排序索引,寻找重排序索引标记中记录的值等于该重排序索引的缓存行,将该缓存行对应的投机状态标记由第一状态值修改为第二状态值且清空重排序索引标记;和/或在投机的访存装载指令投机失败的情况下,根据该投机的访存装载指令在重排序缓冲器中对应的重排序索引,寻找重排序索引标记中记录的值等于该重排序索引的缓存行,将该缓存行标记为无效。根据本发明的一个实施例,所述缓存管理方法还包括:在装载数据块到缓存行的投机的访存装载指令的投机过程还未确定而处理器要再次访问该缓存行时,延迟访问结果的传输直到该投机的访存装载指令的投机过程已经确定,其中,在确定该投机的访存装载指令投机成功时,传输的访问结果为命中,在确定该投机的访存装载指令投机失败时,传输的访问结果为未命中。根据本发明的第二方面,提供一种计算机可读存储介质,其上包含有计算机程序,所述计算机程序可被处理器执行以执行如第一方面所述的缓存管理方法。根据本发明的第三方面,提供一种数据处理装置,包括:一个或者多个处理器;以及存储器,用于存储一个或多个可执行指令,所述存储器包括一级或者多级缓存和缓存控制器,每级缓存包括普通缓存和影子缓存;所述缓存控制器对所述一级或者多级缓存按照如第一方面所述的方法进行缓存管理。与现有技术相比,本发明的优点在于:在熔断(meltdown)和幽灵(spectre)攻击这类利用投机执行发起瞬态攻击的攻击机制下,在某级缓存的普通缓存的数据块被投机的访存装载指令装载进来的数据块踢出普通缓存时,将被踢出的数据块装入该普通缓存所在的缓存的影子缓存,而且从该普通缓存的所有缓存行中随机选择一个干扰缓存行,将该干扰缓存行的数据块写到下一级存储介质后将该干扰缓存行无效,通过干扰缓存行的访问速度的改变来干扰攻击者,使之不能获得能反推秘密的值的实际地址信息,有效地防止了被瞬态攻击探测到秘密的值。附图说明以下参照附图对本发明实施例作进一步说明,其中:图1为现有的一种三级缓存的示意图;图2为现有的处理器中投机的访存装载指令加载数据块到一个已满缓存组时该缓存组内原有数据块的流向示意图;图3为根据本发明实施例的一个示例性的某级缓存的结构示意图;图4为根据本发明实施例的数据处理装置中投机的访存装载指令和非投机的访存装载指令加载数据块到一个已满缓存组时该缓存组内原有数据块的流向;图5为根据本发明实施例的一个示例性的数据处理装置的架构示意图。具体实施方式为了使本发明的目的,技术方案及优点更加清楚明白,以下结合附图通过具体实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。如在
背景技术
:部分提到的,现代处理器本身存在硬件上的漏洞,需要对处理器的缓存架构进行修改,才能更好地防御熔断攻击和幽灵攻击这类攻击。而这类攻击最主要的问题在于攻击者利用越界的投机执行造成缓存布局的改变,进而通过侧信道探测的方法获得秘密。比如,参见图2,攻击者通过越界的投机的访存加载指令将数据块(可通过其地址反推得出秘密的值,因为其地址为秘密的值乘以攻击者已知的预设值)加载进缓存,将缓存内由攻击者预先布置好的数据块踢出该级缓存,导致了攻击者布置好的数据块的访问速度的改变,攻击者进一步通过获取其布置的缓存块的访问速度,则可以识别到其布置的数据块中,被踢出该级缓存的数据块的访问速度的改变,从而得到是哪个缓存块被踢出,以通过侧信道探测的方法获得秘密的值。而本发明通过在同级缓存内设置普通缓存和影子缓存,同级的普通缓存和影子缓存具有相同的访问速度级别,在同级缓存中,位于普通缓存和影子缓存的数据块的访问速度相同或者几乎是相同的,在一个数据块被从普通缓存踢到该普通缓存所在的缓存的影子缓存时,不会被攻击者探测到访问速度的改变。在熔断(meltdown)和幽灵(spectre)攻击这类利用投机执行发起侧信道攻击的攻击机制下,在某级缓存的普通缓存的数据块被投机的访存装载指令装载进来的数据块踢出普通缓存时,将被踢出的数据块装入该普通缓存所在的缓存的影子缓存,而且从该普通缓存的所有缓存行中随机选择一个干扰缓存行,将该干扰缓存行的数据块写到下一级存储介质后将该干扰缓存行无效,通过干扰缓存行的访问速度的改变来干扰攻击者,使之不能获得能反推秘密的值的实际地址信息,因此,本发明可以防止攻击者利用投机的访存装载指令将特定的数据块踢出某级缓存而造成其访问速度的改变,而且还随机选择干扰缓存行,将干扰缓存行的数据块设置为无效,使干扰缓存行的数据块的访问速度发生改变,以干扰攻击者,能有效防止被侧信道攻击探测到秘密的值。根据本发明的一个实施例,一种缓存管理方法,用于包含一级或者多级缓存的数据处理装置,该数据处理装置的每级缓存包括普通缓存和影子缓存。优选的,普通缓存采用组相联映射来实现主存的数据块到缓存行的映射,影子缓存采用全相联映射来实现主存的数据块到缓存行的映射。为了便于理解,此处对映射方式进行说明。目前,映射方式有三种,分别是直接映射、全相联映射和组相联映射:其中,直接映射是最简单的映射方式,是一种将主存中的每个数据块映射到缓存的一个特定可用的缓存行中的映射方式。对于直接映射方式,虽然某些数据块可能映射到不同的缓存行,某些数据块可能映射到同一缓存行,但每级缓存中对于主存的每个数据块,在缓存中有且仅设有一个与之对应的缓存行。全相联映射,是一种允许将主存的每个数据块装入该缓存的所有缓存行的映射方式。组相联映射,是一种允许将主存中的每个数据块映射到缓存的特定的多个但非所有缓存行的映射方式。换言之,如果缓存中只有一个缓存行可以放置某个数据块,则其为直接映射的缓存;如果缓存中有多个缓存行可以放置某个数据块,则其为组相联的缓存;如果缓存中的任何缓存行都可以放置某个数据块,则其为全相联的缓存。缓存可以是指令缓存和/或数据缓存。优选的,在每级缓存中,影子缓存的缓存行的行数大于等于该级缓存中普通缓存的缓存组的组数,小于等于该级缓存中普通缓存的所有缓存行的总行数。本发明的影子缓存采用全相联映射,全相联映射相当于只有一个缓存组,该缓存组内拥有更多的缓存行,可以使得进入影子缓存的数据块更难于被踢出,提高本发明的防御能力。根据本发明的一个实施例,参见图3,对缓存结构进行了调整,现有处理器的某级缓存只有一个缓存,相当于本发明的普通缓存,而本发明在某级缓存同时设置了普通缓存和影子缓存。此外,对于每个缓存行,现有处理器的缓存行是包括用于存储数据块的存储空间(data)、地址标记(tag)和缓存行状态标记(flag)。而本发明在缓存中新增了一些标记,以能实现本发明的缓存管理方法,即投机状态标记、重排序索引标记。本发明增加的投机状态标记、重排序索引标记可以与地址标记(tag)和缓存行状态标记(flag)一样,存储在标记阵列(tagarray)中。根据本发明的一个实施例,参见图4,本发明的缓存管理方法包括:响应于访存请求,将包含投机的访存装载指令所需数据的数据块装载到普通缓存,在普通缓存的数据块被投机的访存装载指令装载进来的数据块踢出普通缓存时,执行以下操作:将被踢出的数据块装入该普通缓存所在的缓存的影子缓存;并且从该级缓存的普通缓存的所有缓存行中随机选择缓存行作为干扰缓存行,将干扰缓存行的数据块写到下一级存储介质后将干扰缓存行无效,参见图4的“关联的操作”。应当理解的是,将被踢出的数据块装入该普通缓存所在的缓存的影子缓存是指将被踢出的数据块装入同级缓存的影子缓存,或者说,是指将被踢出的数据块装入与该普通缓存属于同级的影子缓存。本发明中,下一级存储介质可以是下一级缓存或者主存。如果是下一级缓存,则从某级缓存踢到下一级缓存的数据块可以装入下一级缓存的普通缓存中。该实施例的技术方案至少能够实现以下有益技术效果:在某级缓存的普通缓存的数据块被投机的访存装载指令装载进来的数据块踢出普通缓存时,会将被踢出的数据块装入同级缓存的影子缓存,由于每级缓存的普通缓存和影子缓存具有相同的访问速度级别,被投机的访存装载指令装载的数据块踢到影子缓存内的数据块的访问速度相同或者说几乎是相同的,难以被侧信道攻击的方式探测到访问速度的变化,从而有效的抵御了熔断(meltdown)和幽灵(spectre)攻击这类利用投机执行发起攻击的攻击机制;并且,本发明还会在某级缓存的普通缓存的数据块被投机的访存装载指令装载进来的数据块踢出普通缓存时,从该级缓存的普通缓存的所有缓存行中随机选择缓存行作为干扰缓存行,将干扰缓存行的数据块写到下一级存储介质后将干扰缓存行无效,这样,干扰缓存行的访问速度会发生改变,用以干扰攻击者,进一步提升了本发明的防御能力。根据本发明的一个实施例,本发明的缓存管理方法还包括:响应于访存请求,将包含非投机的访存装载指令所需数据的数据块装载到普通缓存,在普通缓存的数据块被非投机的访存装载指令装载进来的数据块踢出普通缓存时,将被踢出的数据块踢到下一级存储介质,参见图4的普通缓存中示出的第一个缓存行。比如,非投机的访存装载指令例如可以是atomic指令、store指令、内存屏障指令等。这些指令在执行时会按程序序执行,而非乱序执行,不会被熔断(meltdown)和幽灵(spectre)攻击这类攻击者利用,因此,可以在某级缓存的普通缓存的数据块被非投机的访存装载指令装载进来的数据块踢出普通缓存时,将被踢出的数据块踢出该级缓存,避免被这类指令踢出的数据块占用宝贵的影子缓存的资源,从而进一步保证本发明的防御效果。根据本发明的一个实施例,本发明的缓存管理方法还包括:在缓存中存储备选组号集合,备选组号集合包括随机选择缓存行时备选的缓存组的组号;在缓存中存储备选路号集合,备选路号集合包括随机选择缓存行时备选的缓存行的路号;和/或响应于该级缓存的普通缓存的数据块被投机的访存装载指令装载进来的数据块踢出普通缓存的操作,按照以下方式从该级缓存的普通缓存的所有缓存行中随机选择缓存行作为干扰缓存行:从备选组号集合中随机选择一个组号以及从备选路号集合中随机选择一个路号,将位于该组号中该路号的缓存行作为随机选择的干扰缓存行。比如,假设某级缓存有128组,每组8路,所有组都可选择,则备选组号集合包括的组号有0~127,备选路号集合包括的路号有0~7。如果一次随机选择缓存行时,随机选择的组号为99,路号为3,则缓存控制器会先将普通缓存的组号为99的缓存组的路号为3的缓存行选作干扰缓存行。优选的,从该级缓存的普通缓存的所有缓存行中随机选择缓存行作为干扰缓存行时,一次选择一个或者多个缓存行作为干扰缓存行。根据本发明的一个实施例,本发明的缓存管理方法还包括:响应于特定缓存组屏蔽请求,将特定缓存组屏蔽请求中指定的特定缓存组的组号从备选组号集合中移除。该实施例的技术方案至少能够实现以下有益技术效果:缓存中会装载一些关键数据、可信数据、内核中的某些数据,比如,内核页表的关键项对应的数据、程序的元数据、库函数的代码等,对于这些数据对应的缓存组,为了避免被防御机制影响,可以对其进行屏蔽,以防止其被防御机制所影响,这样做可以保证这些数据的性能不受影响。比如,假设某级缓存有128组,每组8路,特定缓存组屏蔽请求中指定屏蔽组号为111的特定缓存组,则将特定缓存组屏蔽请求中指定的特定缓存组的组号从备选组号集合中移除,备选组号集合包括的组号有0~110及112~127,备选路号集合包括的路号有0~7。在一次随机选择缓存行时,则会从0~110及112~127中随机选择一个组号,屏蔽了组号为111的缓存组,使之不受防御机制的影响。根据本发明的一个实施例,本发明的缓存管理方法还包括:在缓存中存储每个缓存行对应的投机状态标记,其中,投机状态标记的第一状态值指示该缓存行的数据块是由投机的访存装载指令装载进来的,投机状态标记的第二状态值指示该缓存行的数据块由非投机的访存装载指令装载进来的;在缓存中存储每个缓存行对应的重排序索引标记,重排序索引标记用于指示将数据块装入该缓存行的投机的访存装载指令在重排序缓冲器中对应的重排序索引。优选的,在某个投机的访存装载指令投机成功的情况下,根据该投机的访存装载指令在重排序缓冲器中对应的重排序索引,寻找重排序索引标记中记录的值等于该重排序索引的某缓存行,将该缓存行对应的投机状态标记由第一状态值修改为第二状态值且清空重排序索引标记。因为投机成功时,则可以认为该指令前面的指令都是正确执行的,投机成功后,该指令可以被视为非投机的指令。优选的,第一状态值例如可以是1,第二状态值例如可以是0。为了便于理解,此处对重排序缓冲器进行简要介绍。重排序缓冲器的装载队列中每一项都保存着一条已经发射,但还未提交的装载指令,具体包括:指令ip、指令访存地址、访存宽度、缓存命中情况、取回的数据。而且,每一项都有一个对应的单元号,即前面提及的重排序索引,通常也可被称为重排序缓冲器索引或者重排序缓存单元号。现有技术中,一个投机的访存装载指令投机失败后,是不对其装载到缓存中的数据块所在的缓存行进行操作的,也没有相应的标记能够标识缓存行,以识别该缓存行的数据块是由该指令装载进来的,而本发明通过重排序索引对缓存行进行标记,重排序索引标记用于指示将数据块装入该缓存行的投机的访存装载指令在重排序缓冲器中对应的重排序索引,这样则可以在某个投机的访存装载指令投机确定后,根据该指令在重排序缓冲器内的重排序索引,去找到缓存行内重排序索引标记内的值等于该重排序索引的缓存行,由此,以识别该缓存行的数据块是由该指令装载进来的。该实施例的技术方案至少能够实现以下有益技术效果:本发明通过增设投机状态标记,指示了装载数据块到该缓存行的指令的投机状态,而在投机确定后,通过增设的重排序索引标记,便于找到相应的缓存行,对其进行操作。根据本发明的一个实施例,本发明的缓存管理方法还包括:在某个投机的访存装载指令投机失败的情况下,根据该投机的访存装载指令在重排序缓冲器中对应的重排序索引,寻找重排序索引标记中记录的值等于该重排序索引的某缓存行,将该缓存行标记为无效。该实施例的技术方案至少能够实现以下有益技术效果:投机失败后,由于将该缓存行标记为无效,则攻击者也难以探寻到该数据块的访存速度变化,进一步提高了本发明的防御能力。可选的,在某个投机的访存装载指令投机失败的情况下,根据该投机的访存装载指令在重排序缓冲器中对应的重排序索引,寻找重排序索引标记中记录的值等于该重排序索引的某缓存行,仅将该缓存行标记为无效,而不修改或者说不清空投机状态标记和重排序索引标记,这样可以减少开销,因为标记为无效后,无效的缓存行的投机状态标记和重排序索引标记可以在下次有数据块写入时直接被覆盖,检测到无效后,处理器可以忽略投机状态标记和重排序索引标记,因此,无需使用额外的开销对投机状态标记和重排序索引标记进行修改。可选的,在某个投机的访存装载指令投机失败的情况下,根据该投机的访存装载指令在重排序缓冲器中对应的重排序索引,寻找重排序索引标记中记录的值等于该重排序索引的某缓存行,将该缓存行标记为无效,并将该缓存行的投机状态标记由第一状态值修改为第二状态值且清空重排序索引标记。清空重排序索引标记即将其内记录的值设置为空(nul)。根据本发明的一个实施例,本发明的缓存管理方法还包括:在装载数据块到某一缓存行的投机的访存装载指令的投机过程还未确定而处理器要再次访问该缓存行时,延迟访问结果的传输直到该投机的访存装载指令的投机过程已经确定,其中,在确定该投机的访存装载指令投机成功时,传输的访问结果为命中,在确定该投机的访存装载指令投机失败时,传输的访问结果为未命中。该实施例的技术方案至少能够实现以下有益技术效果:在投机确定前,处理器再次访问这个数据块的访问结果会延迟传输,以让攻击者不能探测到该数据块的真实访问速度,可以防止攻击者通过清空+重载方式(flush+reload),度量出投机引起的缓存副作用,提高了本发明的防御效果。根据本发明的一个实施例,一种计算机可读存储介质,其上包含有计算机程序,所述计算机程序可被处理器执行以执行如前述任一实施例所述的缓存管理方法。根据本发明的一个实施例,一种数据处理装置,包括:一个或者多个处理器;以及存储器,用于存储一个或多个可执行指令,所述存储器包括一级或者多级缓存和缓存控制器,每级缓存包括普通缓存和影子缓存;所述缓存控制器对所述一级或者多级缓存按照如前述任一实施例所述的方法进行缓存管理。优选的,同级的普通缓存和影子缓存具有相同或者几乎相同的存取速度。该实施例中缓存控制器进行缓存管理的细节与上述缓存管理方法的实施例的相对应,因此对于本发明实施例中未披露的细节,请参照本发明上述缓存管理方法的实施例。根据本发明的一个实施例,本发明的数据处理装置还包括转译后备缓冲器,转译后备缓冲器内设有页表解析缓冲区(pagetablewalkingrequestbuffer,pwrb),用于保存投机状态还未确定但是需要进行页表访问的请求,页表访问的请求是在该请求对应的投机的访存装载指令的投机状态确定后才进行处理,其中,如果投机成功,则根据该请求开始页表访问,如果投机失败,则删除该请求。该实施例的技术方案至少能够实现以下有益技术效果:本发明通过增设页表解析缓冲区,既可以避免流水线阻塞,又可以抵挡攻击者采用熔断(meltdown)和幽灵(spectre)攻击这类利用投机执行发起攻击的方式来对转译后备缓冲器发起攻击,进一步提高了本发明的防御能力或者说安全性。为了便于理解,下面通过一个具体的示例来说明本发明的技术方案。根据本发明的一个示例,参见图5,数据处理装置可以是微处理器、数据处理芯片、计算设备。假设该示例的数据处理装置包括两级缓存和四个核心。第一级缓存(l1cache)设置在核心内,每个核心各有一个普通缓存(normalcache)和影子缓存(shadowcache),第二级缓存(l2cache)或者说最后一级缓存(lastlevelcache,llc))是整个处理器共享,二者是包含(inclusive)关系。主存控制器连接于主存和系统总线。主存控制器用于管理主存。为了简化,缓存控制器未在图5中示出。主存控制器的连接方式、缓存控制器的连接方式都是本领域现有技术,本发明对此不作任何限制。微处理器设有i/o控制器。i/o设备可以通过i/o控制器连接于系统总线。以上假设仅是示意性的,只是为了简化分析过程,本发明不依赖于任何具体的缓存结构或一致性协议。第一级缓存的普通缓存可以进一步分为指令缓存(i-cache)和数据缓存(d-cache)。指令缓存用于缓存处理器取指阶段访问过的数据。指令缓存的大小例如可以是32kb,采用组相联映射,每个缓存行(cacheline)是64b,共分为128组,每组4路,即一组有4个缓存行。数据缓存用于缓存处理器访存阶段访问过的数据。数据缓存的大小例如可以是64kb,采用组相联映射,每个缓存行是64b,共分为128组,每组8路。第一级缓存可以使用基于嗅探(snoop)的mesi一致性协议。应当注意的是,本示例中各级缓存的普通缓存和影子缓存的设置情况都是示意的,在实际生产过程中,设计者可以根据需要设置缓存行的大小、组数和路数,本发明对此不作任何限制。比如,设计者可以根据需要将缓存行的大小设置为4b、8b、16b、32b、64b、128b等。又比如,设计可以根据需要将同级的普通缓存和影子缓存采用相同的配置,即,采用相同的映射方式、相同的存储大小、划分为相同的组数和相同的路数。第一级缓存除普通缓存外,增设了影子缓存。第一级缓存的影子缓存的访问速度级别和第一级缓存的普通缓存相同,即,第一级缓存的影子缓存的访存速度和第一级缓存的普通缓存相当。影子缓存的每个缓存行的大小和普通缓存的缓存行一致(此时是64b)。第一级缓存的影子缓存可以进一步分为指令缓存(i-cache)和数据缓存(d-cache)。影子缓存采用全相联映射。影子缓存的指令缓存或者数据缓存的缓存行的个数例如可以是128、256、512。第一级缓存的影子缓存和处理器核心、同核心的第一级缓存的普通缓存、第二级缓存的普通缓存及主存之间可以通过片上互联网络连接,比如,共享的总线、系统总线。第二级缓存的普通缓存的大小例如可以是2mb,采用组相联映射,每个缓存行是64字节,共分为2048组,每组16路,即一组有16个缓存行。第二级缓存除普通缓存外,也增设了影子缓存。第二级缓存的影子缓存(shadowllc)的访问速度级别和第二级缓存的普通缓存相同,即,第二级缓存的影子缓存的访存速度和第二级缓存的普通缓存相当。第二级缓存的影子缓存采用全相联映射,每个缓存行的大小和普通缓存一致(此时是64b)。第二级缓存的影子缓存的缓存行的个数例如可以是2048、4096、8192。为了让缓存控制器获得装载数据到缓存行的指令的投机状态,在提交阶段通过重排序缓冲器(re-orderbuffer)向缓存控制器发送携带某条投机的访存装载指令的投机过程已经确定(投机成功或者失败)以及该指令对应的重排序索引的信息。在缓存中存储每个缓存行对应的投机状态标记。其中,投机状态标记的第一状态值指示该缓存行的数据块是由投机的访存装载指令装载进来的,投机状态标记的第二状态值指示该缓存行的数据块由非投机的访存装载指令装载进来的。比如,第一状态值例如是1,第二状态值例如是0。在缓存中存储每个缓存行对应的重排序索引标记,重排序索引标记用于指示将数据块装入该缓存行的投机的访存装载指令在重排序缓冲器中对应的重排序索引。在某个投机的访存装载指令投机成功的情况下,重排序缓冲器会向缓存控制器发送该投机的访存装载指令投机成功以及该投机的访存装载指令在重排序缓冲器内的重排序索引,以便缓存控制器根据重排序缓冲器发送的重排序索引,找到重排序索引标记内记录的值等于该重排序索引的缓存行,将该缓存行对应的投机状态标记由第一状态值修改为第二状态值且清空重排序索引标记。在该示例中,可以根据需要使某些可信数据对应的地址所在的缓存组(cacheset)被屏蔽,从而使这些缓存组不被本发明的防御机制所干扰。这样做可以保证某些可信数据的性能不受影响。比如,假设某库函数的代码对应的缓存组为111~113组,将其对应的缓存组屏蔽时,则从备选组号集合中把这几个组号给移除,则可以让这些组不受防御机制的影响。整个防御机制主要是在投机的访存装载指令的执行过程中发挥作用,所以下面围绕投机的访存装载指令的执行过程,以及各种其他情况的处理进行描述。对于投机的访存装载指令的处理过程,投机的访存装载指令会同时查询第一级缓存的普通缓存和影子缓存,在普通缓存或影子缓存中命中都认为在该级缓存命中。如果命中(hit),则处理器一切按照普通缓存和影子缓存原有的流程将数据返回。如果未命中(miss),再以相同的方式去查询第二级缓存,假设第二级缓存也未命中,则会将从主存读取的数据块装入缓存中,并标记这些数据块对应的缓存行是由投机的访存装载指令装载进来的。在该投机的访存装载指令提交(retire)之前,如果处理器再次命中该项,则缓存会延迟结果的传输,直到投机结束才会将数据返回。如果投机成功,则将该投机的访存装载指令加载的数据块所在的缓存行的投机状态标记由第一状态值修改为第二状态值且清空重排序索引标记,如果投机失败,将该投机的访存装载指令加载的数据块所在的缓存行标记为无效。此处以第一级缓存为例,如果在装入由投机的访存装载指令加载的新的数据块前,第一级缓存的普通缓存对应的缓存组已满,处理器在装入新的数据块之前,需要选择对应的缓存组的一个缓存行作为被驱逐行(victimcacheline),将该被驱逐行的数据块踢出普通缓存,在本发明中,该被驱逐行的数据块不会被踢到下一级存储介质,而会被装入第一级缓存的影子缓存中。由于第一级缓存的影子缓存采用全相联映射,其替换策略是可以是近期最少使用算法,即lru(leastrecentlyused)策略。如果此时第一级缓存的影子缓存也满了,则根据近期最少使用算法在其内选择一个缓存行将该缓存行的数据块踢到第二级缓存中。优选的,将某级的影子缓存内的数据块踢到下一级缓存时,是将该数据块踢到下一级缓存的普通缓存内。在缓存中存储用于保存随机组号的随机范围的备选组号集合;在缓存中存储用于保存随机路号的随机范围的备选路号集合,按照以下方式从该级缓存的普通缓存的所有缓存行中随机选择一个干扰缓存行:从备选组号集合中随机选择一个组号以及从备选路号集合中随机选择一个路号,将位于该组号中该路号的缓存行作为随机选择的干扰缓存行。数据处理装置还包括转译后备缓冲器,转译后备缓冲器(translationlookasidebuffer,简称tlb)内设有页表解析缓冲区,用于保存还未确定但是已经触发了页表访问的tlb请求,页表解析缓冲区中的请求会在投机的访存装置指令的投机状态确定时被提交或清除,即投机成功时,请求被提交,投机失败时,请求被清除。针对tlb的处理,以上过程涉及到的访存操作默认都是tlb命中的,也就是不会造成tlb状态被更改。如果发生tlb未命中,必然会造成已有tlb项被替换,从而有可能被基于tlb的侧信道攻击探查到。为了解决这一问题,防御机制会推迟造成tlb未命中的投机的访存装载指令的请求的执行过程,直到该指令的投机过程已确认。对于核间一致性的维护,因为第一级缓存的普通缓存和/或影子缓存是每个核心私有的,且会被处理器访问并修改,所以防御机制需要维护不同核心的普通缓存和影子缓存的一致性。其实现方法和传统缓存的一致性协议一样:对于基于嗅探的一致性协议(snoop结构),第一级缓存的普通缓存和/或影子缓存会接入缓存的总线中,接受其他核心的第一级缓存的普通缓存和/或影子缓存发出的请求;对于基于目录的一致性协议(directory结构),第一级缓存的普通缓存和/或影子缓存可以借助所在核心的缓存控制器接受或向目录(directory)发送请求,以维护缓存一致性。关于对预取(prefetch)的支持问题,现代处理器都会通过软硬件预取提升程序性能,但是由于预取会一次将大量数据装载到缓存中,所以本发明
背景技术
:部分提到的其他防御机制从运行原理或安全性上都不支持预取,而本发明的防御机制可以良好地兼容各种预取机制。对于各种软硬件的预取请求,如果它是投机的,就按投机处理,如果是非投机的,就按非投机的处理。
背景技术
:里面踢到的技术方案,都不允许在投机未确定的情况下,对投机的访存装载指令所需的数据进行预取,只有投机成功的情况下才装载其所需的数据,导致了其不支持预取,而本发明可以按照现有的技术方案对数据进行预取,因此,本发明的机制本身对预取没有任何影响,可以避免防御机制对计算效率造成过多的影响。而且,本发明还能避免预取失败引起的缓存大量无效导致的性能惩罚,另外,对于投机过程中收到外部中断或发生处理器异常,本发明也可以在指令提交时立即处理,不需要额外的机制进行数据比对或回滚,节省了开销。需要说明的是,虽然上文按照特定顺序描述了各个步骤,但是并不意味着必须按照上述特定顺序来执行各个步骤,实际上,这些步骤中的一些可以并发执行,甚至改变顺序,只要能够实现所需要的功能即可。本发明可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本发明的各个方面的计算机可读程序指令。计算机可读存储介质可以是保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以包括但不限于电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、静态随机存取存储器(sram)、便携式压缩盘只读存储器(cd-rom)、数字多功能盘(dvd)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本
技术领域
:的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术改进,或者使本
技术领域
:的其它普通技术人员能理解本文披露的各实施例。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1