x86 - CPU如何处理异步中断?

标签 x86 arm interrupt cpu-architecture

CPU 将一条指令拆分为多个微操作,这适用于 x86 和 ARM 内核,也可能适用于其他几种架构。微操作可以无序执行并存储在 ROB 中。他们按顺序从此 ROB 退休。

CPU如何处理异步中断?

我想到了两种可能的实现:

  1. CPU 将继续执行 ROB 中已存在的所有微操作,暂时忽略即将到来的中断。
  2. CPU 将刷新其管道。但是,如果刷新管道,我们是否会遇到这样的情况:一条指令的某些微操作被退出,而同一指令的其他微操作则从 ROB 中被刷新?中断引发后管道中将保留哪些资源

最佳答案

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


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

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

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

否则,ROB 和 RS 将被丢弃,执行将回滚到退休状态。保持较低的中断延迟通常是可取的,并且大型 ROB 可能会容纳大量缓存未命中和 TLB 未命中负载,从而导致最坏情况下的中断延迟非常糟糕,因此恶意进程可能会损害实时操作系统的功能。

关于x86 - CPU如何处理异步中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70610364/

相关文章:

c++ - 像键盘一样向 cpu 发送中断?

c++ - _mm_load_ps 导致段错误

将 x86 程序集跳转表转换为 C

assembly - 汇编零和等于之间的区别

android - 静态链接的二进制文件需要共享库 libnss

C - 按钮按下一次,注册两次 - MSP430

python - 如何在 Python 中创建动态回调函数? (RPi 3 GPIO)

arrays - 在汇编中将字符串转换为数组/结构

x86 - 如何应对平台碎片化,设备树是答案吗?

docker - 如何在 Docker 内的 M1 (ARM) 上运行 ElasticSearch v6