首页 > 资讯 > 电子杂谈

为了让CPU更好卖,英特尔将硬件变“软”了

字号: T | T
2017-06-28   浏览次数: 25
[摘要]  这是一篇极具可读性的短文,有趣地揭示了英特尔x86指令集架构(ISA)最近发生的事情。我们看到了扩展的数量和复杂度的急剧增加,及其对系统研究人员(和英特尔)产生的一些有趣的影响。我们也看到越来越多的微代码的使用模糊了

  这是一篇极具可读性的短文,有趣地揭示了英特尔x86指令集架构(ISA)最近发生的事情。我们看到了扩展的数量和复杂度的急剧增加,及其对系统研究人员(和英特尔)产生的一些有趣的影响。我们也看到越来越多的微代码的使用模糊了ISA作为硬件和软件之间的界限这一角色。

  我们认为,这些扩展现在正在逼近类似软件层面的复杂程度,但同时也包含了硬件实现的所有缺点,以及缓慢的部署周期。我们怀疑当前的路径可能是不可持续的,并假设了一个可替代的未来,最终目标是将新的ISA特性与底层硬件分离。

  过去:稳定且可控的增长

  386参考手册列出了96条指令。随着时间的推移,新的指令在诸如浮点支持,向量扩展,加密加速器,64位等领域都在不断增加。至关重要的是:

  ……过去的系统设计人员极大程度上忽略了这种变化……除了64位模式和虚拟化扩展之外,x86系统开发人员偶尔也会进行一些调整,以提高性能或纠正明显的缺点,但除此之外,其他方面都被忽略了。即使是64位模式也不会显著增加架构的复杂性……

  为什么要购买新CPU?

  随着摩尔定律的放缓,英特尔传统的两年“Tick-Tock”发展模式也在放缓。这就提出了一个显而易见的问题:

  ……如果没有微架构方面的改进,他们的CPU就不会有大幅提速,也不会有更高的效率,而且他们相同价位的CPU的核心数量与先前的CPU完全相同。为什么会有人购买新的CPU?

  如果你站在英特尔的角度思考一会儿,你就能明白为什么会有这样的麻烦。你还能做些什么可以让购买新CPU变得有吸引力呢?

  英特尔似乎正在转向的一个理由是:如果新的CPU实现了一个重要的ISA扩展——例如,软件提出了一个需求,因为它对于安全至关重要——消费者就会有一个强大的理由去升级。

  换言之,加快发布速度很可能是英特尔有意让我们继续购买的策略。结果……

  在过去的两年里,ISA的复杂性急剧地增加了(例如:在下图中,我们可以看到架构手册的大小),在此过程中有更多的扩展。

  图1:英特尔x86 CPU和ISA的复杂性的增加

  上图仍然遵循摩尔定律(注意左侧坐标轴上的对数刻度),最近公布的节奏放缓尚未出现。在手册中使用文字作为复杂性的代表,我们可以看到在2015-16年间因Skylake引入的而引起的大幅增长。

  (出于兴趣,我估计手册有200万词,平均阅读速度为每分钟200词,以每周阅读40小时计算,需要一个月才能读完,而这仅仅是为了阅读一份手册!)

  下表总结了最近的ISA扩展以及引入的新指令的数量。

  复杂性的增加不仅仅来自于新指令的数量,更重要的是来自于与现有指令的交互:

  这些最近的扩展引入了新的系统级功能,这经常改变现有指令的语义,并与其他扩展和先前的体系结构特性进行复杂的交互。

  SGX和CET示例

  鲍曼引用SGX和CET扩展作为主要例子。我们以前一定在《晨报》上看到过SGX很多次吧。

  功能强大的组合以及强大的物理安全(内存加密)使得SGX对研究人员和从业者都有吸引力……但是,SGX引入了大量的复杂性:用近200页的英文/伪代码规范描述了26条指令。

  在这200页中,有近20页专门用于介绍SGX与先前架构特征的交互。而事实证明,其中一种交互可能会破坏SGX寻求提供的安全保障。这对我来说是新鲜的,尽管我读过很多关于研究SGX系统的文章。

  如果你感兴趣的话,你可以在这里参考“防止页面错误告诉你的秘密”(CCS’16)。攻击依赖于操作系统控制下的侧面通道(因此在SGX威胁模型中被认为是攻击者的控制):页面错误。通过在几乎每条指令上诱导一个页面错误,足够的信息被泄漏出去,平均27%的密钥位可以恢复,如果使用OpenSSL和libgcrypt的加密密钥则可以恢复100%的密钥位。

  也许具有讽刺意味的是,已知的最优方法利用了与事务内存扩展的看似无意的交互:事务中止而不是页面错误,因此操作系统不能观察事务性的扩展内存访问。

  老实说,CET(控制流程执行技术)扩展听起来很酷。它通过维护影子堆栈和间接分支跟踪来防御代码重用攻击(如ROP)。影子堆栈只包含返回地址,并且无法访问正常代码。在返回的时候,来自常规和影子堆栈的地址会被弹出并进行比较——如果它们不匹配,就会有麻烦了!

  CET承诺为不安全的C / C ++代码增加强大的防御,代价是牺牲大量的架构复杂度……主要的复杂性来自于功能交互。在x86上的控制传输已经非常复杂,包括许多调用和返回的形式,比如对不同的段或特权级别的调用。总共有9条指令(其中一些有很多变体,如JMP)被CET修改。

  我们能保持这种速度吗?

  随着复杂交互的系统级特性的复杂性的快速增长,我们看到了很高的变化速度。然而,“x86语义的忠实实现对于x86兼容的处理器、虚拟机、仿真器、JIT编译器、动态翻译器、反汇编器、调试器、评测器等都是至关重要的。”

  ……我们不得不质疑,在许多实现中,x86承诺的无限向后兼容性是否可持续。

  当改进通过新的指令进行时,取得收益需要更长的时间

  第一个SGX规格发布于2013年,首颗实现它的CPU直到2015年才发货,而支持SGX的服务器级CPU仍然在2017年初出现。另外再加上充分部署的时间,那么从初始规格到广泛适用便需要10年时间。在这个周期的某个时刻,软件开发人员将能够以合理的假设来开始SGX的开发。

  这代表了软件开发人员的一个艰难的权衡;之前ISA扩展也花了很长时间部署,但是它们通常只能加速现有的功能;具有像SGX这样的功能,开发人员面临着一个严峻的选择;无限期地为安全性而等待,或者立即就部署它。

  加上这个软件的滞后,我们可能会看到,新功能的普遍开发大概需要十多年的时间。

  硬件和软件之间的界限正在变得模糊

  仔细阅读英特尔的专利,你会看到,SGX指令完全以微代码实现。如果新的ISA功能是新的微代码,那么就可以在现有的CPU上支持它们。例如,或许(许多)新指令的(性能较差的)版本可以通过这种方式实现,从而为新特性的采用提供了一个更快的途径。它的许可和收入模式是一个开放的问题(与出售新CPU的愿望的相互作用)。

  ……现在比以往任何时候都更需要重新考虑指令集的概念,它不再是硬件和软件之间的界限,而是堆栈中的另一个翻译层。



  • 打印
  • 关闭