REP INSB 可以中断吗?

Eug*_*sev 4 x86 assembly interrupt ioports

REP INSB假设我在普通优先级线程中从用户模式长时间读取 PCI 设备寄存器。在执行期间,以下哪些情况可以发生,哪些情况不能发生:

  1. 中断(其他内核)
  2. 中断(同一核心)
  3. PCI 访问(其他内核)
  4. PCI 访问(相同核心 - 中断和/或不同线程)
  5. 同一核心上的上下文切换

如果答案取决于它,则假设有一个相当现代的处理器。感兴趣的是 Atom 和 Core i3。

Ros*_*dge 5

REP INSB 在每个正在执行的 INSB 指令的边界之间是可中断的。状态保存在 RCX 和 RDI 寄存器中,因此在处理中断后,指令可以在中断点恢复。

由 REP INSB 执行的各个 INSB 指令是不可中断的,是原子的,并且严格按照相对于同一核心上执行的其他指令的指令顺序执行。这种原子性意味着在 INSB 指令执行时,另一个内核或 PCI 设备无法对同一 I/O 地址执行 I/O 读取或写入。然而,另一个内核或 PCI 设备可以在每次连续执行 INSB 指令之间读取或写入相同的 I/O 地址。

其他内核上的中断对 REP INSB 指令没有影响,但它们可能会导致代码执行并最终同时访问相同的 I/O 地址。上下文切换只能在中断和异常时发生,因此可以在每个 INSB 指令的边界之间进行上下文切换。

换句话说,您需要通过互斥体或其他机制确保其他线程,无论它们运行在哪个核心上,都不能访问与 REP INSB 指令所使用的相同的 I/O 地址。禁用中断会阻止同一内核上运行的其他线程执行,但不会阻止其他线程在其他内核上运行。

事实上,您可能必须确保在执行的整个操作过程中没有其他线程访问您正在使用的设备,因为在执行 REP INSB 指令时另一个线程更改同一设备上的设备寄存器可能会导致问题。