AMD和英特尔都悄悄地决定,是时候最终清理一些真正古老和时髦的CPU设计选择了,这些设计选择可以追溯到20世纪80年代早期的80286架构。他们正在分道扬镳,Linux的创始人Linus Torvalds最近分享了他对他们的CPU设计选择的看法。

AMD是第一个在2021年2月提出修改建议的公司:AMD监控器进入扩展( AMD Supervisor Entry Extensions)。英特尔紧随其后,在3月份推出了灵活的返回和事件传递(FRED)设计(flexible return and event delivery (FRED) design)。让Torvald产生兴趣的是,在Real World Technologies deep技术对话论坛上,有人介绍了这个话题:”x86 – why unite when you can fragment?

然而,Torvalds却不这么认为。他写道:

老实说,看起来还不错。

AMD的版本本质上是“修复异常处理定义中的已知错误”。

英特尔版本基本上是“是的,保护模式80286异常处理很糟糕,386使32位扩展更奇怪,然后sycall/sysenter使一切更糟,然后x86-64扩展引入了更多的问题。所以让我们添加一个模式,让所有的垃圾都消失。”

相比之下,AMD的one基本上只花了很小的力气就解决了所有遗留问题导致的问题。

那么,这些问题是什么呢?它们隐藏在x86架构的中断描述符表( Interrupt Descriptor Table,IDT)中。这是一个实现中断向量表的数据结构。不幸的是,它带来了许多异常问题。

根据Torvalds的说法,这些包括:

  • IDT本身是一种令人讨厌的格式,您不应该以奇怪的方式解析内存来处理异常。从80286开始,它就很糟糕,32位的解析有点困难,在x86-64中可以说更糟糕了。
  • 在返回到用户模式下,%rsp通用寄存器没有被正确地恢复。
  • 延迟调试陷阱到监督模式。
  • 几个糟糕的异常嵌套问题:不可屏蔽中断(NMI),机器检查,以及至少STI-shadow处理)。
  • gsbase (swapgs)和堆栈指针切换的各种原子性问题
  • 几个不同的异常堆栈布局,以及数百个不同的异常、中断和系统调用入口点(这甚至还没有算上没有人一开始就应该使用的调用门)。

Torvalds总结道:“但我怀疑我忘记了一些。”简而言之,现在是一团糟,而且一段时间以来情况越来越糟。

那么,解决这些问题的两种尝试都会带来什么呢?

Torvalds认为:“AMD的目标是修复全部的历史漏洞(b)-(e),但保持其他方面不变(即它在微码中添加了更多的代码,基本上取代了你目前必须在系统软件中做的一些可怕的黑客操作)。”与此同时,英特尔意识到“除了必须由系统软件解决的直接错误之外,还有更多的错误,并引入了一个‘修复异常’模型,基本上修复了上述所有问题。”

他认为这两种模型都具有积极意义。 Torvalds认为AMD的论文“看起来像是在说‘我们甚至还没有考虑完所有的细节,但我们知道这些部分已经损坏,所以我们还是发布它吧。’

英特尔FRED投入了更多工作。 Torvalds认为,这是“正确的做法。它确实将整个IDT降级为’除非有遗留的段选择器,否则我们根本不会使用它’。”摆脱真正可怕的事情,可以追溯到真正令人作呕的CPU体系架构:80286。”

Torvalds希望从长远来看,AMD和英特尔都能采用这两种方法。为什么?因为,“如果你是一个操作系统供应商,想要在操作系统级别上尽可能少地改变,并摆脱已知的问题,AMD的版本会更好。”想想‘传统的操作系统,我们无法真正做出重大改变。”然而,“如果你认为x86-64可以长期使用,Intel版本会更好,而且你实际上想要改进异常处理并加快速度,这实际上是朝着这个方向迈出了很好的一步。”

Torvalds认为,即使AMD和Intel最终不会同时采用这两种技术,“同时支持这两种技术也不是特别难”。毕竟,Torvalds得出结论:“非常明确地将Fred定义为具有全新的模型,而采用这种方式的任何操作系统供应商都仍将必须支持旧CPU的旧式异常模型。”

在实际中,我们还需要几年时间才能看到硅晶厂生产出来的芯片支持Supervisor Entry Extensions或FRED。但是,当他们这样做的那天,两者都将使操作系统内核程序员和所有其他在其计算机芯片级别工作的开发人员的工作变得更加轻松。

发表评论