然而,我不太理解它们之间的相似性和差异。对我来说,当它没有确定条件的值时,预测执行使用乱序执行。
混淆出现在我阅读Meltdown和Spectre的论文以及做进一步研究时。在Meltdown论文中指出Meltdown是基于乱序执行的,而一些其他资源包括维基百科关于预测执行的页面则指出Meltdown是基于预测执行的。
我希望能够澄清这一点。
然而,我不太理解它们之间的相似性和差异。对我来说,当它没有确定条件的值时,预测执行使用乱序执行。
混淆出现在我阅读Meltdown和Spectre的论文以及做进一步研究时。在Meltdown论文中指出Meltdown是基于乱序执行的,而一些其他资源包括维基百科关于预测执行的页面则指出Meltdown是基于预测执行的。
我希望能够澄清这一点。
Speculative execution是一种执行模型,其中指令可以被获取并进入流水线,并开始执行,而不确定它们是否确实需要根据程序的控制流来执行。该术语通常用于特定地指流水线执行阶段中的speculative execution。Meltdown论文在第3页上定义了这些术语:
在本文中,我们将“投机执行”解释为一种更加狭义的意义,即指在分支之后遵循的指令序列,并使用“乱序执行”这个术语来指代在处理器提交所有先前指令的结果之前执行操作的任何方式。作者在此特别指出了分支预测与执行预测分支后的指令序列在执行单元中的情况。虽然可以通过使用其他技术(如值预测和投机性内存消除)设计一个不需要任何分支预测的投机执行指令的处理器,但这将是对数据或内存依赖关系而非控制进行的投机。指令可能会被调度到一个具有不正确操作数或加载错误值的执行单元中。投机也可能发生在执行资源的可用性上,早期指令的延迟上,或者内存层次结构中特定单元中所需值的存在上。在该论文中描述的Meltdown漏洞需要同时运用到推测执行和乱序执行。然而,这个说法有些模糊,因为有许多不同的推测执行和乱序执行实现方式。Meltdown并非与任何类型的乱序或推测执行都兼容。例如,ARM11(用于树莓派)支持一些有限的乱序和推测执行,但它并不容易受到攻击。
请参阅彼得的答案以获取有关Meltdown及其其他答案的更多详细信息。
相关:超标量和乱序执行之间有什么区别?。
machine_clears.memory_ordering
:在超线程和非超线程之间共享内存位置的生产者-消费者共享的延迟和吞吐成本是多少?)
但无论如何,在确信异常情况确实会发生之前,您都不希望触发流水线刷新或任何昂贵的操作。并且您要确信您拥有正确的异常情况。例如,可能早期故障加载的加载地址还没有准备好,因此第一个执行故障加载的不一定是程序顺序中的第一个。等到退役是获得精确异常情况的一种廉价方法。从处理这种情况所需的额外晶体管来看,这种方法是便宜的,并且让通常的按顺序退役机制确定哪个异常情况发生是快速的。
在标记为退役时出现故障的指令执行后执行的无用工作会消耗少量功率,并且不值得阻塞,因为异常情况非常罕见。
这就解释了为什么首先容易受到Meltdown攻击的硬件设计是有意义的。显然,既然已经想到了Meltdown,继续这样做是不安全的。
我们不需要在故障负载之后阻止推测执行;我们只需要确保它实际上不使用敏感数据。问题不在于成功的推测负载,而是基于以下指令使用该数据来产生数据相关的微架构效应的Meltdown漏洞。(例如,基于数据触摸高速缓存线)。
因此,如果加载端口将已加载的数据屏蔽为零或其他内容,并设置退休故障标志,则执行将继续,但无法获取有关机密数据的任何信息。这应该需要大约1个关键路径门延迟,这可能在加载端口中是可能的,而不会限制时钟速度或增加一个周期的延迟。(1个时钟周期足够长,可以通过管道级别中的许多AND/OR门传播逻辑,例如完整的64位加法器)。
相关:我建议在为什么AMD处理器不/较不容易受到Meltdown和Spectre攻击?中使用相同的机制来修复Meltdown的硬件漏洞。