CPU 如何处理异步中断?

How does a CPU handle asynchronous interrupts?

CPUs 将一条指令拆分为多个微操作,这适用于 x86 和 ARM 内核以及可能的其他几种体系结构。微操作可以乱序执行并存储在 ROB 中。他们从这个 ROB 中按顺序退休。

CPU 如何处理异步中断?

我想到了 2 种可能的实现方式:

  1. CPU 将继续执行已经在 ROB 中的 all 微操作,暂时忽略即将到来的中断。
  2. CPU 将刷新其管道。但是,如果流水线被刷新,我们是否会面临这样的情况:一条指令的一些微操作被淘汰,而同一指令的其他微操作从 ROB 中被刷新?中断引发后,哪些资源将保留在管道中

中断肯定总是发生在指令边界上,即使这意味着在中断 return 之后放弃部分进度并重新开始执行,至少在 x86 和 ARM 微架构上是这样。 (有些指令是可中断的,例如 rep movsb 有一种更新寄存器的方法。AVX2 集合也是可中断的,或者至少是可中断的;掩码更新规则可能只适用于在一个元素上遇到的同步异常)。

  • Interrupting an assembly instruction while it is operating

有证据表明 Intel CPU 在接受中断之前让一条指令退出,至少是为了分析中断(来自 PMU);这些是半同步的,但对于某些事件,它们在程序中没有固定的位置,这与必须在错误指令上出错的页面错误不同。

必须允许已经部分退出的多 uop 指令完成执行并退出整个指令,以达到可能发生中断的下一个一致的体系结构状态。

(在接受中断之前让指令完成执行的另一个可能原因是为了避免饥饿。)

否则是,丢弃ROB和RS,执行回滚到退休状态。保持较低的中断延迟通常是可取的,一个大的 ROB 可以容纳大量缓存未命中和 TLB 未命中负载,使得最坏情况下的中断延迟非常糟糕,因此恶意进程可能会损害实时 OS.

  • When an interrupt occurs, what happens to instructions in the pipeline?
  • Estimating of interrupt latency on the x86 CPUs
  • (可能)提到性能事件采样。