REP INSB 是否可中断?

Is REP INSB interruptible?

假设我在一个正常优先级的线程中从用户模式做一个长时间的 REP INSB 读取 PCI 设备寄存器。在它执行期间可以发生什么,不能发生什么:

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

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

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

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

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

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

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