一、背景
FRED,Flexible Return and Event Delivery。即灵活返回与事件交付。它是Intel公司提出的全新中断/异常处理架构。其核心目的就是彻底替代传统的、已沿用数十年的中断和异常处理机制——即通过中断描述符表(IDT)交付事件,并通过IRET指令从中断返回。它是一种全新架构变革,旨在从根本上解决传统机制的局限。
传统的IDT机制,在长期的应用过程中,暴露出来了不少的问题。主要有:
- 特权级切换的开销浪费
每次的中断或异常都需要在用户态(Ring3)和内核态(Ring0)间进行全面的切换,涉及到大量的的寄存器的保存和恢复处理 - 上下文的冗余保存
同样,切换时还需要对SS,RSP等寄存器进行压栈处理,其中存在着信息冗余 - 边缘场景的情况复杂
中断发生的场景复杂,可能在用户态或内核态及相应的不同特权等级等。这些组合往往需要单独的处理 - 有安全隐患
中断处理的路径传输过长,复杂的状态控制有可能导致侧信道攻击 - 虚拟化支持的开销大
传统的x86平台虚拟化的中断事件传递路径太长,导致hypervisor的性能产生瓶颈 - 对内核开发者不友好
中断过于复杂,导致开发者对中断或异常的上下文处理变得过于复杂,很容易出错
在CPU发展陷入瓶颈,外部增长乏力的情况下,对内部架构进行下手,或许是一个好的方式。所以Intel推出FRED,应该是一种必然的现象。而事实也证明,这个性能是不错的,AMD也已经同意引入这项技术。
二、核心架构
Intel FRED的设计思想是将所有事件(如中断、异常及系统调用等)统一为“事件交付”模型(这是不是有点Epoll的味道)。它不再通过传统的256个中断向量的IDT表进行分发处理。转而将事件分为几大类。引入了新的事件栈级别,替代了传统的特权级切换。为保证安全,提供了事件的原子交付机制,消除了中间态。从而进一步降低了上下文存储的信息,更容易分析和理解。
FRED的事件为分四类即外部硬件中断(External Interrupt),如定时器、网卡、键盘等中断;CPU异常(Exception),如页错误、除零、非法指令;系统调用(System Call),如用户态请求的内核接口服务等;其它(other event),如NMI、VM Exit等。在这些事件的类型中,一般携带着事件类型标识、向量号、事件数据及级别。
FRED的事件栈有四个级别,分别是0~3.即:
- Event Stack Level 3:最低优先级/用户态事件
- Event Stack Level 2:系统调用等
- Event Stack Level 1:普通中断/异常
- Event Stack Level 0:最高优先级/嵌套处理)
上述的每个栈级别中对应着专门的RSP值,当事件发生时,硬件会根据事件级别自动选择对应的栈级别。特殊的嵌套事件会自动在更低级别是的栈上处理,不需要软件手动处理。从而在整体了避免了传统的IDT模型中的物权级的复杂判断。
为了实现FRED的功能,Intel引入了新的返回指令ERETS(Event Return to Same level)和ERETU(Event Return to User level)。前者用来替代从事件返回到同一栈级别的操作;后者用来处理事件返回到用户态的操作。这两条指令是原子操作,不存在中间状态,不需要 IRET机制中的对标志寄存器和段寄存等的手动处理。它自动对状态信息进行了脱敏,提高了安全性。
其基本的流程为:
事件触发->硬件自动确定事件类型/栈级别->切换到对应级别栈->压栈(精简的上下文)->跳转到统一入口点->处理完成-> ERETS/ERETU原子返回->恢复执行。
整体上来看,FRED机制消除了传统的IDT表的查询、门描述符的读取以及TSS栈切换处理。直接由硬件确定目标栈的级别,更标准的上下文格式。实现了返回操作的原子化,杜绝了中间状态。
三、优势
Intel FRED中断优化,从目前来看,经过Linux内核开发者的评估,有望大幅提高处理速度。在实际的io_uring基准测试中,FRED带来了高达2倍的性能提升。其主要的优势体现在:
- 更低延迟的权限级切换
由于大幅的减少了相关的流程,使得中断延迟大大减少。同时减少了缓存冲突以及多核中断的协同处理机制 - 两级事件分发逻辑
其采用基于事件类型和基于事件向量的两级分发机制,既保留应用了原有的硬件中断向量又提供了供操作系统进行软件分发的向量表,增加了灵活性和可扩展性 - 更强的软件健壮性
除了修复了传统的NMI阻塞等问题外,还提供了完整的用户态和内核态的上下文信息 - 更丰富的事件信息
通过增加位图机制提供事件的来源信息,解决了传统方式中共用向量导致的信息不完整的情况 - 开发的友好性
由于统一了事件模型,不再需要分别对中断等进行编写不同的入口代码。同时精简的内核代码也让内核更容易维护并减少了开发的复杂度
四、软硬件支持及生态
Intel FRED是一个不错的机制,但需要说明的是,在目前的商用量产处理器中,尚未支持。大家可以认为这是软件生态提前建立的一个情况。在前面的Linux7.1分析中已经可以看到,内核中已经对其进行了支持。但Windows的内核尚未公布对其进行了支持,不过据说正在推进。而各种虚拟机管理器软件如KVM等也都在开发过程中,尚未正式推出解决方案。
而对于硬件来说,AMD的量产处理器估计得到2026年年底或明年才可能全面支持。不过支持了FRED机制的Intel的商用处理器台Panther Lake已经发布。
五、总结
技术的发展就是这样,从外延的不断扩展再到内涵的不断提高。它们互相影响,互相促进。不能说哪个更好,只能说二者都是技术发展的一个方向。它们在动态的互相影响中不断的推动着新技术的普及和应用。