在经历了两年谈英特尔·弗雷德作为全面检查特权级别(CPU环)之间转换方式的灵活返回和事件交付,现在支持代码终于可以很好地与Linux6.9内核合并。
英特尔FRED旨在实现特权级别之间更低的延迟转换和更可靠的软件使用。作为Intel的一部分,FRED也是LKGS指令,该指令已经分别嵌入到Linux内核和开源编译器中。
英特尔弗雷德取代IDT事件交付未来的英特尔处理器支持弗雷德,这是向前迈出的一大步。我们是在期待看到这段用于Linux 6.9的代码并且确实是为该合并窗口提交的。莱纳斯·托瓦尔兹今天继续进行,没有任何异议地合并了英特尔弗雷德代码。
合并将英特尔弗雷德的优势总结为:
FRED是x86上IDT事件交付的替代品,解决了IDT暴露的大多数技术噩梦:
1)嵌套异常场景中需要手动保存CR2等异常原因寄存器。
2)硬件中断堆栈切换对于嵌套异常是次优的,因为中断堆栈机制在每个条目上倒回堆栈,这需要在#NMI代码的低级条目中进行大量工作来处理这一问题。
3)来自内核或来自用户的条目之间没有硬件区别,这使得建立内核上下文比它需要的更复杂,特别是对于像NMI这样的无条件嵌套的异常。
4)IRET无条件重新启用NMI导致的NMI嵌套,这是Perf NMI在收集堆栈跟踪时出现错误时的问题。
5)返回16位段时ESP的部分恢复
6)向量空间的限制,这可能导致大系统上的向量耗尽。
7)无法区分NMI来源
弗雷德通过以下方式解决了这些缺点:
1)CPU用来保存异常原因寄存器的扩展异常堆栈框架。这确保了每个异常的元信息被保存在堆栈上,并避免了在软件中保存它的额外复杂性。
2)如果嵌套异常使用当前中断堆栈,则硬件中断堆栈切换是不倒带的。
3)内核和用户上下文的入口点是分开的,为每个CPU变量访问建立内核上下文所需的基于GS的处理在硬件中完成。
4)NMI现在是嵌套保护的。它们仅在从NMI返回时重新启用。
5)弗雷德保证完全恢复ESP
6)FRED没有刻意限制向量空间,因为它使用内核和用户空间的中央入口点,并且CPU将条目类型(异常、陷阱、中断、系统调用)与向量号一起存储在条目堆栈上。入口码必须对该信息进行多路分解,但这消除了向量空间的限制。
第一个硬件实现仍将具有当前受限的向量空间,因为取消此限制需要对本地APIC进行进一步更改。
7)FRED将向量编号和元信息存储在堆栈上,这允许在所需的本地APIC更改就位时在未来的硬件中具有多于一个的NMI向量。
Linux Enablement补丁提到了这一点英特尔弗雷德 support has so far been tested on simulators. As such it doesn't appear FRED will be supported with the likes of upcoming Intel Xeon Granite Rapids / Sierra Forest or Arrow Lake / Lunar Lake processors but like those sometime after these upcoming processors. In any event, it's great seeing this new Intel feature being enabled within the Linux kernel early as is commonly the case for their major features.