在执行过程中中断指令

时间:2018-12-08 21:32:28

标签: assembly x86 interrupt

假设CPU正在运行一个汇编指令,例如FOO,该指令将在多个时钟(例如10个时钟)中执行

正在执行FOO的过程中出现了一个中断请求,处理器需要中断。它会一直等到正确执行命令还是FOO被中止并重新启动?考虑到不同类型的中断优先级,它的行为是否有所不同?

1 个答案:

答案 0 :(得分:7)

CPU可以选择执行任一操作,即确定相对于原始指令流处理中断的时间。

已经发布但尚未调度到执行单元的insnins在AMD和Intel的当前实现中被取消。 When an interrupt occurs, what happens to instructions in the pipeline?

在无序执行的情况下,通常会有数十条指令在执行中,并且实际上一次执行ALU的中间可能有多个指令。

但这是一个有趣的问题,是否允许已开始执行但尚未退休的addimul之类的低延迟指令来完成并更新中断处理程序看到的体系结构状态是否。

如果没有,那可能是因为难以建立逻辑来检测超出当前退出状态的更多相邻指令准备“很快”退出的逻辑。中断很少见(最坏的情况下,每千条指令之一,或者I / O负载低的情况下,每百万条指令中的一条),因此围绕中断处理压缩更多周围代码吞吐量的好处很低。而且任何潜在的中断延迟成本都是不利的。


某些指令,尤其是微指令,具有无需重新启动即可被中断的机制。例如

  • rep movsb可以使RSI,RDI和RCX更新到复制的中途(因此它将在重新启动时完成复制)。其他REP字符串指令也可以类似地中断。对于中断,只有一个操作是原子操作。

  • vpgatherdd这样的AVX2聚集具有一个输入掩码向量,该向量显示了要聚集与忽略哪些元素。成功收集对应的索引后,它将清除蒙版元素。在例外情况下(例如页面错误),故障元素是最右侧的元素,其掩码仍设置(不能保证聚集顺序,但是可以确定故障顺序,请参阅英特尔手册)。

    这使得收集成功而无需同时映射所有相关页面成为可能。即使在内存压力大的情况下,在另一个页面中分页时逐出一个已经聚集的元素也不会导致无限循环。保证前进。

    在异步中断上,硬件同样可以使用掩码记录进度,部分完成收集。 IDK(如果有的话)实际上是由硬件完成的,但是ISA设计使该选项保持打开状态。

    无论如何,这就是为什么您需要为每个聚集在循环内继续创建一个新的全罩蒙版的原因。

    AVX512聚集和分散具有相同的机制,但是使用掩码寄存器而不是向量寄存器。 http://felixcloutier.com/x86/VPSCATTERDD:VPSCATTERDQ:VPSCATTERQD:VPSCATTERQQ.html


非常慢的指令没有,用于中断和重新启动的机制包括wbinvd。 (将所有缓存同步到主内存并使它们无效)。 英特尔手册中提到wbinvd确实会延迟中断。

  

因此,使用WBINVD指令可能会对逻辑处理器的中断/事件响应时间产生影响。

这可能就是为什么它是特权指令的原因。用户空间可以做很多事情来使系统变慢(例如,占用大量内存带宽),但不能太大地增加中断延迟。 (已经从ROB退役但尚未提交到L1d的存储可能会增加中断延迟,因为它们必须发生并且不能中止。但是,造成大量分散的高速缓存未命中存储正在运行的病理情况很难。)< / p>