assembly 在执行过程中中断指令

lo8azlld  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(150)

假设CPU正在运行一条汇编指令,比如FOO,它将在几个时钟周期内执行(例如10)
中断请求刚好在执行FOO的过程中发出,处理器需要中断。它是否等待命令正确执行,或者FOO是否中止并将重新启动?它的行为是否因中断优先级的不同而不同?

4szc88ey

4szc88ey1#

CPU可以选择执行其中一项,即决定相对于原始指令流何时处理中断。
在AMD和Intel的当前实现中,已经发出但尚未分派到执行单元的指令被取消。When an interrupt occurs, what happens to instructions in the pipeline?
在无序执行的情况下,通常有几十条指令在运行,并且一次在ALU中执行的指令实际上可能不止一条。
但一个有趣的问题是,是否允许addimul等已开始执行但尚未失效的低延迟指令完成并更新中断处理程序看到的体系结构状态。
如果没有,可能是因为难以构建逻辑来检测在当前的引退状态之后还有多少连续指令将准备好"很快"引退。(最坏情况下每千个指令一个,或者具有低I/O负载的每百万个指令一个),因此,在中断处理时压缩更多的周围代码吞吐量的好处是很小的。2任何潜在的中断延迟代价都是不利的。

    • 某些指令,尤其是微代码指令,具有无需从头开始重新启动即可中断的机制。**例如
  • rep movsb可以使RSI、RDI和RCX在复制过程中保持更新状态(因此它将在重新启动时完成复制)。其他REP字符串指令也可以类似地被中断。只有操作的单个计数相对于中断是原子的。

即使在调试器中单步执行(通过设置TF),CPU也会在每次计数后中断,因此从中断PoV来看,它实际上是在重复单独的movsb指令RCX次。

  • AVX2集合(如vpgatherdd)有一个输入掩码向量,显示哪些元素要收集,哪些元素要忽略。它在成功收集相应索引后清除掩码元素。出现异常时(如缺页),出错元素是最右边的元素,其掩码仍然设置(不保证收集顺序,但保证出错顺序,请参阅英特尔的手册条目)。

这使得一次收集可以成功,而不需要同时Map所有相关的页面。在分页到另一个元素的同时收回一个已经收集的元素不会导致无限循环,即使在内存压力很大的情况下也是如此。向前的进度是有保证的。
在异步中断时,硬件可以类似地使收集部分完成,使用掩码记录进度。IDK(如果任何硬件实际上这样做的话),但ISA设计使该选项保持开放。
无论如何,这就是为什么您需要在循环中为每次聚集创建一个新的全1遮罩。
AVX512聚集和散射具有相同的机制,但使用掩码寄存器而不是矢量寄存器。http://felixcloutier.com/x86/VPSCATTERDD:VPSCATTERDQ:VPSCATTERQD:VPSCATTERQQ.html

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

因此,使用WBINVD指令可能会影响逻辑处理器中断/事件响应时间.
这可能就是为什么它是一个特权指令,用户空间可以做很多事情来使系统变慢(例如耗尽大量存储器带宽),但是它不能太显著地增加中断延迟。(已经从ROB退出但尚未提交到L1d的存储可能会增加中断延迟,因为它们必须发生并且不能被中止。但是,创建大量分散的高速缓存未命中存储的病态情况是很困难的,而且存储缓冲区的大小也很小。)
相关:

相关问题