CPU 将一条指令拆分为多个微操作,这适用于 x86 和 ARM 内核,也可能适用于其他几种架构。微操作可以无序执行并存储在 ROB 中。他们按顺序从此 ROB 退休。
CPU如何处理异步中断?
我想到了两种可能的实现:
- CPU 将继续执行 ROB 中已存在的所有微操作,暂时忽略即将到来的中断。
- CPU 将刷新其管道。但是,如果刷新管道,我们是否会遇到这样的情况:一条指令的某些微操作被退出,而同一指令的其他微操作则从 ROB 中被刷新?中断引发后管道中将保留哪些资源
最佳答案
中断肯定总是在指令边界上进行,即使这意味着放弃部分进度并在中断返回后重新开始执行,至少在 x86 和 ARM 微体系结构上是这样。 (有些指令是可中断的,例如rep movsb有一种更新寄存器的方法。AVX2收集也是可中断的,或者至少可以是;掩码更新规则可能只适用于遇到的同步异常一个元素)。
- Interrupting instruction in the middle of execution
- Interrupting an assembly instruction while it is operating
有一些证据表明,Intel CPU 在进行中断之前允许多一条指令退出,至少是为了分析中断(来自 PMU);这些是半同步的,但对于某些事件来说,在程序中没有必须采取的固定位置,这与必须在错误指令上发生错误的页面错误不同。
必须允许已经部分退出的多微操作指令完成执行并退出整个指令,以达到可能发生中断的下一个一致的架构状态。
(让指令在中断之前完成执行的另一个可能原因是避免饥饿。)
否则,ROB 和 RS 将被丢弃,执行将回滚到退休状态。保持较低的中断延迟通常是可取的,并且大型 ROB 可能会容纳大量缓存未命中和 TLB 未命中负载,从而导致最坏情况下的中断延迟非常糟糕,因此恶意进程可能会损害实时操作系统的功能。
关于x86 - CPU如何处理异步中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70610364/